nacos读取json信息

一、 概述

需要在配置中心配置Json数据,返回给前端。因Nacos默认不支持Json格式配置,需要搭配监听器获取配置中心Json数据,返回给客户端。

二、搭配Nacos配置Josn数据

1. bootstrap.yml

server:
  port: 9000
spring:
  application:
    name: robot-system
  cloud:
    nacos:
      discovery:
        server-addr: 10.101.80.10:8848
      config:
        server-addr: 10.5.24.28:8848
        namespace: ba28cf53-23ae-4d54-b518-9f29e6f26d87
        refresh-enabled: true
        enabled: true

2. nacos配置-测试案例

3. 配置详情

1 2 3 4 均为json数据

4. NacosConfig 组装配置中心DataId

@Configuration
public class NacosConfig {
    /**
     * 前提条件 要求  serverAddr、namespace、group使用bootstrap.yml 中 spring cloud nacos config 的。
     * @return
     */
    @Bean
    public Map<String, Class> nacosConfigLocalCacheInfoMap() {
        // key:dataId, value:对应数据类型
        Map<String, Class> map = new HashMap<>();
        map.put("robotEnvConfig", String.class);
        map.put("robotId-iben_a03_1", IBen.class);
        map.put("robotId-dapang_ww", IBen.class);
        map.put("robotId-x_biped_upper_part_0", IBen.class);
        return map;
    }
}

5. 底层实现过程

/**
 * nacos 配置 信息
 */
public class NacosConfigInfo {
    public NacosConfigInfo(String serverAddr, String namespace, String group, String dataId, boolean refresh, Class cls) {
        this.serverAddr = serverAddr;
        this.namespace = namespace;
        this.group = group;
        this.dataId = dataId;
        this.refresh = refresh;
        this.cls = cls;
    }
 
    public NacosConfigInfo() {
    }
 
    private String serverAddr;
    private String namespace;
    private String group;
    private String dataId;
    private boolean refresh = true;
    private Class cls = String.class;
 
    public String getServerAddr() {
        return serverAddr;
    }
 
    public void setServerAddr(String serverAddr) {
        this.serverAddr = serverAddr;
    }
 
    public String getNamespace() {
        return namespace;
    }
 
    public void setNamespace(String namespace) {
        this.namespace = namespace;
    }
 
    public String getGroup() {
        return group;
    }
 
    public void setGroup(String group) {
        this.group = group;
    }
 
    public String getDataId() {
        return dataId;
    }
 
    public void setDataId(String dataId) {
        this.dataId = dataId;
    }
 
    public boolean isRefresh() {
        return refresh;
    }
 
    public void setRefresh(boolean refresh) {
        this.refresh = refresh;
    }
 
    public Class getCls() {
        return cls;
    }
 
    public void setCls(Class cls) {
        this.cls = cls;
    }
 
    public long getTimeout() {
        return 5000L;
    }
}

6. NacosConfigLocalCatch 核心监听触发类

@Component
public class NacosConfigLocalCatch implements InitializingBean {
    private Map<String, Object> localCatchMap = new HashMap<>();
 
