在之前的文章《揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?》中,我们提到Apollo的可以支持多环境、多集群灵活配置。今天我们来探究下Apollo是如何实现环境隔离的。
Apollo 实现环境隔离的核心源码剖析
1. 客户端加载指定环境的apollo服务端配置
在 Apollo 客户端源码中,ConfigServiceLocator 类扮演着关键角色。当微服务启动时,它会负责定位和加载配置服务。在这个过程中,会读取系统环境变量。核心方法是tryUpdateConfigServices,该方法有一个核心逻辑会获取meta.service的url,在获取的过程中,会先获取环境变量m_env。
以下是代码片段。
// 获取环境变量的值,test,ontest,prod等
m_env = System.getProperty("env");
if (!Utils.isBlank(m_env)) {
m_env = m_env.trim();
logger.info("Environment is set to [{}] by JVM system property 'env'.", m_env);
return;
}
// 获取meta.service的url
String url = this.assembleMetaServiceUrl();
HttpRequest request = new HttpRequest(url);
int maxRetries = 2;
Throwable exception = null;
// 采用重试机制拉取apollo服务端的配置,并缓存到本地
for(int i = 0; i < maxRetries; ++i) {
HttpResponse<List<ServiceDTO>> response = this.m_httpClient.doGet(request, this.m_responseType);
transaction