一图理解Apollo配置中心,配置变更如何及时通知客户端的

2023-10-25 19:06:57 浏览数 (2)


Apollo 2.2.0-SNAPSHOT

配置变更及时通知客户端流程:

1、Apollo客户端启动时,会启动异步线程,循环发起一个Http Long Polling请求到Config Service的notifications/v2接口(NotificationControllerV2),http请求超时默认90 秒(should be longer than server side's long polling timeout, which is now 60 seconds)。

(com.ctrip.framework.apollo.internals.RemoteConfigRepository#RemoteConfigRepository)

(com.ctrip.framework.apollo.internals.RemoteConfigLongPollService#startLongPolling)

(com.ctrip.framework.apollo.internals.RemoteConfigLongPollService#doLongPollingRefresh)

2、Config Service的notifications/v2接口接收到客户端上面发起的请求,不会立即返回结果,而是通过Spring DeferredResult把请求挂起

如果在60秒内没有该客户端关心的配置发布,那么会返回Http状态码304给客户端。

Config Service会把DeferredResult放到本地缓存中

代码语言:javascript复制
private final Multimap<String, DeferredResultWrapper> deferredResults =
      Multimaps.synchronizedSetMultimap(TreeMultimap.create(String.CASE_INSENSITIVE_ORDER, Ordering.natural()));

其中key为客户端请求相关信息拼接的key。变更通知时会根据key从缓存中获取DeferredResult,设置值,让挂起的请求返回给客户端,达到通知客户端的功能

(com.ctrip.framework.apollo.configservice.controller.NotificationControllerV2#pollNotification)

3、如果Admin Service配置发布时,会把更新通知消息入库

(com.ctrip.framework.apollo.adminservice.controller.ReleaseController#updateAndPublish)

(com.ctrip.framework.apollo.biz.message.DatabaseMessageSender#sendMessage)

4、Config Service后台异步线程默认每秒扫描更新通知消息表,如果有配置发布动作,会从步骤2中的DeferredResult缓存获取对应的DeferredResult,并让NotificationControllerV2会调用DeferredResult的setResult方法,传入有配置变化的namespace信息,同时该请求会立即返回。客户端从返回的结果中获取到配置变化的namespace后,会立即请求Config Service获取该namespace的最新配置。

(com.ctrip.framework.apollo.configservice.ConfigServiceAutoConfiguration.MessageScannerConfiguration#releaseMessageScanner)

(com.ctrip.framework.apollo.configservice.controller.NotificationControllerV2#handleMessage)

0 人点赞