封装之后的 具体使用方式
直接获取 跟NacosJson配置映射的数据对象
@Autowired
private NacosConfigLocalCatch nacosConfigLocalCatch;
@RequestMapping("/test")
public String test(TbTest tbTest) {
List blackUserIdList = nacosConfigLocalCatch
.getLocalCatchConfig(ENacosJsonDefinition.BLACK_USERID_LIST, List.class);
System.out.println(blackUserIdList);
List localCatchConfig = nacosConfigLocalCatch
.getLocalCatchConfig(ENacosJsonDefinition.LUCK_USERID_LIST, List.class);
System.out.println(localCatchConfig);
RegistUserDTO registUserDTO = nacosConfigLocalCatch
.getLocalCatchConfig(ENacosJsonDefinition.DEFAULT_REGIST_INFO, RegistUserDTO.class);
System.out.println(registUserDTO);
return "OK";
}
如何实现的映射
枚举类 维护配置跟类型的映射信息
/**
* @Author G_Y
* @Date 2020/9/26 20:36
* @Description: 跟 Nacos 具体配置 映射的枚举实例
**/
public enum ENacosJsonDefinition {
BLACK_USERID_LIST("blackUserIdList",
"USER", List.class, "黑名单"),
LUCK_USERID_LIST("luckUserIdList",
"USER", List.class, "幸运用户"),
DEFAULT_REGIST_INFO("defaultRegistInfo",
"USER", RegistUserDTO.class, "注册默认显示的信息");
private String dataId;
private String group;
private Class cls;
private String desc;
private ENacosJsonDefinition(String dataId, String group, Class cls, String desc) {
this.dataId = dataId;
this.group = group;
this.cls = cls;
this.desc = desc;
}
public String getDataId() {
return dataId;
}
public String getGroup() {
return group;
}
public Class getCls() {
return cls;
}
public String getDesc() {
return desc;
}
}
动态获取配置 到 程序本地缓存
/**
* @Author G_Y
* @Date 2020/9/26 20:39
* @Description: // Nacos配置本地缓存类
**/
@Component
@Slf4j
public class NacosConfigLocalCatch implements InitializingBean {
// 注入 Nacos Config server 相关 springboot 配置
@Autowired
private NacosConfigProperties nacosConfigProperties;
// 根据 配置量 大小 ,初始化容量
// key:dataId
// value:具体配置数据实体对象
private Map<String, Object> localCatchMap = new HashMap<>(16);
private ConfigService configService;
// 根据枚举 及 类型 获取 配置实体
public <T> T getLocalCatchConfig(ENacosJsonDefinition eNacosJsonDefinition, Class<? extends T> cls) {
Object data = this.localCatchMap.get(eNacosJsonDefinition.getDataId());
// 判断data这个对象能不能被转化为cls这个类
boolean instance = cls.isInstance(data);
if(instance) {
return (T) data;
}
throw new IllegalArgumentException("类型转换错误");
}
@Override
public void afterPropertiesSet() throws Exception {
// 获取 所有 跟 Nacos 具体配置 映射的枚举实例
ENacosJsonDefinition[] nacosJsonDefinitions = ENacosJsonDefinition.values();
// 获取 Nacos 服务端 具体配置
String serverAddr = nacosConfigProperties.getServerAddr();
String namespace = nacosConfigProperties.getNamespace();
// 封装 Nacos server 配置参数
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
properties.put(PropertyKeyConst.NAMESPACE, namespace);
if (configService == null) {
configService = NacosFactory.createConfigService(properties);
}
// 遍历 获取 配置 ,并且针对各配置 设置 动态监听对象
for (ENacosJsonDefinition definition : nacosJsonDefinitions) {
String dataId = definition.getDataId();
String group = definition.getGroup();
// 初始化 获取具体配置
String config = configService.getConfig(dataId, group, 1000);
// 转换json保存到localCatchMap
this.jsonToObject(config, definition);
// 创建监听对象
Listener listener = new NacosJsonConfigDataListener(definition);
// 配置 具体配置项的监听
configService.addListener(definition.getDataId(), definition.getGroup(), listener);
}
}
// 将获取到的json配置装换为具体对象存储到localCatchMap
public void jsonToObject(String json, ENacosJsonDefinition eNacosJsonDefinition) {
Object data = JSON.parseObject(json, eNacosJsonDefinition.getCls());
log.info("Get Nacos Config Data, dataId = {} --- data = {}",
eNacosJsonDefinition.getDataId(), data);
this.localCatchMap.put(eNacosJsonDefinition.getDataId(), data);
}
// 配置用于异步监听的线程池
private static ThreadPoolExecutor executor =
new ThreadPoolExecutor(2,4,1,
TimeUnit.SECONDS, new LinkedBlockingDeque<>(100),
new ThreadPoolExecutor.CallerRunsPolicy());
// 具体监听类 动态监听Nacos配置
public class NacosJsonConfigDataListener implements Listener {
private ENacosJsonDefinition eNacosJsonDefinition;
private NacosJsonConfigDataListener(ENacosJsonDefinition eNacosJsonDefinition) {
this.eNacosJsonDefinition = eNacosJsonDefinition;
}
// 配置线程执行器 用于异步监听
@Override
public Executor getExecutor() {
return executor;
}
// 动态监听到变动后的处理逻辑
@Override
public void receiveConfigInfo(String jsonStr) {
jsonToObject(jsonStr, eNacosJsonDefinition);
}
};
}
具体配置如下图




测试结果



从测试结果来看,动态更新配置 后 数据对象 也能实现动态更新;
网友评论