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)