Eureka细节详解

Eureka元数据详解

Eureka的元数据有两种,标准元数据和自定义元数据。
标准元数据:主机名、IP地址、端口号等信息。这些信息都会被发布在服务注册表中,用于服务之间的调用。
自定义元数据:可以使用 eureka.instance.metadata-map 配置,符合 KEY/VALUE 存储格式。
这些元数据可以在远程客户端中访问。

  1. eureka:
  2. instance:
  3. prefer-ip-address: true
  4. metadata-map:
  5. # 自定义元数据(kv自定义)
  6. cluster: cl1
  7. region: rn1
  1. @Autowired
  2. private DiscoveryClient discoveryClient;
  3. @Test
  4. public void test() {
  5. // 从EurekaServer获取指定微服务实例
  6. List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("lagou-service-resume");
  7. // 循环打印每个微服务实例的元数据信息
  8. for (int i = 0; i < serviceInstanceList.size(); i++) {
  9. ServiceInstance serviceInstance = serviceInstanceList.get(i);
  10. System.out.println(serviceInstance);
  11. }
  12. }

元数据如下:
image.pngimage.png

Eureka客户端详解

服务提供者和服务消费者都为Eureka客户端。需要向EurekaServer注册服务。
服务提供者需完成服务续约(心跳)、注册服务操作。

服务注册(服务提供者)

(1)导入 eureka-client 依赖坐标,配置Eureka服务注册中心地址。
(2)服务在启动时会向注册中心发起注册请求,携带服务元数据信息。
(3)Eureka注册中心会把服务的信息保存在Map中。

服务续约(服务提供者)

服务每隔30秒会向注册中心续约(心跳)一次(也称为报活),如果没有续约,租约会在90秒后到期,然后服务就会失效。
每隔30秒的续约操作称之为心跳检测。

  1. #向Eureka服务中⼼集群注册服务
  2. eureka:
  3. instance:
  4. # 租约续约间隔时间,默认30秒
  5. lease-renewal-interval-in-seconds: 30
  6. # 租约到期,服务时效时间,默认值90秒,服务超过90秒没有发⽣⼼跳,EurekaServer会将服务从列表移除
  7. lease-expiration-duration-in-seconds: 90

获取服务列表(服务消费者)

每隔30秒服务会从注册中心拉取一份服务列表,这个时间可以通过配置修改。

  1. #向Eureka服务中⼼集群注册服务
  2. eureka:
  3. client:
  4. # 每隔多久拉取⼀次服务列表
  5. registry-fetch-interval-seconds: 30

(1) 服务消费者启动时,会从Eureka Server服务列表中获取只读备份,缓存到本地;
(2)每隔30秒,会重新获取并更新数据;
(3)每隔30秒的时间,可以通过配置 eureka.client.registry-fetch-interval-seconds 修改。

Eureka服务端详解

服务下线

(1)当服务正常关闭操作时,会发送服务下线的rest请求给EurekaServer。
(2)服务中心接受请求后,将该服务置为下线状态。

失效剔除

Eureka Server会定时进行检查(通过配置间隔值: eureka.server.eviction-interval-timer-in-ms ,默认为 60s ),如果发现客户端实例在一定时间内没有发送心跳(客户端配置的 eureka.instance.lease-expiration-duration-in-seconds ,默认值为 90s ),则会注销实例。

自我保护

服务提供者会向服务注册中心注册自己,并会在每隔30s向注册中心发送心跳进行报活(心跳检测)操作。
但是,如果在心跳检测过程中,假如服务提供者和注册中心之间的网络存在问题(不代表服务提供者不可用,不代表服务消费者无法访问到服务提供者),导致在15分钟内85%的客户端节点没有正常的心跳,那么Eureka就会认为客户端与注册中心出现了网络故障,Eureka Server就会自动进入自我保护机制。

为什么会有自我保护机制: 默认情况下,如果Eureka Server在一定时间内(默认90秒)没有收到某个微服务实例的心跳,Eureka Server将会移除该实例。 但是当网络分区故障发生时,微服务与Eureka Server之间是无法通信,但是微服务本身是正常运行,此时不应该移除这个微服务,所以引入了自我保护机制。

当处于自我保护模式时,服务注册中心页面会显示如下提示信息:
image.png
当处于自我保护模式时,
(1)不会剔除任何服务实例(可能是服务提供者和EurekaServer之间的网络问题),从而保证大多数服务依然可用。
(2)Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上,保证当前节点依然可用。当网络稳定时,当前Eureka Server新的注册信息会被同步到其他的节点上。
(3)在Eureka Server工程的中可以通过配置 eureka.server.enable-self-presevation 自我保护的关闭,默认是打开的。(建议生产环境中打开自我保护机制)。

  1. eureka:
  2. server:
  3. enable-self-preservation: false # 关闭⾃我保护模式(缺省为打开)