in discovery/seata-discovery-nacos/src/main/java/org/apache/seata/discovery/registry/nacos/NacosRegistryServiceImpl.java [149:207]
public List<InetSocketAddress> lookup(String key) throws Exception {
transactionServiceGroup = key;
String clusterName = getServiceGroup(key);
if (clusterName == null) {
String missingDataId = PREFIX_SERVICE_ROOT + CONFIG_SPLIT_CHAR + PREFIX_SERVICE_MAPPING + key;
throw new ConfigNotFoundException("%s configuration item is required", missingDataId);
}
if (useSLBWay) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("look up service address of SLB by nacos");
}
if (!CLUSTER_ADDRESS_MAP.containsKey(PUBLIC_NAMING_ADDRESS_PREFIX + clusterName)) {
Service service = getNamingMaintainInstance().queryService(DEFAULT_APPLICATION, clusterName);
String pubnetIp = service.getMetadata().get(PUBLIC_NAMING_SERVICE_META_IP_KEY);
String pubnetPort = service.getMetadata().get(PUBLIC_NAMING_SERVICE_META_PORT_KEY);
if (StringUtils.isBlank(pubnetIp) || StringUtils.isBlank(pubnetPort)) {
throw new Exception("cannot find service address from nacos naming mata-data");
}
InetSocketAddress publicAddress = new InetSocketAddress(pubnetIp,
Integer.valueOf(pubnetPort));
List<InetSocketAddress> publicAddressList = Arrays.asList(publicAddress);
CLUSTER_ADDRESS_MAP.put(PUBLIC_NAMING_ADDRESS_PREFIX + clusterName, publicAddressList);
return publicAddressList;
}
return CLUSTER_ADDRESS_MAP.get(PUBLIC_NAMING_ADDRESS_PREFIX + clusterName);
}
if (!LISTENER_SERVICE_MAP.containsKey(clusterName)) {
synchronized (LOCK_OBJ) {
if (!LISTENER_SERVICE_MAP.containsKey(clusterName)) {
List<String> clusters = new ArrayList<>();
clusters.add(clusterName);
List<Instance> firstAllInstances = getNamingInstance().getAllInstances(getServiceName(), getServiceGroup(), clusters);
if (null != firstAllInstances) {
List<InetSocketAddress> newAddressList = firstAllInstances.stream()
.filter(eachInstance -> eachInstance.isEnabled() && eachInstance.isHealthy())
.map(eachInstance -> new InetSocketAddress(eachInstance.getIp(), eachInstance.getPort()))
.collect(Collectors.toList());
CLUSTER_ADDRESS_MAP.put(clusterName, newAddressList);
}
subscribe(clusterName, event -> {
List<Instance> instances = ((NamingEvent) event).getInstances();
if (CollectionUtils.isEmpty(instances) && null != CLUSTER_ADDRESS_MAP.get(clusterName)) {
LOGGER.info("receive empty server list,cluster:{}", clusterName);
} else {
List<InetSocketAddress> newAddressList = instances.stream()
.filter(eachInstance -> eachInstance.isEnabled() && eachInstance.isHealthy())
.map(eachInstance -> new InetSocketAddress(eachInstance.getIp(), eachInstance.getPort()))
.collect(Collectors.toList());
CLUSTER_ADDRESS_MAP.put(clusterName, newAddressList);
if (StringUtils.isNotEmpty(transactionServiceGroup)) {
removeOfflineAddressesIfNecessary(transactionServiceGroup, clusterName, newAddressList);
}
}
});
}
}
}
return CLUSTER_ADDRESS_MAP.get(clusterName);
}