Skip to content

集成Java客户端

钟勋 edited this page Mar 24, 2022 · 32 revisions

简介

客户端用于协助应用获取配置,需要Java8及以上。

注意:Java客户端已经上传到maven中央库,引入依赖即可使用。

提供两种集成方式:

  • 直接集成客户端(非spring-boot应用)
  • 通过Starter集成客户端(spring-boot应用)

1. 直接集成客户端

客户端提供最核心也是最原子的能力。

1.1 引入客户端依赖

<dependency>
  <groupId>org.antframework.configcenter</groupId>
  <artifactId>configcenter-client</artifactId>
  <version>1.7.3</version>
</dependency>

1.2 使用客户端

客户端就是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();

2. 通过Starter集成客户端

Starter本质上还是依赖于上面介绍的客户端的能力,只不过根据SpringBoot场景提供了更优雅的集成方式,也提供了更便捷的功能(可自动刷新@Value占位符和@ConfigurationProperties配置类)。

注意:本Starter既支持SpringBoot v2.x,也支持SpringBoot v1.x

2.1 引入Starter依赖

  • 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>

2.2 配置Starter

在应用的配置文件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

2.3 获取配置

可以通过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");
}

2.4 自动刷新配置

当配置变更后,可以通过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
}

2.5 监听配置

可以监听当前应用的配置变更事件:

// 监听当前应用的配置变更事件
@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 具体业务代码
    }
}

Clone this wiki locally