文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

springboot获取nacos的服务列表、实例列表及修改实例、发布配置等

2023-08-16 15:07

关注

1.通过java-sdk的方式发布配置

官方文档说明:https://nacos.io/zh-cn/docs/sdk.html
https://nacos.io/zh-cn/docs/open-api.html

1.1构造ConfigService工具类

package com.redxun.config;import com.alibaba.nacos.api.config.ConfigService;import com.alibaba.nacos.api.exception.NacosException;import org.springframework.context.EnvironmentAware;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.env.Environment;@Configurationpublic class NacosConfigConfigration implements EnvironmentAware {    private Environment env;    private static final String NACOS_ADDRESS="nacos.address";    private static final String NACOS_NAMESPACE="nacos.namespace";    private static final String NACOS_USERNAME="nacos.username";    private static final String NACOS_PASSWORD="nacos.password";    @Override    public void setEnvironment(Environment environment) {        this.env=environment;    }    @Bean    public ConfigService configService() throws NacosException {        NacosConfigService configService=new NacosConfigService();        String address=this.env.getProperty(NACOS_ADDRESS);        String namespace=this.env.getProperty(NACOS_NAMESPACE);        String username=this.env.getProperty(NACOS_USERNAME);        String password=this.env.getProperty(NACOS_PASSWORD);        ConfigService service= configService.getConfigService(address,namespace,username,password);        return  service;    }}

1.2构造NacosConfig配置

