5-2Apollo Java客户端 · SpringCloud微服务实战 · 看云
导航
本节代码地址
GitHub:https://github.com/xuyisu/fw-sping-cloud/tree/master/fw-cloud-config-center/fw-cloud-apollo-client
Apollo支持API方式和Spring整合方式,该怎么选择用哪一种方式?
-
API方式灵活,功能完备,配置值实时更新(热发布),支持所有Java环境。
-
Spring方式接入简单,结合Spring有N种酷炫的玩法,如
- Placeholder方式:
- 代码中直接使用,如:
@Value("${someKeyFromApollo:someDefaultValue}") - 配置文件中使用替换placeholder,如:
spring.datasource.url: ${someKeyFromApollo:someDefaultValue} - 直接托管spring的配置,如在apollo中直接配置
spring.datasource.url=jdbc:mysql://localhost:3306/somedb?characterEncoding=utf8
- 代码中直接使用,如:
- Spring boot的@ConfigurationProperties方式
- 从v0.10.0开始的版本支持placeholder在运行时自动更新(v0.10.0之前的版本在配置变化后不会重新注入,需要重启才会更新)
- Placeholder方式:
-
Spring方式也可以结合API方式使用,如注入Apollo的Config对象,就可以照常通过API方式获取配置了:
@ApolloConfig private Config config;
本节通过Spring Boot 和Placeholder方式 来演示Apollo java 客户端和Apollo的集成
1. 客户端的设计
上图简要描述了Apollo客户端的实现原理:
- 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。(通过Http Long Polling实现)
- 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。
- 这是一个fallback机制,为了防止推送机制失效导致配置不更新
- 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
- 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property:
apollo.refreshInterval来覆盖,单位为分钟。
- 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
- 客户端会把从服务端获取到的配置在本地文件系统缓存一份
- 在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置
- 应用程序可以从Apollo客户端获取最新的配置、订阅配置更新通知
2. 新建客户端
本节我们通过新建一个项目来单独演示Apollo 的客户端连接
3. 引入maven 配置
Apollo的客户端jar包已经上传到中央仓库,应用在实际使用时只需要按照如下方式引入即可,我们直接使用最新稳定版本的包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.5.1</version>
</dependency>
</dependencies>
4. 添加应用配置
设置自己的meta连接地址,生产建议使用域名来连接,配置Apollo连接先于日志加载到容器中,配置连接的app.id和环境
apollo:
meta: http://${meta_ip}:8080
bootstrap:
enabled: true
namespaces: application
app:
id: fwcloud
env: dev
5. 配置控制层
这里我们配置一个get接口,用于获取通过Placeholder方式拿到的Apollo配置信息。
@RestController
@RequestMapping("/config")
public class ApolloController {
@Value("${fwcloud.config.name:test}")
private String configName;
@RequestMapping("/get")
public String get() {
return configName;
}
}
6. 配置启动类
需要在启动类中添加@EnableApolloConfig注解
@SpringBootApplication
@EnableApolloConfig
public class FwApolloClientApplication {
public static void main(String[] args) {
SpringApplication.run(FwApolloClientApplication.class, args);
}
}
7. 在Apollo 新建应用
我们新建一个app.id为fwcloud的应用
配置内容如下
点击发布
8. 启动客户端
配置发布以后,我们启动应用,可以看到,DefaultApplicationProvider 从配置中加载app.id信息,DefaultServerProvider 从配置中加载env信息,然后通过Meta 地址拉去客户端的配置信息。
2020-03-08 16:09:09.149 INFO 16608 --- [ main] c.c.f.f.i.p.DefaultApplicationProvider : App ID is set to fwcloud by app.id property from System Property
2020-03-08 16:09:09.157 INFO 16608 --- [ main] c.c.f.f.i.p.DefaultServerProvider : Environment is set to null. Because it is not available in either (1) JVM system property 'env', (2) OS env variable 'ENV' nor (3) property 'env' from the properties InputStream.
2020-03-08 16:09:09.209 INFO 16608 --- [ main] c.c.f.a.i.DefaultMetaServerProvider : Located meta services from apollo.meta configuration: http://127.0.0.1:8080!
2020-03-08 16:09:09.212 INFO 16608 --- [ main] c.c.f.apollo.core.MetaDomainConsts : Located meta server address http://127.0.0.1:8080 for env UNKNOWN from com.ctrip.framework.apollo.internals.DefaultMetaServerProvider
2020-03-08 16:09:09.459 INFO 16608 --- [ main] com.yisu.FwApolloClientApplication : Starting FwApolloClientApplication on BZCKR7HP2 with PID 16608 (D:\workspace\mywork\fw-sping-cloud\fw-cloud-config-center\fw-cloud-apollo-client\target\classes started by xsh11040 in D:\workspace\mywork\fw-sping-cloud)
2020-03-08 16:09:09.460 INFO 16608 --- [ main] com.yisu.FwApolloClientApplication : No active profile set, falling back to default profiles: default
2020-03-08 16:09:10.315 INFO 16608 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8774 (http)
浏览器或Postman输入localhost:8774/config/get
修改fwcloud.config.name的值为apollo20200308,然后点击发布
可以在控制台上看到值被修改的信息
2020-03-08 16:17:49.601 INFO 15204 --- [Apollo-Config-1] c.f.a.s.p.AutoUpdateConfigChangeListener : Auto update apollo changed value successfully, new value: apollo20200308, key: fwcloud.config.name, beanName: apolloController, field: com.yisu.apollo.client.controller.ApolloController.configName
浏览器或Postman输入localhost:8774/config/get再次请求,可以看到结果已经发生变更







