如果你看到了下面红色字体的信息,则说明 Eureka 关闭了自我保护机制。
![](https://img.kancloud.cn/86/cf/86cfdd46c0a3c956d0d611938e28cdab_2113x789.png)
如果关闭了自我保护机制,Eureka Server 在一定时间内没有接收到某个微服务实例的心跳,Eureka Server 将会注销该实例(默认90秒)。
<br/>
但是当网络分区故障发生时,微服务与 Eureka Server 之间无法正常通信,关闭自我保护机制的行为可能变得非常危险了,因为微服务本身其实是健康的,此时本不应该注销这个微服务。
Eureka 通过自我保护模式来解决这个问题,当 Eureka Server 节点在短时间内丢失过多客户端时,那么就会进入自我保护模式。
<br/>
一旦进入自我保护模式,Eureka Server 就会保护服务注册表中的信息,不再删除服务注册表中的数据,即不会注销任何微服务。当网络故障恢复后,该 Eureka Server 节点会自动退出自我保护模式。
<br/>
综上,自我保护模式是一种应对网络异常的安全保护措施。它宁可保留所有微服务(健康/不健康),也不盲目注销任何不健康的微服务,让 Eureka 集群更加的健壮、稳定。
<br/>
如果想要禁止使用 Eureka 的自我保护机制,可以如下配置:
1. 在 Eureka 服务端禁用自我保护机制。
```yml
#false 禁用自我保护机制,true(默认)开启自我保护
eureka.server.enable-self-preservation = false
```
2. 在 Eureka 客户端缩小心跳时间。
```yml
eureka:
instance:
#心跳检测与续约时间
#开发时没置小些,保证服务关闭后注册中心能即使剔除服务
#Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
lease-renewal-interval-in-seconds: 1
#Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
lease-expiration-duration-in-seconds: 2
```