简介
- 服务端:提供服务注册服务,缓存服务信息
- 客户端:服务提供者、服务消费者。会拉取、更新和缓存 Eureka Server 中的服务信息
Eureka Client 和 Eureka Server 可以使用 JSON/XML 格式进行通讯。在默认情况下 Eureka Client 使用压缩 JSON 格式来获取注册列表的信息。
工作流程
1、Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息
2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务
3、Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常
4、当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例
5、Eureka Server 在启动阶段或者失败的比例在15分钟内超过阀值(85%) 即会进入自我保护机制。
6、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式
7、Eureka Client 定时30s全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地
8、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存
9、Eureka Client 获取到目标服务器信息,发起服务调用
10、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除
服务剔除机制
- 如果开启了自我保护机制,不做操作,不剔除服务
- 如果未开启,根据 lastUpdateTimestamp 收集已过期的服务,加入到List集合中
- 服务剔除机制开启,则Eureka服务端并不会直接剔除所有已过期的服务,而是通过随机数的方式进行剔除,避免自我保护开启之前将所有的服务(包括正常的服务)给剔除。
自我保护机制
统计心跳失败比例在 15 分钟之内是否超过阀值(85%),超过即会进入自我保护机制。
(1 不再从注册列表中移除过期服务
(2 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
(3 当网络稳定时,当前实例新的注册信息会被同步到其它节点中
集群原理
单区域集群
多实例部署在同一个数据中心(或同一地域)内
通过相互注册的方式来实现高可用性
服务信息在多实例间同步
集群互相之间通过replicate来同步数据
不区分主从节点
多区域集群
多实例部署在不同的数据中心(或不同的地域)中
为了保证服务的高可用性和低延迟,Eureka Server 会通过 region(地理位置) 和 zone(机房) 的概念来实现服务的就近调用和故障隔离
集群互相之间通过replicate来同步数据
不区分主从节点
服务注册(心跳/续约)
- 客户端默认每30s发送一次心跳
- renew方法会发送一个心跳数据到服务端,包括应用名、instanceInfo、instanceInfo的id等
- 200表示成功,如果返回404则证明服务未注册,需要注册服务
- register方法向服务端的注册信息instanceInfo。包括服务名、ip、端口、唯一实例ID等信息。
- 返回204表示注册成功
服务端保存服务
- 双层map保存客户端服务。ConcurrentHashMap<String, Map<String, Lease
>> - 外层map:key是appName,value是服务实例map
- 内层map:key是服务实例编号,value是服务实例
服务拉取
- 客户端默认30秒全量拉取一次信息
- 每次拉取后刷新本地已保存的信息,需要使用时直接从本地直接获取
- 获取的方式有两种,全量获取和增量获取。第一次全量获取,后续增量获取;获取到服务器注册实例信息后,保存、或跟新到本地
参考资料
[1]https://blog.csdn.net/u012105931/article/details/104659073
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接,感谢各位看官!!!
本文出自:monkeyGeek
座右铭:生于忧患,死于安乐
欢迎志同道合的朋友一起交流、探讨!
