前言
系统开发过程中往往伴随着各种各样的配置,系统配置一旦设置就不再变更,业务配置随着业务发展变化需要经常变更。经常变更的配置如果写死在配置文件中,一来无法及时响应业务需求;二来会让系统失去灵活性,每次修改配置都需要重新发布应用。
基于存在的痛点问题,急需一种快速、方便修改配置的解决方案:apollo
对于apollo我们同样也存在着一些疑惑:
- 应用程序通过什么方式来获取配置信息?
- 配置信息发生变更后,应用程序又是如何及时进行更新的?
为了解决上面的疑惑,先从客户端看起
客户端
1. 主动拉取配置
应用程序客户端要想获取配置信息,可以采用主动方式去拉取
1.1 基于命名空间创建远程配置仓库
public RemoteConfigRepository(String namespace) {
gson = new Gson();
// 1.主动同步配置(客户端应用启动的时候执行)
this.trySync();
// 2.固定周期主动拉取配置(5分钟一次)
this.schedulePeriodicRefresh();
// 3.开启长轮询,询问服务器端是否有最新的配置,如果有最新的配置,客户端会主动去拉取最新配置;否则等待一段时间后继续询问
this.scheduleLongPollingRefresh();
}
1.2 查询Config Service服务地址
private String assembleMetaServiceUrl() {
// 1.获取metaServer地址(配置文件中指定)
String domainName = m_configUtil.getMetaServerDomainName();
// 2.应用唯一id
String appId = m_configUtil.getAppId();
// 3.本地ip
String localIp = m_configUtil.getLocalIp();
Map<String, String> queryParams = Maps.newHashMap();
queryParams.put("appId", queryParamEscaper.escape(appId));
if (!Strings.isNullOrEmpty(localIp)) {
queryParams.put("ip", queryParamEscaper.escape(localIp));
}
// 4.请求地址
return domainName + "/services/config?" + MAP_JOINER.join(queryParams);
}
由于meta server和config service部署在一起,那么通过meta server的地址 + /services/config路径就可以获取config service服务对应配置列表信息【config service可部署多台,会注册到eureka中,mata server又包装了eureka】
HttpResponse<List<ServiceDTO>> response = m_httpUtil.doGet(request, m_responseType);
得到服务配置列表后,以随机的方式主动拉取配置信息
private ApolloConfig loadApolloConfig() {
// 1.config service服务配置列表
List<ServiceDTO> configServices = getConfigServices();
String url = null;
retryLoopLabel:
for (int i = 0; i < maxRetries; i++) {
List<ServiceDTO> randomConfigServices = Lists.newLinkedList(configServices);
// 2.对服务配置列表进行洗牌
Collections.shuffle(randomConfigServices);
//Access the server which notifies the client first