通过上篇文章 分布式部署 的介绍 ,接下来就可以在程序中接入 Apollo 客户端进行调用,这边文章主要介绍在 Java 和 .NET Core 中如何接入,更多可参考 其它语言客户端接入指南。
创建应用
在客户端接入 Apollo 之前,先在 Apollo 管理后台创建一个 demo-apollo 应用,并添加配置项,如下:

创建 Namespace
在 Apollo 中,还可以通过建 Namespace 供应用进行关联使用。比如:有 N 个服务,每个服务有自己的配置信息,那就需要在 Apollo 中建 N 个应用,每个服务引用对应的应用配置,但有的配置可能是所有或部分服务都需要的,这时候就可以考虑创建一个公共的 Namespace 配置,需要这些配置信息的应用引用此 Namespace 即可。
通过应用右侧的 添加 Namespace 或者顶部的 管理员工具 进行 Namespace 的创建,然后在 Namespace 中添加配置项。

nginx 代理 Meta Server
在 分布式部署 介绍中启动了两个 Meta Server 实例,为了接下来客户端配置 Meta Server 方便(测试下来 .NET 下并不支持逗号分隔的方式),通过 nginx 做一层代理(nginx 只是一种选择),后面可直接使用 http://apollo.beckjin.com:8888。
1 | upstream apollo-server{ |
Java
- 创建一个 Spring Boot 项目,添加
Spring Web Starter依赖 添加 apollo-client 依赖
1
2
3
4
5<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.4.0</version>
</dependency>基于前面创建好的应用 demo-apollo 和 Namespace TEST1.Common,在 application.properties 中添加 Apollo 相关配置。(如果不需要本应用外的 Namespace,只需要配置 app.id)
1
2
3
4
5# 对应 Apollo 中应用的 AppId
app.id=demo-apollo
apollo.bootstrap.enabled=true
# 添加 application 本身 和 TEST1.Common Namespace 的配置
apollo.bootstrap.namespaces=application,TEST1.Common注意:namespaces 中的顺序是有讲究的,如果 application 和 TEST1.Common 中有相同 key ,那么 application 会覆盖掉 TEST1.Common 中相同 key 的值。
将配置信息注入到 ConfigBean 的属性上
1
2
3
4
5
6
7
8
9
10
11
12
13
14@Getter
@Setter
@ToString
public class ConfigBean {
@Value("${name:name取不到时的默认值}")
private String name;
@Value("${company:name取不到时的默认值}")
private String company;
@Value("${url:url取不到时的默认值}")
private String url;
}1
2
3
4
5
6
7
8
9@Configuration
@EnableApolloConfig
public class AppConfig {
@Bean
public ConfigBean getConfigBean() {
return new ConfigBean();
}
}添加 @Configuration、@EnableApolloConfig,标记配置信息来源 Apollo,@Value 指定 Apollo 中对应 key 的值映射到什么属性。
在 ConfigBean 中使用了 lombok,简化属性的 Get、Set 生成,使用 lombok 需要在 IDEA 中添加 Lombok plugin
添加获取配置信息接口
1
2
3
4
5
6
7
8
9
10
11
12@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private AppConfig appConfig;
@GetMapping(value = "/get-config")
public ConfigBean getConfig() {
return appConfig.getConfigBean();
}
}在启动项目前需要设置 VM options,指定 env 和 appllo meta:

启动并调用接口

.NET Core
Apollo .NET 客户端支持 .NET Framework 和 .NET Core ,这里以 .NET Core 为例来介绍,更多可参考:apollo.net 中的 Demo。
创建一个 .NET Core API 项目,添加
Com.Ctrip.Framework.Apollo.ConfigurationNuGet 包在 appsettings.json 添加 Apollo 配置信息
1
2
3
4
5
6
7{
"apollo": {
"AppId": "demo-apollo", // 应用id
"MetaServer": "http://apollo.beckjin.com:8888/",
"Env": "PRO"
}
}修改 Program.cs
1
2
3
4
5
6
7public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder => builder
.AddApollo(builder.Build().GetSection("apollo"))
.AddNamespace("TEST1.Common") // 引入 TEST1.Common 命名空间
.AddDefault()) // 默认 namespace: application
.UseStartup<Startup>();以上配置如果 Default 中具有 TEST1.Common 相同的 key,那么 Default 会覆盖掉 TEST1.Common 中相同 key 的值。
添加获取配置信息接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class ValuesController : ControllerBase
{
private IConfiguration _configration;
public ValuesController(IConfiguration configuration)
{
_configration = configuration;
}
[HttpGet]
public async Task<object> Get()
{
await Task.CompletedTask;
return new
{
Name = _configration["name"],
Company = _configration["company"],
Url = _configration["url"]
};
}
}服务启动成功后,配置信息会注入到 IConfiguration 中,可以从容器中的 IConfiguration 对象获取具体配置。
启动并调用接口

在之前的介绍中提到了客户端拉取到配置信息之后,会在本地文件中进行缓存,目的是在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置。经过以上测试,可以在以下目录进行查看缓存文件:
1 | Mac/Linux: /opt/data/{appId}/config-cache |
在缓存文件存的情况下,可以将 Apollo 服务全部 kill 进行测试,服务依然能拉起到配置信息。
Apollo 修改配置发布后是实时生效的,但有些情况下并不能反应出来,主要原因还是在代码的实现上,如果存在这样的情况,需要看看代码的具体实现。比如:配置信息赋给了静态变量、程序内部有自己的缓存策略等。