Eureka 系列(02)Eureka 一致性协议
目录
Eureka 系列(02)Eureka 一致性协议
Eureka 是由 Netflix 基于 AP 模型的服务发现中间件,包括服务发现服务器和客户端的。相关文档推荐:一是 Spring Cloud Eureka 官网,二是 Eureka源码解析。
本系列源码分析基于 spring-cloud-starter-netflix-eureka-2.1.1.RELEASE 和 Eureka-1.9.8。
0. Spring Cloud 系列目录 - Eureka 篇
1. 服务发现方案对比
1.1 技术选型
表1:Spring Cloud 服务发现方案对比
| 技术选型 | CAP模型 | 适用规模(建议) | 控制台管理 | 社区活跃度 |
|---|---|---|---|---|
| Eureka | AP | <30k | 支持 | 低 |
| Zookeeper | CP | <20k | 不支持 | 中 |
| Consul | AP | <5k | 支持 | 高 |
| Nacos | AP/CP | 100k+ | 支持 | 靠大家啦☺ |
注: 以上数据来源于 小马哥技术周报。
1.2 数据模型
表2:Spring Cloud 服务发现数据模型
| 框架 | 集群(框架) | 服务应用 | 服务集群 | 服务实例 | 租约管理 |
|---|---|---|---|---|---|
| Spring-Cloud | -- | (serviceId) | -- | ServiceInstance | -- |
| Nacos | Server | Service | Cluster | Instance | -- |
| Eureka | (serviceUrl) | Application(appName) | -- | InstanceInfo(id) | Lease |
不同的框架对应的数据结构不太一致,在此做一些约定:
- 服务器集群 Server:指的是 Eureka Server 本身的集群。用 Server 代替,也可能是 ServerList 之类,总之与 Server 或 Peer 或 Node 相关的都代表框架自身的集群。
- 服务 Service:代表一个应用,可能包含多个服务实例。
Service(服务)或serviceId或Application(应用)或appName。 - 集群 Cluster:一个 Service 可能包含多个 Cluster,Cluster 包含多个具体的实例。这是 Nacos 中的概念。
- 服务实例 ServiceInstance:代表注册的一个具体实例。
ServiceInstance(服务实例)或InstanceInfo(实例id)或Instance(实例)。
2. Eureka 一致性协议
Eureka 和 Zookeeper 的最大区别: Eureka 是 AP 模型,Zookeeper 是 CP 模型。在出现脑裂等场景时,Eureka 可用性是每一位,也就是说出现脑裂时,每个分区仍可以独立提供服务,是去中心化的。更多 Eureka与ZooKeeper 的比较。
那 Eureka 是如何实现最终一致性的呢?
2.1 消息广播
Eureka Server 管理了全部的服务器列表(PeerEurekaNodes)
当 Eureka Server 收到客户端的注册、下线、心跳请求时,通过 PeerEurekaNode 向其余的服务器进行消息广播,如果广播失败则重试,直到任务过期后取消任务,此时这两台服务器之间数据会出现短暂的不一致。
注意: 虽然消息广播失败,但只要收到客户端的心跳,仍会向所有的服务器(包括失联的服务器)广播心跳任务。
如果网络恢复正常,收到了其它服务器广播的心跳任务,此时可能有三种情况:
- 一是脑裂很快恢复,一切正常;
- 二是该实例已经自动过期,则重新进行注册;
- 三是数据冲突,出现不一致的情况,则需要发起同步请求,其实也就是重新注册一次,同时踢除老的实例。
总之,通过集群之间的消息广播可以实现数据的最终一致性。
2.1.2 服务注册
- Spring Cloud Eureka 在应用启动时,会在 EurekaAutoServiceRegistration 这个类初始化的时候,主动去 Eureka Server 端注册。
- Eureka 在启动完成之后会启动一个 40 秒执行一次的定时任务,该任务会去监测自身的 IP 信息以及自身的配置信息是否发生改变,如果发生改变,则会重新发起注册。
- 续约返回 404 状态码时,会去重新注册
2.1.3 主动下线
Eureka 会在 spring 容器销毁的时候执行 shutDown 方法 ,该方法首先会将自身的状态改为 DOWN,接着发送cancle 命令至 Eureka Server 请求下掉自己的服务。
2.1.4 心跳续约与自动下线
健康检测,一般都是 TTL(Time To Live) 机制。eg: 客户端每 5s 发送心跳,服务端 15s 没收到心跳包,更新实例状态为不健康, 30s 未收到心跳包,从服务列表中删除。
Eureka Server 默认每 30s 发送心跳包,90s 未收心跳则删除。这个清理过期实例的线程,每 60s 执行一次。
2.2 崩溃恢复
2.2.1 重启
Spring Cloud Eureka 启动时,在初始化 EurekaServerBootstrap#initEurekaServerContext 时会调用 PeerAwareInstanceRegistryImpl#syncUp 从其它 Eureka 中同步数据。
2.2.2 脑裂
- 发生脑裂后:和 Eureka Server 同区的服务可以正常访问,而不同区的服务则自动过期。
- 脑裂恢复后:接收其它 Eureka Sever 发送过来的心跳请求,此时有三种情况:一是脑裂很快恢复,一切正常;二是该实例已经自动过期,则重新进行注册;三是数据冲突,出现不一致的情况,则需要发起同步请求。
3. 可靠性
3.1 高可用客户端(Client HA)
当有多个 Eureka Server 时,第一台宕机时会从下一台同步数据。注意:只有当第一台宕机时才会同步第二台,否则永远只会从第一台同步数据。
3.2 自我保护
如果每分钟的续约数小于阀值时 ,则开启自我保护机制,Eureka Server 将不会主动清除过期实例。
每天用心记录一点点。内容也许不重要,但习惯很重要!
Eureka 系列(02)Eureka 一致性协议的更多相关文章
- Eureka系列(一)Eureka功能介绍
Eureka核心功能点 服务注册(register): Client会发送一次Rest请求给Server端来实现注册,Server接受到请求会将服务信息存储起来,并将注册信息给同集群其他Serve ...
- Eureka系列(九)Eureka自我保护机制
因为本篇简文并不是自己总结的,而是当了下搬运工,所以直接直接附上原作者博客链接. 参考链接: 1.SpringCloud Eureka自我保护机制 2.Spring Cloud Eurek ...
- Eureka 系列(01)最简使用姿态
目录 Eureka 系列(01)最简使用姿态 0. Spring Cloud 系列目录 - Eureka 篇 1. 服务发现与发现 1.1 服务发现(Service Discovery) 1.2 服务 ...
- Eureka 系列(08)心跳续约与自动过期
Eureka 系列(08)心跳续约与自动过期 [TOC] Spring Cloud 系列目录 - Eureka 篇 在上一篇 Eureka 系列(07)服务注册与主动下线 中对服务的注册与下线进行了分 ...
- Eureka 系列(05)消息广播(上):消息广播原理分析
Eureka 系列(05)消息广播(上):消息广播原理分析 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 首先回顾一下客户端服务发现的流程,在上一篇 Eureka 系列( ...
- Eureka 系列(04)客户端源码分析
Eureka 系列(04)客户端源码分析 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 在上一篇 Eureka 系列(01)最简使用姿态 中对 Eureka 的简单用法做 ...
- Spring Cloud 系列之 Eureka 实现服务注册与发现
如果你对 Spring Cloud 体系还不是很了解,可以先读一下 Spring Cloud 都有哪些模块 Eureka 是 Netflix 开源的服务注册发现组件,服务发现可以说是微服务架构的核心功 ...
- Eureka 系列(07)服务注册与主动下线
Eureka 系列(07)服务注册与主动下线 [TOC] Spring Cloud 系列目录 - Eureka 篇 在上一篇 Eureka 系列(05)消息广播 中对 Eureka 消息广播的源码进行 ...
- Eureka 系列(06)消息广播(下):TaskDispacher 之 Acceptor - Worker 模式
Eureka 系列(06)消息广播(下):TaskDispacher 之 Acceptor - Worker 模式 [TOC] Spring Cloud 系列目录 - Eureka 篇 Eureka ...
随机推荐
- Qt Creator 中的插件Plugin, 区分说明。。。
Qt Creator 中可以创建 三中类型的插件Plugin: 1.用的最多的,派生自QGenericPlugin类: 在新建Library, Plugin类型工程中,新建. 调用使用QPlugi ...
- Spring Boot 支持 HTTPS 如此简单,So easy!
这里讲的是 Spring Boot 内嵌式 Server 打 jar 包运行的方式,打 WAR 包部署的就不存在要 Spring Boot 支持 HTTPS 了,需要去外部对应的 Server 配置. ...
- 组件化框架设计之阿里巴巴开源路由框架——ARouter原理分析(一)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 背景 当项目的业务越来越复杂,业务线越来越多的时候,就需要按照业 ...
- 网站设置成代理后,chrome chrome HTTP ERROR 502
在阿里云上设置CNAME代理后,发现www.xxxx.com出现502,但是http://xxxx.com却可以访问. ping了一下都可以,网上搜了搜原来和nginx.conf配置有关 配置如下,上 ...
- git update-index --assume-unchanged on directory 转摘自:http://stackoverflow.com/questions/12288212/git-update-index-assume-unchanged-on-directory
30down votefavorite 16 git 1.7.12 I want to mark all files below a given directory as assume-unchang ...
- python opencv 生成验证码
基本思路是使用opencv来把随机生成的字符,和随机生成的线段,放到一个随机生成的图像中去. 虽然没有加复杂的形态学处理,但是目前看起来效果还不错 尝试生成1000张图片,但是最后只有998张,因为有 ...
- Centos设置自带中文输入法
1.点击屏幕左上角的[系统应用程序]->[系统工具]->[设置] 2.在弹出的设置对话窗中选择Region&language 3.在弹出的[区域和语言]对话窗中,点击左下角“+”, ...
- IDEA compile successfully many errors still occur
Compile and install successfully with maven in IDEA, but error prompt still popup. Your local enviro ...
- 【杂记】docker搭建ELK 集群6.4.0版本 + elasticsearch-head IK分词器与拼音分词器整合
大佬博客地址:https://blog.csdn.net/supermao1013/article/category/8269552 docker elasticsearch 集群启动命令 docke ...
- windows服务器装macos虚拟机(vmware)系统
VMware14安装黑苹果macOS10.13流程 一.准备工具 VMware Workstation 14.1.2 Pro macOS High Sierra 10.13.iso格式或.cdr格式( ...