千家信息网

nacos address中postCluster的原理及作用是什么

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,本篇内容介绍了"nacos address中postCluster的原理及作用是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希
千家信息网最后更新 2025年01月31日nacos address中postCluster的原理及作用是什么

本篇内容介绍了"nacos address中postCluster的原理及作用是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

本文主要研究一下nacos address的postCluster

AddressServerClusterController

nacos-1.1.3/address/src/main/java/com/alibaba/nacos/address/controller/AddressServerClusterController.java

@RestController@RequestMapping({AddressServerConstants.ADDRESS_SERVER_REQUEST_URL + "/nodes"})public class AddressServerClusterController {    @Autowired    private ServiceManager serviceManager;    @Autowired    private AddressServerManager addressServerManager;    @Autowired    private AddressServerGeneratorManager addressServerGeneratorManager;    /**     * @param product Ip list of products to be associated     * @param cluster Ip list of product cluster to be associated     * @param ips     will post ip list.     * @return     */    @RequestMapping(value = "", method = RequestMethod.POST)    public ResponseEntity postCluster(@RequestParam(required = false) String product,                                      @RequestParam(required = false) String cluster,                                      @RequestParam(name = "ips") String ips) {        //1. prepare the storage name for product and cluster        String productName = addressServerGeneratorManager.generateProductName(product);        String clusterName = addressServerManager.getDefaultClusterNameIfEmpty(cluster);        //2. prepare the response name for product and cluster to client        String rawProductName = addressServerManager.getRawProductName(product);        String rawClusterName = addressServerManager.getRawClusterName(cluster);        Loggers.addressLogger.info("put cluster node,the cluster name is " + cluster + "; the product name=" + product + "; the ip list=" + ips);        ResponseEntity responseEntity;        try {            String serviceName = addressServerGeneratorManager.generateNacosServiceName(productName);            Cluster clusterObj = new Cluster();            clusterObj.setName(clusterName);            clusterObj.setHealthChecker(new AbstractHealthChecker.None());            serviceManager.createServiceIfAbsent(Constants.DEFAULT_NAMESPACE_ID, serviceName, false, clusterObj);            String[] ipArray = addressServerManager.splitIps(ips);            String checkResult = AddressServerParamCheckUtil.checkIps(ipArray);            if (AddressServerParamCheckUtil.CHECK_OK.equals(checkResult)) {                List instanceList = addressServerGeneratorManager.generateInstancesByIps(serviceName, rawProductName, clusterName, ipArray);                for (Instance instance : instanceList) {                    serviceManager.registerInstance(Constants.DEFAULT_NAMESPACE_ID, serviceName, instance);                }                responseEntity = ResponseEntity.ok("product=" + rawProductName + ",cluster=" + rawClusterName + "; put success with size=" + instanceList.size());            } else {                responseEntity = ResponseEntity.status(HttpStatus.BAD_REQUEST).body(checkResult);            }        } catch (Exception e) {            responseEntity = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());        }        return responseEntity;    }    //......}
  • postCluster方法接收product、cluster、ips参数;其中productName通过addressServerGeneratorManager.generateProductName(product)生成;clusterName通过addressServerManager.getDefaultClusterNameIfEmpty(cluster)生成

  • 之后通过通过addressServerGeneratorManager.generateNacosServiceName(productName)生成serviceName,然后通过serviceManager.createServiceIfAbsent创建service

  • 之后校验下ip地址,校验通过的话,会通过addressServerGeneratorManager.generateInstancesByIps(serviceName, rawProductName, clusterName, ipArray)生成instanceList,然后遍历instanceList执行naming模块中的serviceManager的registerInstance方法

AddressServerGeneratorManager

nacos-1.1.3/address/src/main/java/com/alibaba/nacos/address/component/AddressServerGeneratorManager.java

@Componentpublic class AddressServerGeneratorManager {    public String generateProductName(String name) {        if (StringUtils.isBlank(name) || AddressServerConstants.DEFAULT_PRODUCT.equals(name)) {            return AddressServerConstants.ALIWARE_NACOS_DEFAULT_PRODUCT_NAME;        }        return String.format(AddressServerConstants.ALIWARE_NACOS_PRODUCT_DOM_TEMPLATE, name);    }    /**     * @param rawServiceName the raw service name will not contains the {@Constans.DEFAULT_GROUP}     * @return the nacos service name     */    public String generateNacosServiceName(String rawServiceName) {        if (rawServiceName.indexOf(Constants.DEFAULT_GROUP) != -1) {            return rawServiceName;        }        return Constants.DEFAULT_GROUP + AddressServerConstants.GROUP_SERVICE_NAME_SEP + rawServiceName;    }    public List generateInstancesByIps(String serviceName, String rawProductName, String clusterName, String[] ipArray) {        if (StringUtils.isEmpty(serviceName)            || StringUtils.isEmpty(clusterName)            || ipArray == null || ipArray.length == 0) {            return Collections.emptyList();        }        List instanceList = new ArrayList<>(ipArray.length);        for (String ip : ipArray) {            String[] ipAndPort = generateIpAndPort(ip);            Instance instance = new Instance();            instance.setIp(ipAndPort[0]);            instance.setPort(Integer.valueOf(ipAndPort[1]));            instance.setClusterName(clusterName);            instance.setServiceName(serviceName);            instance.setTenant(Constants.DEFAULT_NAMESPACE_ID);            instance.setApp(rawProductName);            instance.setEphemeral(false);            instanceList.add(instance);        }        return instanceList;    }    //......}
  • AddressServerGeneratorManager的generateProductName方法对于name为空或者是nacos的,返回nacos.as.default,否则返回nacos.as.前缀加name

  • generateNacosServiceName会返回DEFAULT_GROUP@@加rawServiceName,默认rawServiceName是不包含DEFAULT_GROUP的

  • generateInstancesByIps方法遍历ipArray,挨个创建instance,注意这里设置了ephemeral为false

AddressServerManager

nacos-1.1.3/address/src/main/java/com/alibaba/nacos/address/component/AddressServerManager.java

@Componentpublic class AddressServerManager {    public String getRawProductName(String name) {        if (StringUtils.isBlank(name) || AddressServerConstants.DEFAULT_PRODUCT.equals(name)) {            return AddressServerConstants.DEFAULT_PRODUCT;        }        return name;    }    public String getRawClusterName(String name) {        return getDefaultClusterNameIfEmpty(name);    }    public String getDefaultClusterNameIfEmpty(String name) {        if (StringUtils.isEmpty(name) || AddressServerConstants.DEFAULT_GET_CLUSTER.equals(name)) {            return AddressServerConstants.DEFAULT_GET_CLUSTER;        }        return name;    }    public String[] splitIps(String ips) {        if (StringUtils.isBlank(ips)) {            return new String[0];        }        return ips.split(AddressServerConstants.MULTI_IPS_SEPARATOR);    }           //......}
  • getRawProductName方法对于name为空或者是name已经是nacos的返回nacos,否则返回原值;getRawClusterName内部调用的是getDefaultClusterNameIfEmpty方法,它对于name是空或者name已经是serverlist的返回serverlist,否则返回原值;splitIps方法根据AddressServerConstants.MULTI_IPS_SEPARATOR来分割字符串为数组

小结

  • postCluster方法接收product、cluster、ips参数;其中productName通过addressServerGeneratorManager.generateProductName(product)生成;clusterName通过addressServerManager.getDefaultClusterNameIfEmpty(cluster)生成

  • 之后通过通过addressServerGeneratorManager.generateNacosServiceName(productName)生成serviceName,然后通过serviceManager.createServiceIfAbsent创建service

  • 之后校验下ip地址,校验通过的话,会通过addressServerGeneratorManager.generateInstancesByIps(serviceName, rawProductName, clusterName, ipArray)生成instanceList,然后遍历instanceList执行naming模块中的serviceManager的registerInstance方法

"nacos address中postCluster的原理及作用是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0