保护模式主要用于一组客户端和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 计算代码:
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)