Eureka的自我保护机制


Eureka服务端会检查最近15分钟内所有Eureka 实例正常心跳占比,如果低于85%就会触发自我保护机制。触发了保护机制,Eureka将暂时把这些失效的服务保护起来,不让其过期,但这些服务也并不是永远不会过期。Eureka在启动完成后,每隔60秒会检查一次服务健康状态,如果这些被保护起来失效的服务过一段时间后(默认90秒)还是没有恢复,就会把这些服务剔除。如果在此期间服务恢复了并且实例心跳占比高于85%时,就会自动关闭自我保护机制。

为什么会有自我保护机制?
​ Eureka服务端为了防止Eureka客户端本身是可以正常访问的,但是由于网路通信故障等原因,造成Eureka服务端失去于客户端的连接,从而形成的不可用。

因为网络通信是可能恢复的,但是Eureka客户端只会在启动时才去服务端注册。如果因为网络的原因而剔除了客户端,将造成客户端无法再注册到服务端。

如何选择关闭还是开启自我保护机制
Eureka服务端默认情况下是会开启自我保护机制的。但我们在不同环境应该选择是否开启保护机制。

一般情况下,我们会选择在 开发环境下关闭自我保护机制,而在生产环境下启动自我保护机制。

开发环境下,我们我们启动的服务数量较少而且会经常修改重启。如果开启自我保护机制,很容易触发Eureka客户端心跳占比低于85%的情况。使得Eureka不会剔除我们的服务,从而在我们访问的时候,会访问到可能已经失效的服务,导致请求失败,影响我们的开发。

在生产环境下,我们启动的服务多且不会反复启动修改。环境也相对稳定,影响服务正常运行的人为情况较少。适合开启自我保护机制,让Eureka进行管理。

如何关闭自我保护机制
一、 服务端:

​ 配置eureka.server.enable-self-preservation = false关闭自我保护机制。

​ 配置eureka.server.eviction-interval-timer-in-ms = 2000让服务端每隔2秒扫描一次,是服务能尽快的剔除
eureka:
  server:
    #服务端是否开启自我保护机制 (默认true)
    enable-self-preservation: false
    #扫描失效服务的间隔时间(单位毫秒,默认是60*1000)即60秒
    eviction-interval-timer-in-ms: 2000

客户端:

​ 客户端配置eureka.instance.lease-renewal-interval-in-seconds = 1 客户端向服务端发送心跳的间隔,设置为1秒一次。

​ lease-expiration-duration-in-seconds: 2 服务端收到客户端服务后,等待下次心跳的超时时间,设置为2秒。如果超过2秒,移除该客户端。

我们的客户端设置和Eureka服务端的集群相同。我们设置三个客户端服务,服务名(spring.name)分别为client1、client2和client3,并修改端口号(server.port)分别为10000、20000、30000。

server:
  port: 10000
spring:
  application:
    name: client1
eureka:
  client:
    service-url:
      defaultZone: http://cluster1:70700/eureka,http://cluster2:8080/eureka,http://cluster3:9090/eureka
  instance:
    # 客户端向注册中心发送心跳的时间间隔,(默认30秒)
    lease-renewal-interval-in-seconds: 1
    #Eureka注册中心(服务端)在收到客户端心跳之后,等待下一次心跳的超时时间,如果在这个时间内没有收到下次心跳,则移除该客户端。(默认90秒)
    lease-expiration-duration-in-seconds: 2

---
server:
  port: 20000
spring:
  application:
    name: client2
eureka:
  client:
    service-url:
      defaultZone: http://cluster1:7070/eureka,http://cluster2:8080/eureka,http://cluster3:9090/eureka
  instance:
    # 客户端向注册中心发送心跳的时间间隔,(默认30秒)
    lease-renewal-interval-in-seconds: 1
    #Eureka注册中心(服务端)在收到客户端心跳之后,等待下一次心跳的超时时间,如果在这个时间内没有收到下次心跳,则移除该客户端。(默认90秒)
    lease-expiration-duration-in-seconds: 2

---
server:
  port: 30000
spring:
  application:
    name: client3
eureka:
  client:
    service-url:
      defaultZone: http://cluster1:7070/eureka,http://cluster2:8080/eureka,http://cluster3:9090/eureka
  instance:
    # 客户端向注册中心发送心跳的时间间隔,(默认30秒)
    lease-renewal-interval-in-seconds: 1
    #Eureka注册中心(服务端)在收到客户端心跳之后,等待下一次心跳的超时时间,如果在这个时间内没有收到下次心跳,则移除该客户端。(默认90秒)
    lease-expiration-duration-in-seconds: 2

我们将Eureka服务端集群启动并启动客户端的三个实例。当我们将客户端(client1)实例停掉(按照Eureka心跳占比低于85%规则,停掉一个就可以出发自我保护机制),我们过2-3秒后,查看Eureka服务端的控制台,查看是否将已经失效的服务剔除。

下图我们可以看到已经没有了client1这是实例了。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