chore(project): 添加项目配置文件和忽略规则
- 添加 Babel 配置文件支持 ES6+ 语法转换 - 添加 ESLint 忽略规则和配置文件 - 添加 Git 忽略规则文件 - 添加 Travis CI 配置文件 - 添加 1.4.2 版本变更日志文件 - 添加 Helm 图表辅助模板文件 - 添加 Helm 忽略规则文件
This commit is contained in:
39
discovery/seata-discovery-nacos/pom.xml
Normal file
39
discovery/seata-discovery-nacos/pom.xml
Normal file
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Copyright 1999-2019 Seata.io Group.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<groupId>io.seata</groupId>
|
||||
<artifactId>seata-discovery</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>seata-discovery-nacos</artifactId>
|
||||
<name>seata-discovery-nacos ${project.version}</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>io.seata</groupId>
|
||||
<artifactId>seata-discovery-core</artifactId>
|
||||
<version>${project.parent.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.nacos</groupId>
|
||||
<artifactId>nacos-client</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright 1999-2019 Seata.io Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package io.seata.discovery.registry.nacos;
|
||||
|
||||
import io.seata.common.loader.LoadLevel;
|
||||
import io.seata.discovery.registry.RegistryService;
|
||||
import io.seata.discovery.registry.RegistryProvider;
|
||||
|
||||
/**
|
||||
* @author xingfudeshi@gmail.com
|
||||
*/
|
||||
@LoadLevel(name = "Nacos", order = 1)
|
||||
public class NacosRegistryProvider implements RegistryProvider {
|
||||
@Override
|
||||
public RegistryService provide() {
|
||||
return NacosRegistryServiceImpl.getInstance();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
/*
|
||||
* Copyright 1999-2019 Seata.io Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package io.seata.discovery.registry.nacos;
|
||||
|
||||
import com.alibaba.nacos.api.NacosFactory;
|
||||
import com.alibaba.nacos.api.naming.NamingService;
|
||||
import com.alibaba.nacos.api.naming.listener.EventListener;
|
||||
import com.alibaba.nacos.api.naming.listener.NamingEvent;
|
||||
import com.alibaba.nacos.api.naming.pojo.Instance;
|
||||
import com.alibaba.nacos.client.naming.utils.CollectionUtils;
|
||||
import io.seata.common.util.NetUtil;
|
||||
import io.seata.common.util.StringUtils;
|
||||
import io.seata.config.Configuration;
|
||||
import io.seata.config.ConfigurationFactory;
|
||||
import io.seata.config.ConfigurationKeys;
|
||||
import io.seata.discovery.registry.RegistryService;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* The type Nacos registry service.
|
||||
*
|
||||
* @author slievrly
|
||||
*/
|
||||
public class NacosRegistryServiceImpl implements RegistryService<EventListener> {
|
||||
private static final String DEFAULT_NAMESPACE = "";
|
||||
private static final String DEFAULT_CLUSTER = "default";
|
||||
private static final String DEFAULT_GROUP = "DEFAULT_GROUP";
|
||||
private static final String DEFAULT_APPLICATION = "seata-server";
|
||||
private static final String PRO_SERVER_ADDR_KEY = "serverAddr";
|
||||
private static final String PRO_NAMESPACE_KEY = "namespace";
|
||||
private static final String REGISTRY_TYPE = "nacos";
|
||||
private static final String REGISTRY_CLUSTER = "cluster";
|
||||
private static final String PRO_APPLICATION_KEY = "application";
|
||||
private static final String PRO_GROUP_KEY = "group";
|
||||
private static final String USER_NAME = "username";
|
||||
private static final String PASSWORD = "password";
|
||||
private static final Configuration FILE_CONFIG = ConfigurationFactory.CURRENT_FILE_INSTANCE;
|
||||
private static volatile NamingService naming;
|
||||
private static final ConcurrentMap<String, List<EventListener>> LISTENER_SERVICE_MAP = new ConcurrentHashMap<>();
|
||||
private static final ConcurrentMap<String, List<InetSocketAddress>> CLUSTER_ADDRESS_MAP = new ConcurrentHashMap<>();
|
||||
private static volatile NacosRegistryServiceImpl instance;
|
||||
private static final Object LOCK_OBJ = new Object();
|
||||
|
||||
private NacosRegistryServiceImpl() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets instance.
|
||||
*
|
||||
* @return the instance
|
||||
*/
|
||||
static NacosRegistryServiceImpl getInstance() {
|
||||
if (instance == null) {
|
||||
synchronized (NacosRegistryServiceImpl.class) {
|
||||
if (instance == null) {
|
||||
instance = new NacosRegistryServiceImpl();
|
||||
}
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(InetSocketAddress address) throws Exception {
|
||||
NetUtil.validAddress(address);
|
||||
getNamingInstance().registerInstance(getServiceName(), getServiceGroup(), address.getAddress().getHostAddress(), address.getPort(), getClusterName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregister(InetSocketAddress address) throws Exception {
|
||||
NetUtil.validAddress(address);
|
||||
getNamingInstance().deregisterInstance(getServiceName(), getServiceGroup(), address.getAddress().getHostAddress(), address.getPort(), getClusterName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void subscribe(String cluster, EventListener listener) throws Exception {
|
||||
List<String> clusters = new ArrayList<>();
|
||||
clusters.add(cluster);
|
||||
LISTENER_SERVICE_MAP.computeIfAbsent(cluster, key -> new ArrayList<>())
|
||||
.add(listener);
|
||||
getNamingInstance().subscribe(getServiceName(), getServiceGroup(), clusters, listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unsubscribe(String cluster, EventListener listener) throws Exception {
|
||||
List<String> clusters = new ArrayList<>();
|
||||
clusters.add(cluster);
|
||||
List<EventListener> subscribeList = LISTENER_SERVICE_MAP.get(cluster);
|
||||
if (subscribeList != null) {
|
||||
List<EventListener> newSubscribeList = subscribeList.stream()
|
||||
.filter(eventListener -> !eventListener.equals(listener))
|
||||
.collect(Collectors.toList());
|
||||
LISTENER_SERVICE_MAP.put(cluster, newSubscribeList);
|
||||
}
|
||||
getNamingInstance().unsubscribe(getServiceName(), getServiceGroup(), clusters, listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<InetSocketAddress> lookup(String key) throws Exception {
|
||||
String clusterName = getServiceGroup(key);
|
||||
if (clusterName == null) {
|
||||
return null;
|
||||
}
|
||||
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(instance -> instance.isEnabled() && instance.isHealthy())
|
||||
.map(instance -> new InetSocketAddress(instance.getIp(), instance.getPort()))
|
||||
.collect(Collectors.toList());
|
||||
CLUSTER_ADDRESS_MAP.put(clusterName, newAddressList);
|
||||
}
|
||||
subscribe(clusterName, event -> {
|
||||
List<Instance> instances = ((NamingEvent) event).getInstances();
|
||||
if (null == instances && null != CLUSTER_ADDRESS_MAP.get(clusterName)) {
|
||||
CLUSTER_ADDRESS_MAP.remove(clusterName);
|
||||
} else if (!CollectionUtils.isEmpty(instances)) {
|
||||
List<InetSocketAddress> newAddressList = instances.stream()
|
||||
.filter(instance -> instance.isEnabled() && instance.isHealthy())
|
||||
.map(instance -> new InetSocketAddress(instance.getIp(), instance.getPort()))
|
||||
.collect(Collectors.toList());
|
||||
CLUSTER_ADDRESS_MAP.put(clusterName, newAddressList);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
return CLUSTER_ADDRESS_MAP.get(clusterName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws Exception {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets naming instance.
|
||||
*
|
||||
* @return the naming instance
|
||||
* @throws Exception the exception
|
||||
*/
|
||||
public static NamingService getNamingInstance() throws Exception {
|
||||
if (naming == null) {
|
||||
synchronized (NacosRegistryServiceImpl.class) {
|
||||
if (naming == null) {
|
||||
naming = NacosFactory.createNamingService(getNamingProperties());
|
||||
}
|
||||
}
|
||||
}
|
||||
return naming;
|
||||
}
|
||||
|
||||
private static Properties getNamingProperties() {
|
||||
Properties properties = new Properties();
|
||||
if (System.getProperty(PRO_SERVER_ADDR_KEY) != null) {
|
||||
properties.setProperty(PRO_SERVER_ADDR_KEY, System.getProperty(PRO_SERVER_ADDR_KEY));
|
||||
} else {
|
||||
String address = FILE_CONFIG.getConfig(getNacosAddrFileKey());
|
||||
if (address != null) {
|
||||
properties.setProperty(PRO_SERVER_ADDR_KEY, address);
|
||||
}
|
||||
}
|
||||
if (System.getProperty(PRO_NAMESPACE_KEY) != null) {
|
||||
properties.setProperty(PRO_NAMESPACE_KEY, System.getProperty(PRO_NAMESPACE_KEY));
|
||||
} else {
|
||||
String namespace = FILE_CONFIG.getConfig(getNacosNameSpaceFileKey());
|
||||
if (namespace == null) {
|
||||
namespace = DEFAULT_NAMESPACE;
|
||||
}
|
||||
properties.setProperty(PRO_NAMESPACE_KEY, namespace);
|
||||
}
|
||||
String userName = StringUtils.isNotBlank(System.getProperty(USER_NAME)) ? System.getProperty(USER_NAME)
|
||||
: FILE_CONFIG.getConfig(getNacosUserName());
|
||||
if (StringUtils.isNotBlank(userName)) {
|
||||
String password = StringUtils.isNotBlank(System.getProperty(PASSWORD)) ? System.getProperty(PASSWORD)
|
||||
: FILE_CONFIG.getConfig(getNacosPassword());
|
||||
if (StringUtils.isNotBlank(password)) {
|
||||
properties.setProperty(USER_NAME, userName);
|
||||
properties.setProperty(PASSWORD, password);
|
||||
}
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
private static String getClusterName() {
|
||||
return FILE_CONFIG.getConfig(getNacosClusterFileKey(), DEFAULT_CLUSTER);
|
||||
}
|
||||
|
||||
private static String getServiceName() {
|
||||
return FILE_CONFIG.getConfig(getNacosApplicationFileKey(), DEFAULT_APPLICATION);
|
||||
}
|
||||
|
||||
private static String getServiceGroup() {
|
||||
return FILE_CONFIG.getConfig(getNacosApplicationGroupKey(), DEFAULT_GROUP);
|
||||
}
|
||||
|
||||
private static String getNacosAddrFileKey() {
|
||||
return String.join(ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR, ConfigurationKeys.FILE_ROOT_REGISTRY, REGISTRY_TYPE, PRO_SERVER_ADDR_KEY);
|
||||
}
|
||||
|
||||
private static String getNacosNameSpaceFileKey() {
|
||||
return String.join(ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR, ConfigurationKeys.FILE_ROOT_REGISTRY, REGISTRY_TYPE, PRO_NAMESPACE_KEY);
|
||||
}
|
||||
|
||||
private static String getNacosClusterFileKey() {
|
||||
return String.join(ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR, ConfigurationKeys.FILE_ROOT_REGISTRY, REGISTRY_TYPE, REGISTRY_CLUSTER);
|
||||
}
|
||||
|
||||
private static String getNacosApplicationFileKey() {
|
||||
return String.join(ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR, ConfigurationKeys.FILE_ROOT_REGISTRY, REGISTRY_TYPE, PRO_APPLICATION_KEY);
|
||||
}
|
||||
|
||||
private static String getNacosApplicationGroupKey() {
|
||||
return String.join(ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR, ConfigurationKeys.FILE_ROOT_REGISTRY, REGISTRY_TYPE, PRO_GROUP_KEY);
|
||||
}
|
||||
|
||||
private static String getNacosUserName() {
|
||||
return String.join(ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR, ConfigurationKeys.FILE_ROOT_REGISTRY, REGISTRY_TYPE, USER_NAME);
|
||||
}
|
||||
|
||||
private static String getNacosPassword() {
|
||||
return String.join(ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR, ConfigurationKeys.FILE_ROOT_REGISTRY, REGISTRY_TYPE, PASSWORD);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
io.seata.discovery.registry.nacos.NacosRegistryProvider
|
||||
Reference in New Issue
Block a user