Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. Java
  3. 正文
                           

【原创】Eureka源码剖析之六:自我保护机制

2020-01-31 1301点热度 0人点赞 0条评论

 

当EurekaServer由于自身发生网络故障等原因无法接收到EurekaClient端发送的心跳(续约)时,不会将未收到心跳(续约)请求的服务下线,虽然这样短时间内可能造成EurekaServer维护的注册列表信息不是完全准确的,但保证了EurekaServer可用性。

 

主要通过expectedNumberOfRenewsPerMin,numberOfRenewsPerMinThreshold(expectedNumberOfClientsSendingRenews新版本,做了优化,具体这里不做分析,有兴趣者可自行研究)这两个值判断是否进入自我保护模式,当每分钟收到的心跳数量小于期望收到的心跳数量,EurekaServer便会进入自我保护模式,不会剔除任何一个服务,直到心跳回复正常后退出自我保护模式。

自我保护模式默认是开启的。服务注册和下线都会更新对应的值:expectedNumberOfRenewsPerMin和expectedNumberOfClientsSendingRenews,配置RenewalPercentThreshold默认值:0.85,expectedClientRenewalIntervalSeconds:30秒。

触发自我保护模式:Renews (last min) < Renews threshold。假如当前有10个服务,那么每分钟续约数Renews (last min)=10 * 2=20,阈值:20 * 0.85=17,这个是正常的不会触发。一旦出现Renews (last min)小于17,则会触发自我保护模式。

 

服务注册:
synchronized (lock) {
    if (this.expectedNumberOfClientsSendingRenews > 0) {
        // Since the client wants to register it, increase the number of clients sending renews
        // 期望客户端发送续约数增1
        this.expectedNumberOfClientsSendingRenews = this.expectedNumberOfClientsSendingRenews + 1;
        // 更新每分钟续约阈值
        updateRenewsPerMinThreshold();
    }
}


// 更新每分钟续约阈值:期望客户端续约数*2(60/30秒默认)*百分比(0.85),即每分钟续约数量
protected void updateRenewsPerMinThreshold() {
    this.numberOfRenewsPerMinThreshold = (int) (this.expectedNumberOfClientsSendingRenews
            * (60.0 / serverConfig.getExpectedClientRenewalIntervalSeconds())
            * serverConfig.getRenewalPercentThreshold());
}
服务下线:
synchronized (lock) {
       if (this.expectedNumberOfClientsSendingRenews > 0) {
           // Since the client wants to cancel it, reduce the number of clients to send renews
           // 期望客户端发送续约数减1
           this.expectedNumberOfClientsSendingRenews = this.expectedNumberOfClientsSendingRenews - 1;
           // 更新每分钟续约阈值
           updateRenewsPerMinThreshold();
       }
   }
在Eureka初始化中,会启动定时调度任务:
在剔除任务EvictionTask中,会根据阈值进行相关剔除操作;在获取实例信息时也会根据是否达到阈值后续约是否过期进行相关判断。
总结

自我保护模式机制,是eureka在防止网络分区等故障时造成服务的“意外不可用”。
它不会从注册列表中剔除因长时间没收到心跳导致租期过期的服务,而是等待修复,直到心跳恢复正常之后,它自动退出自我保护模式。
Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。
一般不推荐关闭自我保护模式(默认开启),也不推荐调整阈值低于0.5以下,一般推荐是增加Eureka server服务节点。
 


 

本文仅供学习!所有权归属原作者。侵删!文章来源: 搬运工来架构

更多文章:

  1. Eureka源码剖析之一:初始化-启动
  2. MySQL事务死锁问题排查
  3. Eureka源码剖析之五:服务下线
  4. OpenAI震撼技术圈!0代码构建Assistants API,技术原理探秘
  5. Eureka源码剖析之四:服务续约
  6. Eureka源码剖析之三:服务拉取
  7. DevOps 流水线 CI 成倍提速方案
  8. 记一次堆内外内存问题的排查和优化
  9. Eureka源码之二:服务注册
  10. Eureka源码剖析之七:架构&面试题【总结】
标签: 原创 开源框架 源码 eureka 注册中心
最后更新:2023-02-25

Cocodroid

专注Java后端,分享技术。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
最新 热点 推荐
最新 热点 推荐
视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务? 视频笔记:什么是AI 智能体? 视频笔记:什么是Flink?
Elasticsearch 使用误区之六——富文本内容写入前不清洗基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性你可以不用RxJava,但必须得领悟它的思想!如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具视频笔记:什么是Flink?
2021.07.13 我们是这样崩的 千万级数据深分页查询SQL性能优化实践 Cache——对于缓存你应该知道的都在这张图里 这些MQ概念你都懂吗:死信队列、重试队列、消息回溯等 4.架构风格 vs. 架构模式 vs. 设计模式(译) Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了! 5.单体架构(译) Eureka源码之二:服务注册

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (19) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2

x