文章目录
- 1.简介
- 2.组件
- 2.1 Eureka Server
- 2.1.1 主要功能
- 2.1.2 自我保护机制
- 2.1.3 数据同步方式
- 2.1.4 Server的多级缓存和Client实例过期策略
- 2.2 Eureka Client
- 3.补充
- 3.1 CAP偏重点
- 3.2 功能扩展性
- 3.3 工作流程
1.简介
Eureka是Netflix开发的服务发现框架,本身是基于REST的服务,SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
2.组件
Eureka包含两个组件:
- Eureka Server:给服务提供者提供服务注册功能,给服务消费者提供订阅拉取功能;
- Eureka Client:用以简化Eureka Server的交互,支持提供者注册服务和获取更新提供者列表等功能。
各自关系架构图如下:
2.1 Eureka Server
2.1.1 主要功能
Eureka Server主要提供三个功能:
- 服务注册:服务提供者启动后,会通过Client向Server发送注册信息,Server会存储该服务的信息,其通过二层缓存机制来维护服务注册表信息;
- 提供注册表:服务消费者在调用服务时,如果Client端没有缓存注册表信息则会从Server端获取最新的注册表;
- 同步状态:Client通过心跳机制来和Server同步当前Client状态。
2.1.2 自我保护机制
默认情况下,Eureka Server在90s内没接收到某个Client的心跳则会注销该实例,但在微服务架构中网络通信面临各种问题,会导致Client状态正常,网络分区故障而导致实例被注销。
如果在某段时间内大量实例被注销,可能会严重威胁整个微服务架构的可用性,。为了解决这个问题,Eureka开发了Server的自我保护机制。Server在运行期间会统计心跳成功比例,当15min内心跳成功比例低于85%,则会进入自我保护机制。
Server进入自我保护机制后有以下功能:
- Server不再从注册列表中移除长时间没完成心跳检测的服务;
- 本Server机器仍然能接收新服务的注册和查询请求,但这些数据不会同步到其它节点上,保证当前节点可用;
- 当网络稳定时,自我保护机制期间新注册的信息会同步到其它节点中。
2.1.3 数据同步方式
Eureka的所有Server都保存了全部的注册表信息,每个Server的角色都是一致且平等的。在Eureka中节点称为Peer,其集群为Peer To Peer模式。
Server在启动时会从配置文件中获取其它的Server地址,将不存在的Server从集群中移除,新增的Server添加到注册表中。最终会启动一个定时线程每隔10min更新一次注册表的Server信息。
新启动的Server获取其它Server注册服务表的方式便是把自己作为Client注册到配置文件中的Server上,再拉取其注册服务表保存在本地。这样就能实现只要Server可以连成一条线,集群内所有的机器信息都能同步。同步操作会被Client的注册、续约和注销请求触发。
Eureka Server之间数据同步死循环是通过在http header中增加区分普通Client实例来避免同步死循环。当两个Server的数据不一致时,将会使用timestamp时间戳属性来判断使用最新的数据来覆盖老数据。
2.1.4 Server的多级缓存和Client实例过期策略
Server存储注册表信息是直接使用ConcurrentHashMap来存储信息的,其结构如下:
接口服务层,面向Eureka Client的REST接口
二级缓存层,内部有
readOnlyCacheMap
和readWriteCacheMap
,是Client所需要的数据格式数据存储层,用来存储实际的Client注册信息,是Server间的数据格式
由上到下可详细划分为:
Resources
资源层,REST接口传输服务信息一级缓存
readOnlyCacheMap
:无过期时间,保存对外输出的服务信息结构二级缓存
readWriteCacheMap
:包含失效机制,失效后将会更新readOnlyCacheMap
,保存对外输出的服务信息结构registry注册表,key是
spring.application.name
,value为服务注册信息
服务注册表信息过期策略:
- 主动过期:当Client发生注册、下线或故障时,将会把Client的所有缓存清掉;
- 定时过期:默认180s,当数据没发生更新或心跳检测180s后将会清掉缓存;
- 被动过期:没个30s会进行心跳检测,当发现两者数据不一致时,会将最新的集群数据覆盖原注册表。
但有一点需要注意,当注册表信息过期需要剔除时有个最大值限制,即一次性过期的注册信息不能过多,如果超过了阈值则会进入自我保护机制,如果没超过则会正常的删除过期信息。
2.2 Eureka Client
对于Client而言,有三个重要的机制:
- 服务注册机制(registry):Client作为服务提供者或服务消费者向服务注册中心注册自身的消息,Server将会保存到数据存储层,并更新二级缓存;
- 服务续约机制(renew):服务注册后,定时向注册中心发送续约请求,默认30s,可看作为心跳检测机制,续约成功后将会更新Server的timestamp时间戳;
- 服务注销机制(cancel):Client服务 正常停止 前会向注册中心发送注销请求,Server接收到请求将会删除Client的注册信息,更新二级缓存并同步数据到其它的Server。
上面三个机制执行后Server端都会触发同步操作,将最新数据同步给其它的Server。
Client从Server获取服务注册表数据时会先从二级缓存层中获取,未获取到则将数据加载到二级缓存中,加载时会判断选择增量同步或全量同步。
- 全量同步:从registry中加载并同步,registry是所有注册表信息存储的地方;
- 增量同步:从recentlyChangedQueue中加载并同步,recentlyChangedQueue存储上线下线的请求,心跳检测不会更新时间戳,存储到期时间默认180s,定时器频率可单独配置。
3.补充
3.1 CAP偏重点
Eureka的CAP偏重点为AP,可实现注册中心的高可用,一般被用于跨多机房部署。用来做一般对比的Zookeeper侧重点为CP,可保证数据一致性,但重新选举时无法支持高可用。
3.2 功能扩展性
Eureka的数据结构在内部已经确定,只能用来做服务注册与发现,无法实现其它的扩展功能。而Zookeeper可保存数据较为灵活,除了服务发现可支持更多功能扩展。
3.3 工作流程
- 先后启动Server,保证Server至少可连成一条直线,启动后完成Server间的服务注册表同步;
- 启动服务提供者的Client,向Server集群中的任意机器注册本机器信息,随后Server同步提供者的机器信息;
- 提供者与Server保持心跳检测,维持信息有效性;
- 启动服务消费者的Client,向Server集群的任意机器拉取并订阅提供者服务信息;
- 后续提供者发生改动消费者将会收到通知并重新拉取数据覆盖本地数据。