apollo配置中心如何实现拉取和推送的

转自:Apollo

1.介绍

apollo配置中心如何实现拉取和推送的_第1张图片

拉取和配置变更推送:

  1. 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。长连接实际上我们是通过Http Long Polling实现的,具体而言:
    1. 客户端发起一个Http请求到服务端。(死循环里拉取)
    2. 服务端会保持住这个连接60秒
      1. 如果在60秒内有客户端关心的配置变化,被保持住的客户端请求会立即返回,并告知客户端有配置变化的namespace信息,客户端会据此拉取对应namespace的最新配置
      2. 如果在60秒内没有客户端关心的配置变化,那么会返回Http状态码304给客户端
    3. 客户端在收到服务端请求后会立即重新发起连接,回到第一步

2. 另外还有客户端定时拉取的兜底机制。为了防止推送机制失效导致配置不更新。

  • 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
  • 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟。

2.为什么不是长连接?

  • 客户端连接数较多。考虑到会有数万客户端向服务端发起长连,在服务端我们使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求。
  • 连接稳定性的考虑,长轮询在传输层本质上还是走的 TCP 协议,如果服务端假死、fullgc 等异常问题,或者是重启等常规操作,长轮询没有应用层的心跳机制,仅仅依靠 TCP 层的心跳保活很难确保可用性,所以一次长轮询设置一定的超时时间也是在确保可用性。

apollo客户端的长轮询机制的原理 - luzhouxiaoshuai - 博客园

https://zhuanlan.zhihu.com/p/351196920,这个链接里给的代码例子简单好理解。

3.为什么不是发布订阅?

apollo配置中心如何实现拉取和推送的_第2张图片

你可能感兴趣的:(http)