文章目录
Apollo
简介
一个远程配置中心,通过长连接、轮训的方式将本地应用于远程配置中心通信,对本地应用的引入属性添加代理或包装以达到实时更新的功能。更高版本支持开启各种监控。
java-maven引包
java
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>2.4.0</version>
</dependency>
- 服务端已有部署apollo服务(configService、adminService、Eureka、configDb-可以使用应用库、metaServer)
Java程序指定配置
参数说明
| 属性名 | 说明 | 默认值 |
|---|---|---|
| apollo.refreshInterval | 客户端拉取服务端最新配置的频率,单位-分钟 | 5 |
| apollo.meta | metaServer地址 | |
| apollo.cache-dir | 调整本地缓存地址 | /opt/data |
| env | 环境,大小写不敏感 | |
| apollo.cluster/idc | 集群配置,可以根据不同数据中心做不同集群配置 | |
| apollo.access-key.secret | 访问密钥 | |
| apollo.label | 用于非固定IP应用匹配灰度规则的标签(k8s) | |
| apollo.bootstrap.enabled | 使配置在更早的阶段注入,比如使用@ConditionalOnProperty的场景或者是有一些spring-boot-starter在启动阶段就需要读取配置做一些事情 |
|
| apollo.bootstrap.eagerLoad.enabled | Apollo配置加载提到初始化日志系统之前(1.2.0+) | |
| spring.config.import | 通过 Config Data Loader 模式来加载配置,Spring Boot 2.4 +,如果使用需要额外引包 | |
| apollo.autoUpdateInjectedSpringProperties | 自动更新spring的注入属性 | true |
使用option参数注入
sh
-Dapollo.env=DEV # 指定环境
-Dapollo.cluster=xxx # 指定集群
-Dapollo.bootstrap.namespaces=application,application-dev.yml # 指定namespace
-Dapollo.bootstrap.enabled=true # 以bootstrap方式启动,而不是以配置启动
-Dapollo.bootstrap.eagerLoad.enabled=true #加载时机提前,以覆盖log配置
-Dapollo.meta=http://localhost:8080 #指定meta地址,可指定多个,使用,分割
-Dapollo.configService=http://localhost:8080 #指定config地址
-Dapp.id=cloud-demo-data # 指定应用ID
关于configurationProperties不及时刷新的解决
- 根据官方说明,使用
ApolloConfigChangeListener和RefreshScope可更新指定配置,springboot版本必须支持RefreshScope,详见官方示例 - 作者在更新一个旧有项目时,打算更新所有的
ConfigurationProperties,代码如下,此种方式与RefreshScope方式冲突,ConfigurationProperties不可添加@RefreshScope
java
@Slf4j
@Component
public class ApolloConfig {
@Value("${apollo.bootstrap.namespaces}")
private String namespaces;
@Resource
private ApplicationContext applicationContext;
@PostConstruct
public void init(){
// 支持多个namespace
List<String> list = Arrays.asList(namespaces.split(","));
for (String namespace : list) {
Config config = ConfigService.getConfig(namespace.trim());
config.addChangeListener(change -> {
log.info("change: {} ,{}",change.getNamespace(),change.changedKeys());
// 发布更新Environment事件
applicationContext.publishEvent(new EnvironmentChangeEvent(change.changedKeys()));
});
}
}
}
关于更新动态数据源的使用
- 官方hikari示例,其他数据源可参考示例进行改造
其他说明
- apollo配置在1.9之前和之后版本对于某些配置的key有调整,1.9之前使用小驼峰:
cacheDir,1.9之后使用分隔符:cache-dir - apollo有本地缓存功能,默认缓存地址为
/opt/data/{*appId*}/config-cache,C:\opt\data\{*appId*}\config-cache,注意权限问题,基于本地缓存功能可开启本地开发模式