Eureka自我保护机制

Eureka自我保护机制,第1张

Eureka自我保护机制 介绍

保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。这符合CAP理论中的AP(高可用性、分区容错性)

网络分区见博客:https://www.cnblogs.com/sunlong88/p/13180586.html

故障现象

当eureka的web界面出现了如下提示,则说明eureka进入了自我保护模式

自我保护模式的激活条件

  • Renews threshold:Eureka Server 期望每分钟收到客户端实例续约的总数
  • Renews (last min):Eureka Server 最后 1 分钟收到客户端实例续约的总数。

自我保护模式被激活的条件是:在 1 分钟后,Renews (last min) < Renews threshold
然后等待五分钟就会出现上面的故障现象,红色的提示信息

Renews threshold和Renews(last)的计算方式是什么? Renews threshold的计算方式

Renews threshold 计算代码:

this.expectedNumberOfRenewsPerMin = count * 2;
this.numberOfRenewsPerMinThreshold = (int) (this.expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold());
// this.numberOfRenewsPerMinThreshold就是Renews threshold

变量介绍

  • count:表示服务的数量
  • serverConfig.getRenewalPercentThreshold():默认是0.85,可以通过eureka.server.renewal-percent-threshold进行配置

对应源码在AbstractInstanceRegistry类中的openForTraffic方法

public void openForTraffic(ApplicationInfoManager applicationInfoManager, int count) {
   this.expectedNumberOfRenewsPerMin = count * 2;
   this.numberOfRenewsPerMinThreshold =
           (int) (this.expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold());
    }
Renews(last min)的计算方式

Renews(last min)计算代码

this.expectedNumberOfRenewsPerMin = count * 2;
// Renews(last min)的值就是this.expectedNumberOfRenewsPerMin表示期望每分钟最大续约次数

数值2表示每分钟两个心跳

自我保护模式详细说明

默认情况下,当EurekaServer在一定时间内(默认90秒)没有接收到某个客户端实例的心跳,EurekaServer将会注销该实例。
但是如果Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否高于 85%,如果高于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。

推荐指数⭐参考博客https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html
推荐指数⭐⭐参考博客https://www.cnblogs.com/zhixiang-org-cn/p/11756764.html

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5637575.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存