1、【Spring Cloud组件】服务发现 —— Netflix Eureka

说明

根据官网的介绍,Eureka是 Netflix 项目下的服务治理模块,是一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。2018年,Netflix 宣布 Eureka2.x 组件不再进行开源有关的开发了,让无数开发者感到扼腕和惊讶啊,但作为 Spring Cloud 曾经默认的服务注册中心,还是有必要了解一下这个组件的原理。

Eureka工作原理

Eureka的架构也很简单,是一种C/S架构,有两部分组成:Eureka Client 和 Eureka Server。其中服务的提供者、服务的消费者本质上都属于Eureka Client,而Eureka Server 则作为注册中心使用,架构如下图所示:

服务的提供者Provider

1、服务注册(Register):将自身注册到Eureka Server注册中心,提供了包括 IP 地址、端口,URL等元数据信息。

2、服务续约(Renew):Provider也是一种 Eureka Client,客户端会连接Eureka Server并以30s周期维持心跳连接,这种方式叫做服务续约,在多个心跳周期内Eureka Server收不到客户端的续约(默认90秒),Eureka Server会将该实例从注册表中剔除,维持心跳的周期以及心跳检查间隔均可配置,参考如下:

# 心跳连接周期,默认为30秒
eureka.instance.lease-renewal-interval-in-seconds=30
# 心跳检查时间,默认90秒
eureka.instance.lease-expiration-duration-in-seconds=90

3、服务下线(Canel):系统运行中可能会面临 关闭 或 重启 服务某个实例的情况,在服务关闭期间,我们不希望客户端会继续调用关闭的服务实例。服务实例进行正常关闭操作时,它会触发一个服务下线的REST请求Eureka Server,注册中心收到请求时,服务端将该服务状态置为下线(DOWN),同时把该下线事件传播到其他注册中心。

服务的消费者Consumer

1、获取服务注册表(Get Registry):Consumer也是一种 Eureka Client,从服务器获取注册表信息,并将其缓存在本地,该注册列表信息会定期(每30秒钟)更新一次,客户端会使用该信息查找其他服务,从而进行远程调用。Consumer从注册中心获取服务注册表信息通常有如下配置:

# 启用服务消费者从注册中心拉取服务列表的功能
eureka.client.fetch-registry=true
# 设置服务消费者从注册中心拉取服务列表的间隔
eureka.client.registry-fetch-interval-seconds=30

2、远程调用(Remote Call):Consumer在获取服务清单后,通过 服务别名 来获得提供服务的实例名和该实例的元数据信息。如果 Provider 有多个时,Consumer会使用 Ribbon 自动进行负载均衡。

注册中心Eureka Server

Eureka Server扮演注册中心的角色,对外提供三个功能:为Provider注册服务、向Consumer提供注册表、Eureka Server节点间的同步。

1、Eureka 集群

这里,说一下 Eureka 集群原理。Eureka Server 集群相互之间通过 Replicate 来同步数据,相互之间不区分主节点和从节点,所有的节点都是平等的,节点通过彼此互相注册来提高可用性。如果某台 Eureka Server 宕机,Eureka Client 的请求会自动切换到新的 Eureka Server 节点。当宕机的服务器重新恢复后,Eureka 会再次将其纳入到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会进行节点间复制,将请求复制到其它 Eureka Server 当前所知的所有节点中。Eureka Server 集群之间的状态是采用异步方式同步的,所以不保证节点间的状态一定是一致的,不过基本能保证最终状态是一致的。

2、自我保护机制

此外,Eureka Server还存在自我保护机制。默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:

  • Eureka 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务;

  • Eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用);

  • 当网络稳定时,当前实例新的注册信息会被同步到其它节点中。

Eureka 自我保护机制是为了防止误杀服务而提供的一个机制。当个别客户端出现心跳失联时,则认为是客户端的问题,剔除掉客户端;当 Eureka 捕获到大量的心跳失败时,则认为可能是网络问题,进入自我保护机制;当客户端心跳恢复时,Eureka 会自动退出自我保护机制。通过如下配置开启自我保护机制:

eureka.server.enable-self-preservation=true

Eureka的使用流程

实际中会使用Eureka的集群来进行开发部署,这里梳理下使用流程:

1、先启动 Eureka Server,等待服务提供者注册服务。Eureka Server的配置如下 :

# 1.引入eureka server依赖:
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-eureka-server</artifactId>
   </dependency>

# 2.在yml文件进行eureka配置:(以3个集群为例)
server:
  port: 7001
eureka:
  instance:
    hostname: eureka7001.com # eureka服务端的实例名称
  client:
    register-with-eureka: false # false表示不向注册中心注册自己。
    fetch-registry: false # false表示自己是注册中心,只是维护服务实例并不需要去检索服务
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ # Eureka Server集群需要相互注册,各个节点间通过Replicate同步信息 

# 3.7002和7003的eureka配置类似

2、再启动 Provider,作为客户端会向注册中心注册服务,并通过30s的心跳维持着与 Eureka Server 的连接,当多个心跳周期后 Eureka Server 仍无法连接客户端,则会在注册表中删除该服务实例,如果有多个Provider,则接着启动。Provider的配置如下 :

# 1.引入微服务Privoder 相关依赖:(其他的微服务Privoder也是这样)
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-eureka</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-config</artifactId>
   </dependency>

# 2.在yml文件进行配置:(其他的微服务Privoder也是这样,注意端口号不一样)
server:
  port: 8001
spring:
  application:
    name: cloud-privoder1-service # 微服务名称
eureka:
  client: #客户端注册进eureka服务列表内
    register-with-eureka: true  # 表示向注册中心注册。
    fetch-registry: true # 从注册中心抓取自己的注册信息,集群版必须为true才能配合ribbon进行自动负载均衡
    service-url: 
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka # 集群版

3、最后启动 Consumer,同样作为客户端会向注册中心获取服务注册表, 同时缓存一份服务注册表到本地;根据服务注册表的信息,发起服务调用,调用时先从本地缓存寻找调用服务名,找不到会去注册中心重新获取服务注册表,并同步到本地缓存。Consumer的配置如下 :

# 1.引入Consumer相关依赖:
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-eureka</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-config</artifactId>
   </dependency>

# 2.在yml文件进行配置:
server:
  port: 80
spring:
  application:
    name: cloud-consumer-service # 微服务名称
eureka:
  client: #客户端注册进eureka服务列表内
    register-with-eureka: true  # 表示向注册中心注册。
    fetch-registry: true # 从注册中心抓取自己的注册信息,集群版必须为true才能配合ribbon进行自动负载均衡
    service-url: 
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka # 集群版

参考:

【不积硅步无以至千里,点滴付出终将有所收获,共同进步吧~】

猜你喜欢

转载自blog.csdn.net/qq_29119581/article/details/112298512