-
Notifications
You must be signed in to change notification settings - Fork 46
集成Java客户端
客户端用于协助应用获取配置,需要Java8及以上。
注意:Java客户端已经上传到maven中央库,引入依赖即可使用。
提供两种集成方式:
- 直接集成客户端(非spring-boot应用)
- 通过Starter集成客户端(spring-boot应用)
客户端提供最核心也是最原子的能力。
<dependency>
<groupId>org.antframework.configcenter</groupId>
<artifactId>configcenter-client</artifactId>
<version>1.7.3</version>
</dependency>客户端就是Java类,直接new就可以,只是需要传给它相应参数。可以同时创建多个客户端,每个客户端之间互不影响。
// 创建客户端
ConfigContext configContext = new ConfigContext(
"customer", // 主体应用id(必填)
"dev", // 环境id(必填)
null, // 目标(选填:用于标记客户端,实现配置的灰度发布,可以为null)
"http://47.108.55.170:6220", // 服务端地址(必填)(地址格式为http://{IP}:6220,这里使用演示环境的服务端地址,可以直接运行)
"/var/apps/configcenter", // 工作目录(选填:用于存放缓存文件。null表示不使用缓存文件(既不读取缓存文件中的配置,也不写配置到缓存文件))
null, // 管理员id(选填:null表示不使用管理员签名)
null); // 管理员密钥(选填:null表示不使用管理员签名)
// 获取会员系统的配置
Config customerConfig = configContext.getConfig("customer");
// 现在就可以获取会员系统的所有配置项了(下面获取redis地址配置)
String redisHost = customerConfig.getProperties().getProperty("redis.host");
// 不仅可以获取会员系统的配置,还可以获取其他应用的配置,不过只能获取其他应用的公开配置,
// 因为当前主体应用为会员系统,现在是以会员系统为视角获取其他应用的配置
// 下面是获取账务系统的公开配置
Config accountConfig = configContext.getConfig("account");
// 还可以注册配置变更监听器
customerConfig.getListeners().addListener(new org.antframework.configcenter.client.ConfigListener() {
@Override
public void onChange(List<ChangedProperty> changedProperties) {
for (ChangedProperty changedProperty : changedProperties) {
logger.info("监听到会员系统的配置有变更:{}", changedProperty);
}
}
});
// 开启接收服务端推送的配置变更通知
configContext.listenServer();
// 系统正常运行...
// 当系统运行结束时,需关闭客户端释放相关资源
configContext.close();Starter本质上还是依赖于上面介绍的客户端的能力,只不过根据SpringBoot场景提供了更优雅的集成方式,也提供了更便捷的功能(可自动刷新@Value占位符和@ConfigurationProperties配置类)。
注意:本Starter既支持SpringBoot v2.x,也支持SpringBoot v1.x
- SpringBoot v2.x应用引入:
<dependency>
<groupId>org.antframework.configcenter</groupId>
<artifactId>configcenter-spring-boot-starter</artifactId>
<version>1.7.3</version>
</dependency>- SpringBoot v1.x应用引入:
<dependency>
<groupId>org.antframework.configcenter</groupId>
<artifactId>configcenter-spring-boot-starter</artifactId>
<version>1.7.3</version>
<exclusions>
<exclusion>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.6.Final</version>
</dependency>在应用的配置文件application.properties或application-xxx.properties中配置:
# 必填:应用id(配置key:spring.application.name或者configcenter.app-id)
spring.application.name=customer
# 必填:环境id(配置key:spring.profiles.active或者configcenter.profile-id)
spring.profiles.active=dev
# 必填:configcenter服务端的地址(地址格式为http://{IP}:6220,这里使用演示环境的服务端地址,可以直接运行)
configcenter.server-url=http://47.108.55.170:6220
# 当configcenter服务端开启了客户端验权功能(防止生产环境配置泄漏风险),则以下两个参数必填;否则选填(如果要填就必须填对)
# 管理员id(默认不使用管理员签名)
configcenter.manager-id=
# 管理员密钥(默认不使用管理员签名)
configcenter.secret-key=
# 选填:是否启用configcenter(默认启用)
configcenter.enable=true
# 选填:目标(用于标记客户端,实现配置的灰度发布,默认为客户端所在主机的IP地址)
configcenter.target=192.168.0.1
# 选填:缓存目录("false"表示关闭缓存文件功能,默认为:/var/apps/${应用id}/configcenter)
configcenter.home=/tmp/configcenter
# 选填:是否开启定期同步服务端的配置(默认为开启)
configcenter.auto-refresh-configs.enable=true
# 选填:定期同步服务端的配置的周期(单位:毫秒。默认为5分钟同步一次)
configcenter.auto-refresh-configs.period=300000
# 选填:configcenter配置优先于指定的配置源(默认为最低优先级)。可填入:commandLineArgs(命令行)、systemProperties(系统属性)、systemEnvironment(系统环境)、random(随机数。比配置文件优先级高)等等
configcenter.prior-to=random
# 选填:是否开启自动刷新@Value占位符(默认为开启)
ant.env.refresh-placeholders.enable=true
# 选填:是否开启自动刷新@ConfigurationProperties配置类(默认为开启)
ant.env.refresh-properties.enable=true
# 选填:指定需自动刷新的@ConfigurationProperties配置类的全名,如果存在多个配置类则使用“,”相隔(如果在配置类上已经打上@Refreshable注解,则可以不用在此配置,也会支持自动刷新)
ant.env.refresh-properties.refreshable-classes=com.demo.AProperties,com.demo.BProperties为了启动报错能够输出日志,默认情况本starter启动顺序在日志之后,弊端就是在configcenter配置的日志相关的配置不会生效(因为日志已经启动好了)。如果希望日志相关配置生效,可通过在启动命令中指定本starter的启动优先级高于日志:-Dconfigcenter.init-order=-2147483633
可以通过Spring的@Value注解、Environment.getProperty(java.lang.String)获取配置,而不用直接使用客户端。也可以通过ConfigContexts.getConfig(java.lang.String)获取配置。
// 通过@Value获取配置(配置变更后,会自动刷新redisHost字段)
@Value("${redis.host}")
private String redisHost;
@Autowired
private Environment environment;
public void doBiz() {
// 通过environment获取配置
String redisHostFromEnvironment = environment.getProperty("redis.host");
// 通过ConfigContexts.getConfig(java.lang.String)获取配置
Config config = ConfigContexts.getConfig("customer");
String redisHostFromConfig = config.getProperties().getProperty("redis.host");
}当配置变更后,可以通过environment.getProperty(java.lang.String)和ConfigContexts.getConfig(java.lang.String)获取到最新配置。同时默认情况下,也会自动刷新对应的@Value占位符和开启了刷新功能的@ConfigurationProperties配置类。
- 自动刷新@Value占位符
// 配置变更后,自动刷新redisHost字段
@Value("${redis.host}")
private String redisHost;
// 配置变更后,自动重新调用setPort方法
@Value("${redis.port}")
public void setPort(int port){
}- 自动刷新@ConfigurationProperties配置类
@ConfigurationProperties("myDemo")
@Refreshable // 配置变更后,自动刷新(如果没有打上@Refreshable注解,则需要通过配置“ant.env.refresh-properties.refreshable-classes=com.demo.AProperties”指定本配置类需要被自动刷新)
public class AProperties {
private String key1;
private int key2;
// 省略getter、setter
}可以监听当前应用的配置变更事件:
// 监听当前应用的配置变更事件
@ConfigListener
public class MyConfigListener {
// 监听所有配置
@ListenConfigChanged
public void listenAll(List<org.antframework.boot.env.listener.ChangedProperty> changedProperties) {
// TODO 具体业务代码
}
// 监听redis配置(prefix表示需要监听的配置前缀。当以“redis.”开头的配置项被修改时,
// 被修改的配置会作为入参调用本方法。比如redis.host、redis.port等被修改时都会调用本方法)
@ListenConfigChanged(prefix = "redis")
public void listenRedis(List<org.antframework.boot.env.listener.ChangedProperty> changedProperties) {
// TODO 具体业务代码
}
// 监听具体某一个配置项(注意:入参不再是List<ChangedProperty>,而是ChangedProperty)
@ListenConfigChanged(prefix = "redis.host")
public void listenRedisHost(org.antframework.boot.env.listener.ChangedProperty changedProperty) {
// TODO 具体业务代码
}
}也可以监听其他应用的公开配置变更事件:
// 监听账务系统的公开配置变更事件
@ConfigListener(appId = "account")
public class MyConfigListener {
// 监听所有配置
@ListenConfigChanged
public void listenAll(List<org.antframework.boot.env.listener.ChangedProperty> changedProperties) {
// TODO 具体业务代码
}
}