Eureka自我保护机制
- 默认情况下,EurekaClient会定时向EurekaServer端发送心跳,如果EurekaServer在一定时间内没有收到EurekaClient发送的心跳,便会把该实例从注册服务列表中剔除(默认是90秒),但是在短时间内丢失大量的实例心跳,这时候EurekaServer会开启自我保护机制,Eureka不会踢出该服务。
- 自我保护模式可以让集群更加健壮,但是我们在开发测试阶段,需要频繁地重启发布,如果触发了保护机制,则旧的服务实例没有被删除,这时请求有可能跑到旧的实例中,而该实例已经关闭了,这就导致请求错误,影响开发测试
- 图中我们可以看到 shopping-member做了集群有两个节点
- Renews threshold:Eureka Server 期望每分钟收到客户端实例续约的总数。
- Renews (last min):Eureka Server 最后 1 分钟收到客户端实例续约的总数。
当后者(最后一分钟收到的心跳数)小于前者(心跳阈值)的时候,触发保护机制,会出现红色的警告
紧急!EUREKA可能错误地声明实例已经启动,而实际上它们并没有。续订低于阈值,因此不会为了安全而终止实例
关闭自我保护机制就会出现图一中的提示
THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
- 自我保存模式是关闭的。当网络或其他问题发生时,它可能无法保护实例过期。
关闭服务保护机制
- 在开发中因为会频繁重启服务,所以建议关闭自我保护机制,但是在生产是不推荐这样做的
配置Eureka服务端
###服务端口号
server:
port: 8100
###eureka 基本信息配置
spring:
application:
name: eureka-server
eureka:
instance:
###注册到eurekaip地址
hostname: 127.0.0.1
client:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
###因为自己是为注册中心,不需要自己注册自己
register-with-eureka: false
###因为自己是为注册中心,不需要检索服务
fetch-registry: false
server:
# 测试时关闭自我保护机制,保证不可用服务及时踢出
enable-self-preservation: false
# 每隔两秒检测一次
eviction-interval-timer-in-ms: 2000
配置Eureka客户端
server:
port: 9100
spring:
application:
name: shopping-member
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8100//eureka
register-with-eureka: true
fetch-registry: true
instance:
###Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则)
lease-renewal-interval-in-seconds: 1
####Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己)
lease-expiration-duration-in-seconds: 2
这样在开发环境中我们就能及时剔除死掉的服务