美文网首页
Nacos json配置 映射为 程序对象的方式

Nacos json配置 映射为 程序对象的方式

作者: 大黑跟小白的日常 | 来源:发表于2020-09-27 15:25 被阅读0次

封装之后的 具体使用方式

直接获取 跟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);
        }
    };

}

具体配置如下图

image.png
image.png
image.png
image.png

测试结果

image.png
image.png image.png

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

相关文章

网友评论

      本文标题:Nacos json配置 映射为 程序对象的方式

      本文链接:https://www.haomeiwen.com/subject/xyqluktx.html