1. 什么叫自我保护模式?
当微服务客户端启动后,会把自身信息注册到Eureka注册中心,以供其他微服务进行调用。一般情况下,当某个服务不可用时(一段时间内没有检测到心跳或者连接超时等),那么Eureka注册中心就会将该服务从可用服务列表中剔除,但是在微服务架构中,因为服务数量众多,可能存在跨机房或者跨区域的情况,因此当某个服务心跳探测失败并不能完全说明其无法正常提供服务而将其剔除,并且服务一旦剔除后,再重新注册将会重新进行负载均衡等等一系列的操作,考虑到性能问题,eureka会将不可用的服务暂时断开,并期望能够在接下来一段时间内接收到心跳信号,而不是直接剔除,同时,新来的请求将不会分发给暂停服务的实例,这就是eureka的保护机制,它保护了因网络等问题造成的短暂的服务不可用的实例,避免频繁注册服务对整个系统造成影响。
2. 什么时候触发自我保护模式
比如你有10个user-service节点注册到eureka-server中,这个时候挂了两台。那么比例就是:(10-2)/10 = 80% 。这个时候就会引发自我保护机制。
3.自我保护模式效果
一旦进入到保护模式,所有的eureka服务都不再被踢出来。
举例:比如你有10个user-service节点注册到eureka-server中,这个时候挂了两台。那么比例就是:(10-2)/10 = 80% 。这个时候就会引发自我保护机制。剩下的8台服务器如果有一台出现网络故障或者其他原因,注册中心超过90秒没有检查到这台故障服务的心跳,不会直接剔除,同时,新来的请求将不会分发给暂停服务的实例,这就是eureka的保护机制。如果你15分钟内一直没有修复,超过15分钟,eureka就启动剔除机制,把坏服务剔除掉,目的就是节约内存空间。
如果觉得85%这个值比较大,可以调低一点使用以下方式:
eureka.server.renewalPercentThreshold=0.49
4.关闭自我保护模式
- 我们在单机测试的时候很容易满足心跳失败比例在 15 分钟之内低于 85%,这个时候就会触发 Eureka 的保护机制,所以单机状态下不建议开启。们可以使用
eureka.server.enable-self-preservation=false
来关闭保护机制,这样可以确保注册中心中不可用的实例被及时的剔除(不推荐)。 - 默认情况下每个30秒服务会向注册中心发送一次心跳,证明自己还活着。如果超过90秒没有发送心跳,EurekaServer就会认为该服务宕机,会从服务列表中移除,这两个值在生产环境不要修改,默认即可。
- 关闭自我保护模式的方式
eureka:
server:
# 服务失效剔除时间间隔,默认60秒 eureka服务定时扫描失效的服务,把失效的服务剔除
eviction-interval-timer-in-ms: 60000
#关闭自我保护模式(默认是打开的)
enable-self-preservation: false
- 服务续约配置
eureka:
instance:
#如果超过90秒没有发送心跳,EurekaServer就会认为该服务宕机,会从服务列表中移除,
lease-expiration-duration-in-seconds: 90
#每隔30秒服务会向注册中心发送一次心跳,证明自己还活着
lease-renewal-interval-in-seconds: 30
5.案例
a. 注册中心注册了7台微服务
b. 关闭一个微服务,等待90秒钟后刷新页面。因为如果超过90秒没有发送心跳,EurekaServer就 会认为该服务宕机。判断是否开启自我保护模式。
关闭一台发现,没有触发自我保护模式,因为6/7*100%>85%;
c. 在关闭一台微服务,等待90秒;发现开启了自我保护模式,因为:5/6*100%=83%<85%;心跳续约的比例小于85%