目的:实现 将 nacos 配置中心的 json 配置 转化为 Java 客户端实体对象,实时监听变动,更新。
使用场景:实时业务生产,可以使用nacos配置中心配置系统参数及其它。
话不多说,直接贴代码
/**
* 主动监听nacos配置 类
* @param <T>
*/
public abstract class NacosAbstractListener<T> implements InitializingBean, Listener {
protected final Logger logger = LoggerFactory.getLogger(getClass());
protected final String clazzSimpleName = getClass().getSimpleName();
protected T data;
public T getData() {
return data;
}
/**
* bean初始化 触发 执行
*
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
ConfigService configService = this.getConfigService();
try {
String config = configService.getConfig(getDataId(), getGroupId(), getTimeout());
logger.info("{}#afterPropertiesSet init configInfo. configInfo={}", clazzSimpleName, config);
compile(config);
configService.addListener(getDataId(), getGroupId(), this);
} catch (NacosException e) {
e.printStackTrace();
}
}
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
2, 4, 1, TimeUnit.SECONDS, new LinkedBlockingDeque<>(100),
new ThreadPoolExecutor.CallerRunsPolicy()
);
/**
* 监听-工作线程池
* @return
*/
@Override
public Executor getExecutor() {
return threadPoolExecutor;
}
/**
* 接受到Nacos 具体 配置信息变动
*
* @param configInfo
*/
@Override
public void receiveConfigInfo(String configInfo) {
logger.info("{}#receiveConfigInfo receive configInfo. configInfo={}", clazzSimpleName, configInfo);
compile(configInfo);
}
/**
* 获取nacos dataId
*
* @return nacos dataId
*/
protected abstract String getDataId();
/**
* 获取nacos groupId
* <p>默认NacosConstant.GROUP_ID</p>
*
* @return nacos groupId
*/
protected abstract String getGroupId();
protected abstract String getNameSpace();
/**
* 获取nacos 超时时间
* <p>默认NacosConstant.TIMEOUT</p>
*
* @return nacos 超时时间
*/
protected long getTimeout() {
return 3000L;
}
/**
* 将输入转为数据
*
* @param dataStr
*/
protected abstract void compile(String dataStr);
/**
* 获取ConfigService
*
* @return
*/
private ConfigService getConfigService() {
String serverAddr = getServerAddr();
String nameSpace = this.getNameSpace();
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
properties.put(PropertyKeyConst.NAMESPACE, nameSpace);
ConfigService configService;
try {
configService = NacosFactory.createConfigService(properties);
} catch (NacosException e) {
e.printStackTrace();
throw new RuntimeException("Nacos config 配置 异常");
}
return configService;
}
/**
* 获取server addr
*
* @return
*/
protected abstract String getServerAddr();
}
public abstract class NacosJsonDefaultListener<T> extends NacosAbstractListener<T> {
@Autowired
private NacosConfigProperties nacosConfigProperties;
@Override
protected String getGroupId() {
return nacosConfigProperties.getGroup();
}
@Override
protected String getNameSpace() {
return nacosConfigProperties.getNamespace();
}
@Override
protected String getServerAddr() {
return nacosConfigProperties.getServerAddr();
}
@Override
protected void compile(String dataStr) {
data = JSON.parseObject(dataStr, this.JsonToObjectClass());
}
protected abstract Class<? extends T> JsonToObjectClass();
}
bootstrap配置信息
server:
port: 9000
spring:
application:
name: nacos-demo
cloud:
nacos:
config:
#nacos地址
server-addr: 127.0.0.1:8848
#命名空间
namespace: 096ad119-e2e0-4371-94c9-430b01102af2
#配置文件类型,目前只支持yaml,yml,properties,目前不需要了
file-extension: yaml
#默认提供者,目前不需要了
refresh-enabled: true
enabled: true
group: NACOS_DEMO
针对某个 业务 配置的 json 对应的 监听及实体
@Component
public class JsonTestListener extends NacosJsonDefaultListener<JsonTest> {
@Override
protected String getDataId() {
return "json-test";
}
@Override
protected Class<? extends JsonTest> JsonToObjectClass() {
return JsonTest.class;
}
}
public class JsonTest {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("JsonTest{");
sb.append("name='").append(name).append('\'');
sb.append(", age=").append(age);
sb.append('}');
return sb.toString();
}
}
具体 json 配置 如下 图
image.png
image.png
测试使用
@RestController
public class NacosTestController {
@Autowired
private JsonTestListener jsonTestListener;
@RequestMapping("/test/nacos")
public JsonTest test(){
JsonTest data = jsonTestListener.getData();
System.out.println(data);
return data;
}
}
结果
image.png
实时更新配置
image.png
发布并重新访问
image.png