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

一、Eureka 正常时是如何工作的

  • Service 作为 Eureka Client 需要在启动的时候向 Eureka Server 进行注册,并获取最新的服务列表数据。

  • Eureka Server 之间通过 Peer To Peer 模式复制最新数据。

  • Eureka Client 通过心跳机制定时向 Eureka Server 续约,上报自己的状态,并获取最新的服务列表数据。

  • Eureka Client 在本地有一个 localRegionApps 变量,用来保存从 Eureka Server 拉取回来的服务列表数据。

二、Eureka 异常场景下的策略

1. Client 在启动的时候就没有可用 Server

Eureka Client 启动的时候发现 Eureka Server 都用不了,导致:

  • 无法注册自己

  • 无法获取服务列表

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

Eureka Client 有一个属性:

eureka.client.backup-registry-impl

这是 Eureka 为 Client 提供的一个 fallback,在启动的时候如果访问不到 Eureka Server,就会使用备用的 registry,把 backup-registry 返回的服务列表保存到本地 localRegionApps ,这就可以正常和其他Service交互了。

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正常交互。

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。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章