通过上篇文章 分布式部署 的介绍 ,接下来就可以在程序中接入 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
。
upstream apollo-server{
server 192.168.199.133:8080;
server 192.168.199.133:8081;
}
server {
listen 8888;
# 已在本地 hosts 中添加: 127.0.0.1 apollo.beckjin.com
server_name apollo.beckjin.com;
location / {
proxy_pass http://apollo-server;
}
}
Java
创建一个 Spring Boot 项目,添加
Spring Web Starter
依赖-
添加 apollo-client 依赖
<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)
# 对应 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 的属性上
@Getter @Setter @ToString public class ConfigBean { @Value("${name:name取不到时的默认值}") private String name; @Value("${company:name取不到时的默认值}") private String company; @Value("${url:url取不到时的默认值}") private String url; }
@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
-
添加获取配置信息接口
@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.Configuration
NuGet 包-
在 appsettings.json 添加 Apollo 配置信息
{ "apollo": { "AppId": "demo-apollo", // 应用id "MetaServer": "http://apollo.beckjin.com:8888/", "Env": "PRO" } }
-
修改 Program.cs
public 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 的值。
-
添加获取配置信息接口
public 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 对象获取具体配置。
-
启动并调用接口
在之前的介绍中提到了客户端拉取到配置信息之后,会在本地文件中进行缓存,目的是在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置。经过以上测试,可以在以下目录进行查看缓存文件:
Mac/Linux: /opt/data/{appId}/config-cache
Windows: C:\opt\data\{appId}\config-cache
在缓存文件存的情况下,可以将 Apollo 服务全部 kill 进行测试,服务依然能拉起到配置信息。
Apollo 修改配置发布后是实时生效的,但有些情况下并不能反应出来,主要原因还是在代码的实现上,如果存在这样的情况,需要看看代码的具体实现。比如:配置信息赋给了静态变量、程序内部有自己的缓存策略等。