介绍
有时访问 Eureka Server 的主页,会显示红字,如下图:
表示 Eureka Server 进入自我保护机制
什么是自我保护机制
官方解释:
https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication
- 正常情况(15 分钟内没有超过 85% 的 Eureka Client 都没有正常的发送心跳)下,如果 Eureka Server 在约定时间内(默认90秒)没有接收到某个微服务(Eureka Client)实例的心跳,Eureka Server 将会移除该实例。
提出问题
如果Eureka Server在一定时间内没有接受到服务实例的心跳,Eureka将会注销该实例(默认90秒)。
但当网络分区故障发生时,大面积(甚至所有)微服务(Eureka Client)都与 Eureka Server 之间无法正常通信,但其实 各个微服务本身是能正常运行的,此时 Eureka Server 不应该移除 这些微服务
为了解决此问题,提出 自我保护机制
解决问题
Eureka Server 在运行期间会去统计心跳失败比例,阈值是 在 15 分钟之内是否低于 85%
一旦进入 自我保护机制,Eureka Server 会将这些实例保护起来,让这些实例不会过期
注意: 在保护期内,如果 服务提供者 非正常下线了,此时服务消费者就会拿到该无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。
在单机测试的时候很容易满足心跳失败比例在 15 分钟之内低于 85%,这个时候就会触发 Eureka 的保护机制
自我保护后会怎么样?
Eureka Server 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务(Eureka Client)
Eureka Server 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它 Eureake Server 上,保证当前节点依然可用。
当网络稳定/恢复后,Eureka Server节点会自动退出自我保护模式,期间新的注册信息会被同步到其它 Eureake Server 节点中。
关闭自我保护
Eureka Server 自我保护模式默认已经开启,并且不要关闭
如果需要关闭,修改 Eureka Server 的application.yml文件:
#配置 Eureka Server
eureka:
server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 5000
解释:
eureka.server.enable-self-preservation=false关闭自我保护
Eureka Server 主页 Spring Eureka 上可以看到如下红色的提示信息:
如果手动再将 Eureka Client 非法关闭,则约 2 分钟后,Eureka Server 主页 Instances currently registered with Eureka 下就会直接将其移除。eviction-interval-timer-in-ms: 5000
驱逐计时器扫描失效服务的间隔时间(默认为60*1000ms),不建议修改
感谢:
https://blog.csdn.net/wangmx1993328/article/details/88565342
