Eureka自我保护机制

笔记内容来自:F版本SpringCloud 5—Eureka集群和自我保护机制 - 编程鹿的文章 - 知乎

自我保护机制

下图的红字部分就代表eureka进入自我保护机制

     EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE 
     UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND 
     HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

默认情况下,如果eureka server在一定时间没有接收到服务实例的心跳,eureka将会注销该实例

但是当网络出现问题的时候,微服务客户端和eureka server无法正常通信。

这时候,eureka server如果去注销这些服务就会有问题,因为这些服务其实都处于存活状态,只是网络中断,导致没法发心跳给eureka server
eureka通过自我保护机制来解决这个问题

当eureka server在短时间丢失过多的服务实例,eureka server就会进入自我保护模式
一旦进入该模式,eureka server就会保护服务注册表中的信息,不再删除服务注册表中的数据,也就是不注销任何服务实例
当网络故障恢复之后,eureka server会自动退出自我保护模式(有个问题,怎么判断网络故障恢复)

具体情况是Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%
如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致)

所以,自我保护模式是一种应对网络故障的安全保护措施
它的思想是,宁可同时保留所有微服务,也不盲目注销任何健康的微服务

总结:大面积出现客户端失联的时候,Eureka 注册中心进入自我保护模式,不注销任何实例

自我保护机制的配置

在Eureka Server中配置关闭自我保护机制

#关闭自我保护机制  默认开启
eureka.server.enable-self-preservation=false

如果想及时剔除失效的eureka服务除了关闭自我保护机制外,可以调低eureka的心跳值

eureka-server服务端
配置文件中我们添加如下配置

#关闭保护机制,以确保注册中心将不可用的实例正确剔除
eureka.server.enable-self-preservation=false
#(代表是5秒,单位是毫秒,清理失效服务的间隔 )
eureka.server.eviction-interval-timer-in-ms=5000


客户端
配置文件中我们添加如下配置

# 心跳检测检测与续约时间
# 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
# 配置说明
#  lease-renewal-interval-in-seconds 每间隔10s,向服务端发送一次心跳,证明自己依然”存活“
#  lease-expiration-duration-in-seconds  告诉服务端,如果我20s之内没有给你发心跳,就代表我“死”了,将我踢出掉。
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.instance.lease-expiration-duration-in-seconds=20
posted @ 2021-04-22 10:35  张三丰学Java  阅读(246)  评论(0编辑  收藏  举报