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;/** *构造ConfigService工具类。 */@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";@Overridepublic void setEnvironment(Environment environment) {this.env=environment;}@Beanpublic 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);returnservice;}}
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;/** * 构造NacosConfig配置。 */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);// 配置中心的命名空间idproperties.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());
/** * 更新限流规则 * * @param entity * @return */@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
/*** nacos获取accessToken** @return* @throws Exception*/ 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分页获取服务列表
/*** nacos获取service** @return*/ 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分页获取实例列表
/*** nacos获取instances** @param accessToken* @param serviceName* @param current* @param size* @return* @throws Exception*/ 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<ServiceInfo> serviceInfos = nacosNamingService.getSubscribeServices();List<Instance> instances = nacosNamingService.getAllInstances("serviceName");
3.修改实例权重、上下线等(java-sdk方式)
/*** 对服务进行加权降权处理** @return* @throws Exception*/ @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; }