本文结束之后的效果演示 效果演示链接
编写配置中心接口
在上文中,我们已经大致完成了注册中心的服务注册功能,在这篇文章我们来实现配置中心的配置拉取以及配置变更监听功能。 依旧是首先需要定义一个配置中心接口来初始化配置中心配置以及配置中心信息变更监听事件。
java
public interface ConfigCenter {
/**
* 初始化配置中心配置
* @param serverAddr 配置中心地址
* @param env 环境
*/
void init(String serverAddr, String env);
/**
* 订阅配置中心配置变更
* @param listener 配置变更监听器
*/
void subscribeRulesChange(RulesChangeListener listener);
}
c
public interface RulesChangeListener {
/**
* 规则变更时调用此方法 对规则进行更新
* @param rules 新规则
*/
void onRulesChange(List<Rule> rules);
}
配置拉取实现
完成了简单的接口定义,开始思考如何实现具体的配置拉取。 我们依旧需要先引入Nacos的client。
c
<!--引入Nacos的客户端依赖-->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.4</version>
</dependency>
之后,nacos已经为我们提供了configService,这个类能帮助我们快速的拉取Nacos的配置。使用方式如下:
c
private static final String DATA_ID = "api-gateway";
/**
* 服务端地址
*/
private String serverAddr;
/**
* 环境
*/
private String env;
/**
* Nacos提供的与配置中心进行交互的接口
*/
private ConfigService configService;
@Override
public void init(String serverAddr, String env) {
this.serverAddr = serverAddr;
this.env = env;
try {
this.configService = NacosFactory.createConfigService(serverAddr);
} catch (NacosException e) {
throw new RuntimeException(e);
}
}
上面就已经完成了对配置中心的初始化,那么我们就可以使用配置中心提供的方法来拉取我们的配置了
c
//初始化通知 DATA_ID是自己定义的 返回值就是一个json
String configJson = configService.getConfig(DATA_ID, env, 5000);
//configJson : {"rules":[{}, {}]}
log.info("config from nacos: {}", configJson);
List<Rule> rules = JSON.parseObject(configJson).getJSONArray("rules").toJavaList(Rule.class);
这里可以按照你自己喜欢的方式来解析你的配置。
配置变更事件订阅
还是老样子,我们也需要对配置变更事件进行订阅。方法如下:
c
@Override
public void subscribeRulesChange(RulesChangeListener listener) {
try {
//初始化通知 DATA_ID是自己定义的 返回值就是一个json
String configJson = configService.getConfig(DATA_ID, env, 5000);
//configJson : {"rules":[{}, {}]}
log.info("config from nacos: {}", configJson);
List<Rule> rules = JSON.parseObject(configJson).getJSONArray("rules").toJavaList(Rule.class);
//调用我们的监听器 参数就是我们拿到的rules
listener.onRulesChange(rules);
//监听变化
configService.addListener(DATA_ID, env, new Listener() {
//是否使用额外线程执行
@Override
public Executor getExecutor() {
return null;
}
//这里的用法我在那片线程池动态调参的时候写到过,有兴趣可以查看博客
@Override
public void receiveConfigInfo(String configInfo) {
log.info("config from nacos: {}", configInfo);
List<Rule> rules = JSON.parseObject(configInfo).getJSONArray("rules").toJavaList(Rule.class);
listener.onRulesChange(rules);
}
});
} catch (NacosException e) {
throw new RuntimeException(e);
}
}
比较重点的是这一行代码
c
//监听变化
configService.addListener(DATA_ID, env, new Listener()
他会帮助我们向Nacos的监听器列表中添加一个我们的监听器,当Nacos的配置发生变更之后,我们就可以监听到这个事件,然后执行我们所希望的处理逻辑。
到此,整合Nacos的部分就已经简单的完成了。 这个模块的完成需要对Nacos的源码以及接口有较深理解,因此推荐先学习完毕Nacos之后再来阅读这系列文章。