自我保护机制是什么
访问Eureka主页时,如果看到这样一段大红色的句子:
默认情况下,如果eureka server在一定时间内没有接收到某个微服务实例的心跳,eureka server将会注销该实例(默认90秒),但是当网络分区发生故障时(延时,卡顿,拥挤)时,微服务与eureka server之间就无法正常通信,以上行为可能变得非常危险了,因为微服务本是其实是健康的,此时本不应该注销这个服务,eureka通过自我保护模式,来解决这个问题,当eureka server节点在短时间内丢失过多客户端时(可能是网络分区故障)那么这个节点就会进入自我保护模式。
在自我保护模式中,eureka server会保护服务注册表中的信息,不在注销任何服务实例。
它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例,一句话理解,好死不如赖活着。
自我保护模式就是一种对网络异常的安全保护措施,它的架构哲学是宁可同时保留所有的微服务(健康的和不健康的微服务都会被保留)也不盲目注销任何健康的微服务,使用自我保护模式,可以让eureka集群更加的健壮,稳定。
保护模式主要用于一组客户端和eureka server之间存在网络分区场景下的保护,一旦进入了保护模式, eureka server将会尝试保护其服务注册表中的信息,不会在删除服务注册表中的数据,也就是不会注销任何微服务。简单的说,就是在某一时刻,某一个微服务突然不可用了,eureka server不会立刻清理,而是依旧对该微服务的信息进行保存。属于CAP理论的AP分支。
导致原因
为什么会有这种自我保护机制?
为了防止eureka client可以正常运行,但是eureka server网络不通畅的情况下,eureka server不会立刻将eureka client 服务剔除
禁止自我保护
默认eureka server开启了自我保护,怎么关闭了?
在eureka server端7001的application.yml添加配置
server: enable-self-preservation: true #禁用自我保护模式 eviction-interval-timer-in-ms: 2000 #默认是90秒 改为2秒
在进去eureka server注册中心就看不到红字了,就成功关闭了自我保护。
cloud-provider-payment8001 provider关闭自我保护
instance: #客户端系那个服务端发送心跳的时间间隔,单位为秒(默认30s) lease-expiration-duration-in-seconds: 1 #服务端在收到最后一次心跳后等到时间上限,单位为秒,默认为(90s)。超时剔除服务 lease-renewal-interval-in-seconds: 2