    @Resource(name = "nacosConfigLocalCacheInfoMap")
    private Map<String, Class> nacosConfigLocalCacheInfoMap;
    @Autowired
    private NacosConfigProperties nacosConfigProperties;
 
 
    private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
            2, 4, 1, TimeUnit.SECONDS, new LinkedBlockingDeque<>(100),
            new ThreadPoolExecutor.CallerRunsPolicy()
    );
 
    protected final Logger logger = LoggerFactory.getLogger(getClass());
 
    protected final String clazzSimpleName = getClass().getSimpleName();
 
    @Override
    public void afterPropertiesSet() throws Exception {
        nacosConfigLocalCacheInfoMap.forEach((k, v) -> {
            NacosConfigInfo nacosConfigInfo = new NacosConfigInfo(nacosConfigProperties.getServerAddr(),
                    nacosConfigProperties.getNamespace(), nacosConfigProperties.getGroup(),
                    k, true, nacosConfigLocalCacheInfoMap.get(k));
 
            this.listener(nacosConfigInfo);
        });
    }
 
    public void listener(NacosConfigInfo nacosConfigInfo) {
        Listener listener = new Listener() {
            @Override
            public Executor getExecutor() {
                return threadPoolExecutor;
            }
            @Override
            public void receiveConfigInfo(String configInfo) {
                logger.info("{}#receiveConfigInfo receive configInfo. configInfo={}", clazzSimpleName, configInfo);
                compile(configInfo, nacosConfigInfo);
            }
        };
        ConfigService configService = this.getConfigService(nacosConfigInfo);
        String config = null;
        try {
            config = configService.getConfig(nacosConfigInfo.getDataId(), nacosConfigInfo.getGroup(), nacosConfigInfo.getTimeout());
            logger.info("{}#afterPropertiesSet init configInfo. configInfo={}", clazzSimpleName, config);
            // 初始化
            compile(config, nacosConfigInfo);
            // 监听
            configService.addListener(nacosConfigInfo.getDataId(), nacosConfigInfo.getGroup(), listener);
        } catch (NacosException e) {
            e.printStackTrace();
            throw new RuntimeException("nacos server 监听 异常! dataId = " + nacosConfigInfo.getDataId());
        }
    }
 
    private void compile(String config, NacosConfigInfo nacosConfigInfo) {
        Object initValue = JSON.parseObject(config, nacosConfigInfo.getCls());
        localCatchMap.put(nacosConfigInfo.getDataId(), initValue);
    }
 
    /**
     * 获取ConfigService
     *
     * @return
     */
    private ConfigService getConfigService(NacosConfigInfo nacosConfigInfo) {
        String serverAddr = nacosConfigInfo.getServerAddr();
        String nameSpace = nacosConfigInfo.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;
    }
 
    public <T> T get(String dataId, Class<T> cls) {
        if (cls != nacosConfigLocalCacheInfoMap.get(dataId)) {
            throw new IllegalArgumentException("类型异常");
        }
 
        return (T) localCatchMap.get(dataId);
    }
 }

7. 用于配置映射的数据实体

@Data
public class IBen {

    private String envType;


    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Iben{");
        sb.append("envType=").append(envType).append("}");
        return sb.toString();
    }
}

8. 测试使用

@Test
public void getInfo() {
    log.info("-------------------test------------------");
    String text = nacosConfigLocalCatch.get("robotEnvConfig", String.class);
    IBen iBen1 = nacosConfigLocalCatch.get("robotId-iben_a03_1", IBen.class);
    IBen iBen2 = nacosConfigLocalCatch.get("robotId-dapang_ww", IBen.class);
    IBen iBen3 = nacosConfigLocalCatch.get("robotId-x_biped_upper_part_0", IBen.class);
    System.out.println("text = " + text);
    System.out.println("iBen1 = " + iBen1.getEnvType());
    System.out.println("iBen2 = " + iBen2.getEnvType());
    System.out.println("iBen3 = " + iBen3.getEnvType());
}

可以读取json配置的属性

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nacos支持多层json配置的解析,可以通过以下步骤进行解析: 1.首先,从Nacos获取配置。假设我们的配置项名为config.json,获取到的配置内容为: ``` { "person": { "name": "张三", "age": 18, "gender": "男" }, "address": { "province": "江苏省", "city": "苏州市", "district": "工业园区", "street": "星湖街328号" } } ``` 2.使用json解析工具将配置内容解析为json对象。例如,使用Java中的JSONObject类: ``` String configContent = "从Nacos获取到的配置内容"; JSONObject configJson = new JSONObject(configContent); ``` 3.通过json对象获取需要的配置项值。例如,获取person节点下的name属性值: ``` String name = configJson.getJSONObject("person").getString("name"); ``` 4.如果需要获取多层嵌套的属性值,可以继续使用getJSONObject方法获取下一层的json对象。例如,获取address节点下的street属性值: ``` String street = configJson.getJSONObject("address").getString("street"); ``` 5.如果配置项中包含数组或者嵌套的数组,可以使用JSONArray类进行解析。例如,假设我们的配置项名为config.json,获取到的配置内容为: ``` { "persons": [ { "name": "张三", "age": 18, "gender": "男" }, { "name": "李四", "age": 20, "gender": "女" } ] } ``` 我们可以通过以下代码获取persons数组中第一个元素的name属性值: ``` JSONArray persons = configJson.getJSONArray("persons"); String name = persons.getJSONObject(0).getString("name"); ``` 以上就是解析Nacos多层json配置的基本步骤。需要根据实际情况进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值