• -------------------------------------------------------------
  • ====================================

spring cloud心跳检测自我保护

springcloud dewbay 5年前 (2019-04-12) 2020次浏览 已收录 0个评论 扫描二维码

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 和 client 之间每隔 30 秒会进行一次心跳通信,告诉 server,client 还活着

在某一些时候注册在 Eureka 的服务已经挂掉了,但是服务却还留在 Eureka 的服务列表的情况。

spring cloud心跳检测自我保护

自我保护机制

默认情况下,如果 Eureka Server 在一定时间内(默认 90 秒)没有接收到某个微服务实例的心跳,Eureka Server 将会移除该实例。但是当网络分区故障发生时,微服务与 Eureka Server 之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。

自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使 Eureka 集群更加的健壮、稳定的运行。

自我保护机制的工作机制是如果在 15 分钟内超过 85%的客户端节点都没有正常的心跳,那么 Eureka 就认为客户端与注册中心出现了网络故障,Eureka Server 自动进入自我保护机制,

自我保护机制时会出现以下几种情况:

1、Eureka Server 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。

2、Eureka Server 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。

3、当网络稳定时,当前 Eureka Server 新的注册信息会被同步到其它节点中

Eurake 有一个配置参数 eureka.server.renewalPercentThreshold,定义了 renews 和 renews threshold 的比值,默认值为 0.85。当 server 在 15 分钟内,比值低于 percent,即少了 15%的微服务心跳,server 会进入自我保护状态,Self-Preservation。在此状态下,server 不会删除注册信息,这就有可能导致在调用微服务时,实际上服务并不存在。 

这种保护状态实际上是考虑了 client 和 server 之间的心跳是因为网络问题,而非服务本身问题,不能简单的删除注册信息

解决建议是:

1、在生产上可以开自注册,部署两个 server 
2、在本机器上测试的时候,可以把比值调低,比如 0.49 
3、简单粗暴把自我保护模式关闭

eureka.server.enableSelfPreservation=false

露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:spring cloud心跳检测自我保护
喜欢 (0)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址