百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

SpringCloud五大神兽之Eureka

bigegpt 2024-08-07 17:38 3 浏览

注册中心概述

什么是注册中心?

相当于服务之间的‘通讯录’,记录了服务和服务地址之间的映射关系。在分布式架构中服务会注册到这里。当服务需要调用其他服务时,就在注册中心找到其他服务的地址,进行调用

注册中心的主要作用?

注册中心一般有以下的功能:

  1. 服务发现服务注册/反注册:保存服务提供者和调用者的关系服务订阅/取消订阅:服务调用者订阅服务提供者的信息服务路由:筛选整合服务提供者
  2. 服务配置配置订阅:服务提供者和消费者订阅微服务相关的配置配置下发:主动将配置推送给提供者和消费者
  3. 服务健康检测检测服务提供者的健康情况

Eureka

Eureka是SpringCloud微服务架构中常用的注册中心,其架构图如下:

由其架构图可以看出,Eureka可以分为三部分:Eureka服务端,Eureka服务提供者,Eureka服务消费者。

其中Eureka服务端需要作为独立的服务运行,而服务提供者、消费者则是需要使用EurekaClient嵌入我们自己的服务中。

其运行原理是这样的:

  1. 当服务提供者启动时,会向注册中心发送请求,在注册中心注册实例。并且每隔一段时间向注册中心发送心跳,注册中心会保存实例和地址的映射关系
  2. 当服务消费者启动时,会从注册中心拉去所有的注册信息,并缓存起来。当需要调用某一个服务时。根据缓存的注册信息直接调用服务

聪明的你这个时候会察觉到。既然消费者使用的是缓存的注册信息。那么一定会存在一种情况就是服务提供者这边已经宕机。这个时候消费者根据缓存的信息没有及时更新就会导致调用失败,Eureka是怎么解决这个问题的呢?且往下看。

服务端的搭建

  1. 创建工程,导入坐标

这里推荐使用 Spring Initializer 直接创建。选择 web 和 euraka 即可。主要引入的依赖如下:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
  1. 配置 application.yml ,说明见注释
server:
  port: 9000
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false # 是否将自己注册到注册中心
    fetch-registry: false # 是否从Eureka中获取注册信息
    service-url: # Eureka Client 的请求地址
      defaultZone: http://#{eureka.instance.hostname}:#{server.port}/eureka/
  1. 配置启动类

启动类除了常规的 @SpringBootApplication 外,还要添加 @EnableEurekaServer 表示开启 Eureka 服务

  1. 启动项目,浏览器访问 localhost:9000 出现以下页面即表示服务搭建成功

注册服务到Eureka

  1. 在要注册的工程中导入Eureka Client的坐标
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  1. 在 application.yml 中配置Eureka服务端的地址:

这里需要特别注意: Eureka客户端配置的服务端地址使用的key是 defaultZone,不是 default_zone 如果写错会导致客户端无法注册服务,进而导致客户端无法启动

server:
  port: 9001
spring:
  application:
    name: SERVICE_PROVIDER # 服务名称
  datasource:
    url: jdbc:mysql://192.168.25.128:3306/mysql?characterEncoding=UTF-8&useSSL=false&serverTimezone=CTT
    driver-class-name: com.mysql.cj.jdbc.Driver
    password: 521
    username: keats
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/ # 刚刚在Eureka Server 配置的请求地址
    register-with-eureka: true # 注册到注册中心
    fetch-registry: false # 作为服务提供者,可以不用从Eureka获取注册信息。视实际情况而定
  instance:
    prefer-ip-address: true # 使用IP地址注册
  1. 在启动类加上 @EnableEurekaClient 注解(SpringCloud Finchley.RELEASE 版本及之后的版本会在项目中引入EurekaClient依赖后自动开启,我们使用的是最新版。因此也可以不用添加)

Euraka 客户端默认每隔 30 S向服务端发送一次心跳请求,如果服务端 90 S没有收到某客户端发送的请求将视为客户端宕机。会将其从服务列表剔除

消费者获取和使用服务

搭建服务消费者和提供者的步骤类似,首先是添加 eureka-client 依赖

之后配置 application.yml 如下:

server:
  port: 9002
spring:
  application:
    name: SERVICE_CONSUMER # 服务名称
eureka:
  client:
    service-url: # 刚刚在Eureka Server 配置的请求地址
      defaultZone: http://localhost:9000/eureka/
    fetch-registry: true
    register-with-eureka: false

这样该服务就具备了从Eureka获取服务的能力,那具体怎么使用呢?

Spring 为我们提供了一个Bean:DiscoveryClient (注意需要导入:org.springframework.cloud.client.discovery 包下的DiscoveryClient 而不是 netflix 包下的类)

我们在需要获取服务的类里面注入该类

@Autowired
private DiscoveryClient discoveryClient;

接着调用其 getInstances(String instancdName) 方法,通过服务的名称获取服务列表。我们这里只注册了一个服务提供方没有搭集群所以直接使用列表第0位的服务实体。而实体提供了 getUri() 方法用于获取服务提供者的 url。接着我们用该方法替换硬编码的 url 即可完成 Eureka 的使用。核心代码如下:

