多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
当Eureka服务启动后,你等待90s,或者将Eureka客户端的`eureka.client.instance.instance-id`配置来回改,你就会看到如下的信息,则说明Eureka进入了自我保护。 ![](https://img.kancloud.cn/ce/94/ce94b90748dc8a2fa47330cabb88d91b_1846x378.jpg) <br/> 默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,<mark>此时本不应该注销这个微服务</mark>。Eureka通过<mark>自我保护模式</mark>来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。 <br/> 一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。  <br/> <mark>在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例</mark>。 <br/> <mark>一句话讲解:好死不如赖活着,即某时刻某一个微服务不可用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存。</mark>  <br/> 综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。  <br/> 如果想要禁止使用 Eureka 的自我保护机制,可以如下配置: (1)在 Eureka 服务端禁用自我保护。 *`application.yml`* ```yml #false 禁用自我保护机制,true(默认)开启自我保护 eureka.server.enable-self-preservation = false ``` (2)在 Eureka 客户端缩小心跳时间。 *`application.yml`* ```yml eureka: instance: #心跳检测与续约时间 #开发时没置小些,保证服务关闭后注册中心能即使剔除服务 #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒) lease-renewal-interval-in-seconds: 1 #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务 lease-expiration-duration-in-seconds: 2 ``` 不推荐禁用自我保护机制。