Spring Cloud Eureka 注册中心高可用机制

摘要

Eureka 高可用策略

一、Eureka 正常工作流程

  • Service 服务作为 Eureka Client 客户端需要在启动的时候就要向 Eureka Server 注册中心进行注册,并获取最新的服务列表数据。
  • Eureka Server 之间通过 Peer To Peer 模式复制最新数据。
  • Eureka Client 通过心跳机制定时向 Eureka Server 续约,上报自己的状态,并获取最新的服务列表数据。
  • Eureka Client 在本地有一个localRegionApps变量,用来保存从 Eureka Server 拉取回来的服务列表数据。


微信图片_20191029094323.jpg


二、主要看一下Eureka 异常场景下如何做到高可用

Eureka Client  在启动的时候发现 Eureka Server 都用不了,可能在Eureka Server启动失败,或者还没有启动,这样就会导致:

  • 客户端无法注册自己
  • 客户端无法获取服务列表

这样就无法和其他服务交互了,但是Eureka 可以通过他的备用机制解决这个问题。

Eureka Client 有一个属性:

eureka.client.backup-registry-impl

这是 Eureka 为 Client 提供的一个 fallback,在启动的时候如果访问不到 Eureka Server,就会使用备用的 registry,把 backup-reg

istry 返回的服务列表保存到本地 localRegionApps,这就可以正常和其他Service交互了。

2.jpg

2. 在服务正常运行期间 Eureka Server 出现部分不可用的场景

Client 在访问 Server 时,不会一直按照配置文件中的顺序,会随机调换顺序,这样可以防止某个Server成为访问热点。

Eureka Client 维护了一个不可用 Server 列表,如果发现某个 Server 不可用,会将其放入这个不可用列表。

Client 在访问 Server 时,会排除掉不可用列表中的Server。

比如 Eureka Client 配置了3个 Server,server1、server2、server3,假设 server3 故障了,Client 就把 server3 放入不可用列表,以后再访问 Server 时就排除掉 server3。

3. 正常运行期间 Eureka Server 全部不可用

Client 曾从 Server 正常获取过服务列表数据,本地localRegionApps 存有服务列表。

如果 Server 都挂了,那么 Client 的定时程序访问 Server 时会抛出异常,便不会更新localRegionApps变量,所以 Client 可以继续使用localRegionApps中的服务列表,与其他Service正常交互。

3.jpg

4. Eureka Client 未及时续约场景

Eureka Server 对于未续约的 Client 会认为它已经不可用了,就会从服务列表中删除。

但Client 未续约有时不是 Client 的问题,可能是因为网络因素,例如网络的抖动,所以,如果使用一刀切的判断方式,可能出现误判,Eureka 为了避免出现误判,设计了一种自我保护机制 Self Preservation

如果大面积出现了 Client 未续约的情况,不大可能这么多 Client 同时挂掉,为防止误判,就会开启自我保护,不会剔除 Client 实例,从而保护注册信息。

具体什么情况开启自我保护呢,可以配置一个阈值(默认值为 15%),只有在最近一分钟接收到的续约次数小于阈值的时候开启。

三、总结

Eureka 通过如下机制来达到高可用:

  • backup-registry

即使 client 启动的时候 Eureka Server 都不可用也没关系,通过备用 registry 可以拿到服务列表。

  • 不可用 Eureka Server 列表

client 会维护一个不可用server列表,避免访问失效的server。

  • 服务列表本地缓存

在 Eureka Server 都失效时,本地的服务列表不会更新,使其依然可用,也就可以继续使用其中的service信息。

  • Self Preservation

自我保护机制防止误删除client。









IT家园
IT家园

网友最新评论 (0)

发表我的评论
取消评论
表情