深入了解 Eureka 架构原理及实现(五)

简介: 深入了解 Eureka 架构原理及实现

服务注销机制


服务正常停止之前会向注册中心发送注销请求,告诉注册中心“我要下线了”。



微信图片_20220414203224.png


注册中心服务接收到 cancel 请求后:


  1. 删除服务信息,将服务信息从 registry 中删除;


  2. 更新队列,将此事件添加到更新队列中,供 Eureka Client 增量同步服务信息使用。


  3. 清空二级缓存,即 readWriteCacheMap,用于保证数据的一致性。

  4. 更新阈值,供剔除服务使用。

  5. 同步服务信息,将此事件同步至其他的 Eureka Server 节点。


服务正常停止才会发送 Cancel,如果是非正常停止,则不会发送,此服务由 Eureka Server 主动剔除。


服务剔除机制


Eureka Server 提供了服务剔除的机制,用于剔除没有正常下线的服务。


微信图片_20220414203228.png


服务的剔除包括三个步骤,首先判断是否满足服务剔除的条件,然后找出过期的服务,最后执行剔除。


判断是否满足服务剔除的条件


有两种情况可以满足服务剔除的条件:


  1. 关闭了自我保护


  2. 如果开启了自我保护,需要进一步判断是 Eureka Server 出了问题,还是 Eureka Client 出了问题,如果是 Eureka Client 出了问题则进行剔除。


这里比较核心的条件是自我保护机制,Eureka 自我保护机制是为了防止误杀服务而提供的一个机制。


Eureka 的自我保护机制“谦虚”的认为如果大量服务都续约失败,则认为是自己出问题了(如自己断网了),也就不剔除了;


反之,则是 Eureka Client 的问题,需要进行剔除。


自我保护阈值是区分 Eureka Client 还是 Eureka Server 出问题的临界值:如果超出阈值就表示大量服务可用,少量服务不可用,则判定是 Eureka Client 出了问题。


如果未超出阈值就表示大量服务不可用,则判定是 Eureka Server 出了问题


条件 1 中如果关闭了自我保护,则统统认为是 Eureka Client 的问题,把没按时续约的服务都剔除掉(这里有剔除的最大值限制)。


这里比较难理解的是阈值的计算:


  • 自我保护阈值 = 服务总数 * 每分钟续约数 * 自我保护阈值因子。


  • 每分钟续约数 =(60S/ 客户端续约间隔)


最后自我保护阈值的计算公式为:


自我保护阈值 = 服务总数 * (60S/ 客户端续约间隔) * 自我保护阈值因子。

 

举例:如果有 100 个服务,续约间隔是 30S,自我保护阈值 0.85。

自我保护阈值 =100 * 60 / 30 * 0.85 = 170。

如果上一分钟的续约数 =180>170,则说明大量服务可用,是服务问题,进入剔除流程;

如果上一分钟的续约数 =150<170,则说明大量服务不可用,是注册中心自己的问题,进入自我保护模式,不进入剔除流程。


找出过期的服务


遍历所有的服务,判断上次续约时间距离当前时间大于阈值就标记为过期。并将这些过期的服务保存到集合中。


剔除服务


在剔除服务之前先计算剔除的数量,然后遍历过期服务,通过洗牌算法确保每次都公平的选择出要剔除的任务,最后进行剔除。


执行剔除服务后:


  1. 删除服务信息,从 registry 中删除服务。


  2. 更新队列,将当前剔除事件保存到更新队列中。


  3. 清空二级缓存,保证数据的一致性。


服务获取机制


Eureka Client 获取服务有两种方式,全量同步和增量同步。获取流程是根据 Eureka Server 的多层数据结构进行的:


微信图片_20220414203232.png


无论是全量同步还是增量同步,都是先从缓存中获取,如果缓存中没有,则先加载到缓存中,再从缓存中获取。(registry 只保存数据结构,缓存中保存 ready 的服务信息。)


  • 先从一级缓存中获取


       a> 先判断是否开启了一级缓存


      b> 如果开启了则从一级缓存中获取,如果存在则返回,如果没有,则从二级缓存中获取


       c> 如果未开启,则跳过一级缓存,从二级缓存中获取


  • 再从二级缓存中获取

      a> 如果二级缓存中存在,则直接返回;

 

      b> 如果二级缓存中不存在,则先将数据加载到二级缓存中,再从二级缓存中获取。


注意加载时需要判断是增量同步还是全量同步,增量同步从 recentlyChangedQueue 中 load,全量同步从 registry 中 load。

相关文章
|
12天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
26天前
|
人工智能 前端开发 编译器
【AI系统】LLVM 架构设计和原理
本文介绍了LLVM的诞生背景及其与GCC的区别,重点阐述了LLVM的架构特点,包括其组件独立性、中间表示(IR)的优势及整体架构。通过Clang+LLVM的实际编译案例,展示了从C代码到可执行文件的全过程,突显了LLVM在编译器领域的创新与优势。
46 3
|
29天前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
64 1
|
1月前
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
25天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
1月前
|
开发者 容器
Flutter&鸿蒙next 布局架构原理详解
本文详细介绍了 Flutter 中的主要布局方式,包括 Row、Column、Stack、Container、ListView 和 GridView 等布局组件的架构原理及使用场景。通过了解这些布局 Widget 的基本概念、关键属性和布局原理,开发者可以更高效地构建复杂的用户界面。此外,文章还提供了布局优化技巧,帮助提升应用性能。
109 4
|
29天前
|
监控 持续交付 API
深入理解云计算中的微服务架构:原理、优势与实践
深入理解云计算中的微服务架构:原理、优势与实践
38 0
|
1月前
|
存储 Dart 前端开发
flutter鸿蒙版本mvvm架构思想原理
在Flutter中实现MVVM架构,旨在将UI与业务逻辑分离,提升代码可维护性和可读性。本文介绍了MVVM的整体架构,包括Model、View和ViewModel的职责,以及各文件的详细实现。通过`main.dart`、`CounterViewModel.dart`、`MyHomePage.dart`和`Model.dart`的具体代码,展示了如何使用Provider进行状态管理,实现数据绑定和响应式设计。MVVM架构的分离关注点、数据绑定和可维护性特点,使得开发更加高效和整洁。
167 3
|
1月前
|
API 持续交付 网络架构
深入解析微服务架构:原理、优势与实践
深入解析微服务架构:原理、优势与实践
33 0
|
2月前
|
容器
Flutter&鸿蒙next 布局架构原理详解
Flutter&鸿蒙next 布局架构原理详解

热门文章

最新文章