网上的很多其他教程在这里使用的都是 getHost() + ":" + getPort() 拼接,推测可能是版本比较老旧。新API既然已经提供了 getUri() 方法我们就要积极使用。 这里建议读者们在使用某Bean的方法时通过打点的方式阅读一下其开放的API,大概了解一下

@GetMapping("teacher/users")
public List<User> getAllUser(){
    List<ServiceInstance> service_provider = discoveryClient.getInstances("SERVICE_PROVIDER");
    ServiceInstance serviceInstance = service_provider.get(0);

    return restTemplate.getForObject(serviceInstance.getUri() + "/api/v1/users", List.class);
}

Eureka的自我保护

如上图提示,表示Eureka进入了自我保护模式。自我保护模式的介绍如下:

Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否高于 85%,如果高于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期。在我看来可以用一句古成语来形容这种模式---“三人成虎” 即当越来越多的服务提供者心跳不能到达时。Eureka开始不在怀疑是提供者GG,而怀疑自己了!

在开发环境中,我们往往启动一个Eureka服务 + 一个 Eureka 提供者,如果此时提供者正好出了问题。90S未发送心跳。但由于满足自我保护条件(这段时间失败比例为100%),Eureka不会将服务剔除。会直接导致服务消费者无法正确获取服务。 因此开发环境中建议关闭其自我保护机制,而在生产环境打开之 , yml 配置如下:

eureka:
  server:
    enable-self-preservation: false # 关闭自我保护

相关推荐

【Docker 新手入门指南】第十章:Dockerfile

Dockerfile是Docker镜像构建的核心配置文件,通过预定义的指令集实现镜像的自动化构建。以下从核心概念、指令详解、最佳实践三方面展开说明,帮助你系统掌握Dockerfile的使用逻...

Windows下最简单的ESP8266_ROTS_ESP-IDF环境搭建与腾讯云SDK编译

前言其实也没啥可说的,只是我感觉ESP-IDF对新手来说很不友好,很容易踩坑,尤其是对业余DIY爱好者搭建环境非常困难,即使有官方文档,或者网上的其他文档,但是还是很容易踩坑,多研究,记住两点就行了,...

python虚拟环境迁移(python虚拟环境conda)

主机A的虚拟环境向主机B迁移。前提条件:主机A和主机B已经安装了virtualenv1.主机A操作如下虚拟环境目录:venv进入虚拟环境:sourcevenv/bin/active(1)记录虚拟环...

Python爬虫进阶教程(二):线程、协程

简介线程线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能...

基于网络安全的Docker逃逸(docker)

如何判断当前机器是否为Docker容器环境Metasploit中的checkcontainer模块、(判断是否为虚拟机,checkvm模块)搭配学习教程1.检查根目录下是否存在.dockerenv文...

Python编程语言被纳入浙江高考,小学生都开始学了

今年9月份开始的新学期,浙江省三到九年级信息技术课将同步替换新教材。其中,新初二将新增Python编程课程内容。新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法按照教材...

CentOS 7下安装Python 3.10的完整过程

1.安装相应的编译工具yum-ygroupinstall"Developmenttools"yum-yinstallzlib-develbzip2-develope...

如何在Ubuntu 20.04上部署Odoo 14

Odoo是世界上最受欢迎的多合一商务软件。它提供了一系列业务应用程序,包括CRM,网站,电子商务,计费,会计,制造,仓库,项目管理,库存等等,所有这些都无缝集成在一起。Odoo可以通过几种不同的方式进...

Ubuntu 系统安装 PyTorch 全流程指南

当前环境:Ubuntu22.04,显卡为GeForceRTX3080Ti1、下载显卡驱动驱动网站:https://www.nvidia.com/en-us/drivers/根据自己的显卡型号和...

spark+python环境搭建(python 环境搭建)

最近项目需要用到spark大数据相关技术,周末有空spark环境搭起来...目标spark,python运行环境部署在linux服务器个人通过vscode开发通过远程python解释器执行代码准备...

centos7.9安装最新python-3.11.1(centos安装python环境)

centos7.9安装最新python-3.11.1centos7.9默认安装的是python-2.7.5版本,安全扫描时会有很多漏洞,比如:Python命令注入漏洞(CVE-2015-2010...

Linux系统下,五大步骤安装Python

一、下载Python包网上教程大多是通过官方地址进行下载Python的,但由于国内网络环境问题,会导致下载很慢,所以这里建议通过国内镜像进行下载例如:淘宝镜像http://npm.taobao.or...

centos7上安装python3(centos7安装python3.7.2一键脚本)

centos7上默认安装的是python2,要使用python3则需要自行下载源码编译安装。1.安装依赖yum-ygroupinstall"Developmenttools"...

利用本地数据通过微调方式训练 本地DeepSeek-R1 蒸馏模型

网络上相应的教程基本都基于LLaMA-Factory进行,本文章主要顺着相应的教程一步步实现大模型的微调和训练。训练环境:可自行定义,mac、linux或者window之类的均可以,本文以ma...

【法器篇】天啦噜,库崩了没备份(天啦噜是什么意思?)

背景数据库没有做备份,一天突然由于断电或其他原因导致无法启动了,且设置了innodb_force_recovery=6都无法启动,里面的数据怎么才能恢复出来?本例采用解析建表语句+表空间传输的方式进行...