package com.redxun.config;import com.alibaba.nacos.api.NacosFactory;import com.alibaba.nacos.api.PropertyKeyConst;import com.alibaba.nacos.api.annotation.NacosInjected;import com.alibaba.nacos.api.config.ConfigService;import com.alibaba.nacos.api.exception.NacosException;import org.springframework.util.StringUtils;import java.util.Properties;public class NacosConfigService {    public ConfigService getConfigService(String address,String namespace,String username,String password) throws NacosException {        if(StringUtils.isEmpty(address)){            address="localhost:8848";        }        if(StringUtils.isEmpty(namespace)){            namespace="local";        }        if(StringUtils.isEmpty(username)){            username="nacos";        }        if(StringUtils.isEmpty(password)){            password="nacos";        }        Properties properties = new Properties();        // nacos服务器地址        properties.put(PropertyKeyConst.SERVER_ADDR, address);        // 配置中心的命名空间id        properties.put(PropertyKeyConst.NAMESPACE, namespace);        properties.put(PropertyKeyConst.USERNAME, username);        properties.put(PropertyKeyConst.PASSWORD, password);        ConfigService configService = NacosFactory.createConfigService(properties);        return configService;    }}

1.3获取配置、修改后、发布配置

获取配置:String config = configService.getConfig(dataId, groupId, 0L);

发布配置:configService.publishConfig(dataId, groupId, conf.toJSONString());

@Transactional(rollbackFor = Exception.class)public int update(SysInterfaceApiFlow entity) {    try {        NamingService nacosNamingService = nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties());        List instances = nacosNamingService.getAllInstances("serviceName");        //查询nacos上面的限流配置        String config = configService.getConfig(dataId, groupId, 0L);        if (StringUtils.isEmpty(config)) {            config = "[]";        }        JSONArray conf = JSONArray.parseArray(config);        //把当前的实体类转化为nacos限流配置        if (null != entity) {            JSONObject json = buildFlowJson(entity);            Iterator iterator = conf.iterator();            while (iterator.hasNext()) {                Map map = (Map) iterator.next();                if (map.get("id").equals(json.get("id"))) {                    iterator.remove();//删除id相同的配置项                }            }            //删除之后再新增当前配置项            conf.add(json);        }        //发布全部的限流配置        int result = sysInterfaceApiFlowMapper.updateById(entity);        if (result > 0) {            configService.publishConfig(dataId, groupId, conf.toJSONString());        }        return result;    } catch (NacosException e) {        log.error("添加限流规则出错" + e.getMessage());        throw new BusinessException("添加限流规则出错" + e.getMessage());    }}

2.获取nacos上面的微服务列表、详情(包括集群详情)

2.1通过api的方式获取列表(sdk和open-api方式没有分页和条件查询参数)

2.1.1先获取token

 private String getAccessToken() throws Exception {     Map map = new HashMap<>();     map.put("username", username);     map.put("password", password);     String result = HttpClientUtil.postFromUrl("http://" + address + "/nacos/v1/auth/login", map);     JSONObject jsonObject = JSONObject.parseObject(result);     String accessToken = jsonObject.getString("accessToken");     return accessToken; }

2.1.2分页获取服务列表

 private String getNacosService(String accessToken, String serviceName, String groupName, long current, long size) throws Exception {     Map mapService = new HashMap<>();     mapService.put("accessToken", accessToken);     mapService.put("hasIpCount", "true");     mapService.put("withInstances", "false");     mapService.put("serviceNameParam", serviceName);     mapService.put("clusterName", "DEFAULT");     mapService.put("groupNameParam", groupName);     mapService.put("pageSize", String.valueOf(size));     mapService.put("pageNo", String.valueOf(current));     mapService.put("namespaceId", namespace);     String serviceResult = HttpClientUtil.getFromUrl("http://" + address + "/nacos/v1/ns/catalog/services", mapService);     return serviceResult; }

2.1.3分页获取实例列表

 private String getInsResult(String accessToken, String serviceName, long current, long size) throws Exception {     Map mapIns = new HashMap<>();     mapIns.put("accessToken", accessToken);     mapIns.put("serviceName", serviceName);     mapIns.put("clusterName", "DEFAULT");     mapIns.put("groupName", "DEFAULT_GROUP");     mapIns.put("pageSize", String.valueOf(size));     mapIns.put("pageNo", String.valueOf(current));     mapIns.put("namespaceId", namespace);     String insResult = HttpClientUtil.getFromUrl("http://" + address + "/nacos/v1/ns/catalog/instances", mapIns);     return insResult; }

2.2通过java-sdk获取(没有分页参数、弃用)

NamingService nacosNamingService = nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties());NamingMaintainService namingMaintainService = nacosServiceManager.getNamingMaintainService(nacosDiscoveryProperties.getNacosProperties());List serviceInfos = nacosNamingService.getSubscribeServices();List instances = nacosNamingService.getAllInstances("serviceName");

3.修改实例权重、上下线等(java-sdk方式)

 @MethodDefine(title = "对服务进行加权降权处理", path = "/updateInstance", method = HttpMethodConstants.POST) @ApiOperation(value = "对服务进行加权降权处理", notes = "对服务进行加权降权处理") @PostMapping(value = "/updateInstance") public JsonResult updateInstance(@RequestBody Instance instance, String type, String serviceName) throws Exception {     JsonResult jsonResult = JsonResult.getSuccessResult("操作成功!");     try {         NamingMaintainService namingMaintainService = nacosServiceManager.getNamingMaintainService(nacosDiscoveryProperties.getNacosProperties());         double weight = instance.getWeight();         if (StringUtils.isNotEmpty(type) && type.equals("0")) {//加权             weight++;         } else if (StringUtils.isNotEmpty(type) && type.equals("1")) {//降权             weight--;         } else if (StringUtils.isNotEmpty(type) && type.equals("2")) {//下线             instance.setEnabled(false);         } else if (StringUtils.isNotEmpty(type) && type.equals("3")) {//上线             instance.setEnabled(true);         }         instance.setWeight(weight);         namingMaintainService.updateInstance(serviceName, instance);     } catch (Exception ex) {         jsonResult.setSuccess(false);     }     return jsonResult; }

来源地址:https://blog.csdn.net/qq_29467891/article/details/129850623

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