1. 程式人生 > 程式設計 >聊聊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<Instance> instanceList = addressServerGeneratorManager.generateInstancesByIps(serviceName,rawProductName,clusterName,ipArray); for (Instance instance : instanceList) { serviceManager.registerInstance(Constants.DEFAULT_NAMESPACE_ID,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,ipArray)生成instanceList,然後遍歷instanceList執行naming模組中的serviceManager的registerInstance方法

AddressServerGeneratorManager

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

@Component
public 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<Instance> 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<Instance> 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

@Component
public 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,ipArray)生成instanceList,然後遍歷instanceList執行naming模組中的serviceManager的registerInstance方法

doc