#269 Register instance with tenant info
This commit is contained in:
parent
53eb990328
commit
947e0439b0
@ -19,6 +19,7 @@ import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public class Entity {
|
||||
|
||||
|
@ -17,6 +17,7 @@ package com.alibaba.nacos.api.cmdb.pojo;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public class EntityEvent {
|
||||
|
||||
|
@ -17,6 +17,7 @@ package com.alibaba.nacos.api.cmdb.pojo;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public enum EntityEventType {
|
||||
/**
|
||||
|
@ -19,6 +19,7 @@ import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public class Label {
|
||||
|
||||
|
@ -17,6 +17,7 @@ package com.alibaba.nacos.api.cmdb.pojo;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public enum PreservedEntityTypes {
|
||||
/**
|
||||
|
@ -27,6 +27,7 @@ import java.util.Set;
|
||||
* Service to visit CMDB store
|
||||
*
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public interface CmdbService {
|
||||
|
||||
|
@ -127,4 +127,7 @@ public class Constants {
|
||||
public static final String NAMING_HTTP_HEADER_SPILIER = "\\|";
|
||||
|
||||
public static final String NAMING_DEFAULT_CLUSTER_NAME = "DEFAULT";
|
||||
|
||||
public static final String REQUEST_PARAM_TENANT_ID = "tid";
|
||||
public static final String REQUEST_PARAM_SERVICE_NAME = "serviceName";
|
||||
}
|
||||
|
@ -195,6 +195,7 @@ public interface NamingService {
|
||||
* @param selector selector to filter the resource
|
||||
* @return list of service names
|
||||
* @throws NacosException
|
||||
* @since 0.7.0
|
||||
*/
|
||||
ListView<String> getServicesOfServer(int pageNo, int pageSize, AbstractSelector selector) throws NacosException;
|
||||
|
||||
|
@ -190,13 +190,13 @@ public class ServiceInfo {
|
||||
|
||||
@JSONField(serialize = false)
|
||||
public String getKey() {
|
||||
return getKey(name, clusters, env, isAllIPs());
|
||||
return getKey(name, clusters, env);
|
||||
}
|
||||
|
||||
@JSONField(serialize = false)
|
||||
public String getKeyEncoded() {
|
||||
try {
|
||||
return getKey(URLEncoder.encode(name, "UTF-8"), clusters, env, isAllIPs());
|
||||
return getKey(URLEncoder.encode(name, "UTF-8"), clusters, env);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
return getKey();
|
||||
}
|
||||
@ -204,31 +204,24 @@ public class ServiceInfo {
|
||||
|
||||
@JSONField(serialize = false)
|
||||
public static String getKey(String name, String clusters, String unit) {
|
||||
return getKey(name, clusters, unit, false);
|
||||
}
|
||||
|
||||
@JSONField(serialize = false)
|
||||
public static String getKey(String name, String clusters, String unit, boolean isAllIPs) {
|
||||
|
||||
if (isEmpty(unit)) {
|
||||
unit = EMPTY;
|
||||
}
|
||||
|
||||
if (!isEmpty(clusters) && !isEmpty(unit)) {
|
||||
return isAllIPs ? name + SPLITER + clusters + SPLITER + unit + SPLITER + ALL_IPS
|
||||
: name + SPLITER + clusters + SPLITER + unit;
|
||||
return name + SPLITER + clusters + SPLITER + unit;
|
||||
}
|
||||
|
||||
if (!isEmpty(clusters)) {
|
||||
return isAllIPs ? name + SPLITER + clusters + SPLITER + ALL_IPS : name + SPLITER + clusters;
|
||||
return name + SPLITER + clusters;
|
||||
}
|
||||
|
||||
if (!isEmpty(unit)) {
|
||||
return isAllIPs ? name + SPLITER + EMPTY + SPLITER + unit + SPLITER + ALL_IPS :
|
||||
name + SPLITER + EMPTY + SPLITER + unit;
|
||||
return name + SPLITER + EMPTY + SPLITER + unit;
|
||||
}
|
||||
|
||||
return isAllIPs ? name + SPLITER + ALL_IPS : name;
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -19,6 +19,7 @@ package com.alibaba.nacos.api.selector;
|
||||
* Abstract selector that only contains a type
|
||||
*
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public abstract class AbstractSelector {
|
||||
|
||||
|
@ -19,6 +19,7 @@ package com.alibaba.nacos.api.selector;
|
||||
* The selector to filter resource with flexible expression.
|
||||
*
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public class ExpressionSelector extends AbstractSelector {
|
||||
|
||||
|
@ -19,6 +19,7 @@ package com.alibaba.nacos.api.selector;
|
||||
* The types of selector accepted by Nacos
|
||||
*
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public enum SelectorType {
|
||||
/**
|
||||
|
@ -20,7 +20,6 @@ import com.alibaba.nacos.api.common.Constants;
|
||||
import com.alibaba.nacos.api.exception.NacosException;
|
||||
import com.alibaba.nacos.api.naming.NamingService;
|
||||
import com.alibaba.nacos.api.naming.listener.EventListener;
|
||||
import com.alibaba.nacos.api.naming.pojo.Cluster;
|
||||
import com.alibaba.nacos.api.naming.pojo.Instance;
|
||||
import com.alibaba.nacos.api.naming.pojo.ListView;
|
||||
import com.alibaba.nacos.api.naming.pojo.ServiceInfo;
|
||||
@ -159,7 +158,7 @@ public class NacosNamingService implements NamingService {
|
||||
public void registerInstance(String serviceName, Instance instance) throws NacosException {
|
||||
|
||||
BeatInfo beatInfo = new BeatInfo();
|
||||
beatInfo.setDom(serviceName);
|
||||
beatInfo.setServiceName(serviceName);
|
||||
beatInfo.setIp(instance.getIp());
|
||||
beatInfo.setPort(instance.getPort());
|
||||
beatInfo.setCluster(instance.getClusterName());
|
||||
@ -191,7 +190,7 @@ public class NacosNamingService implements NamingService {
|
||||
public List<Instance> getAllInstances(String serviceName, List<String> clusters) throws NacosException {
|
||||
|
||||
ServiceInfo serviceInfo = hostReactor.getServiceInfo(serviceName, StringUtils.join(clusters, ","),
|
||||
StringUtils.EMPTY, false);
|
||||
StringUtils.EMPTY);
|
||||
List<Instance> list;
|
||||
if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {
|
||||
return new ArrayList<Instance>();
|
||||
@ -209,7 +208,7 @@ public class NacosNamingService implements NamingService {
|
||||
throws NacosException {
|
||||
|
||||
ServiceInfo serviceInfo = hostReactor.getServiceInfo(serviceName, StringUtils.join(clusters, ","),
|
||||
StringUtils.EMPTY, false);
|
||||
StringUtils.EMPTY);
|
||||
List<Instance> list;
|
||||
if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {
|
||||
return new ArrayList<Instance>();
|
||||
|
@ -27,7 +27,7 @@ public class BeatInfo {
|
||||
private int port;
|
||||
private String ip;
|
||||
private double weight;
|
||||
private String dom;
|
||||
private String serviceName;
|
||||
private String cluster;
|
||||
private Map<String, String> metadata;
|
||||
|
||||
@ -36,12 +36,12 @@ public class BeatInfo {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
|
||||
public String getDom() {
|
||||
return dom;
|
||||
public String getServiceName() {
|
||||
return serviceName;
|
||||
}
|
||||
|
||||
public void setDom(String dom) {
|
||||
this.dom = dom;
|
||||
public void setServiceName(String serviceName) {
|
||||
this.serviceName = serviceName;
|
||||
}
|
||||
|
||||
public String getCluster() {
|
||||
|
@ -21,6 +21,7 @@ import com.alibaba.nacos.api.common.Constants;
|
||||
import com.alibaba.nacos.client.naming.net.NamingProxy;
|
||||
import com.alibaba.nacos.client.naming.utils.LogUtils;
|
||||
import com.alibaba.nacos.client.naming.utils.UtilAndComs;
|
||||
import com.alibaba.nacos.common.util.HttpMethod;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@ -83,6 +84,7 @@ public class BeatReactor {
|
||||
}
|
||||
|
||||
class BeatTask implements Runnable {
|
||||
|
||||
BeatInfo beatInfo;
|
||||
|
||||
public BeatTask(BeatInfo beatInfo) {
|
||||
@ -93,10 +95,10 @@ public class BeatReactor {
|
||||
public void run() {
|
||||
Map<String, String> params = new HashMap<String, String>(2);
|
||||
params.put("beat", JSON.toJSONString(beatInfo));
|
||||
params.put("dom", beatInfo.getDom());
|
||||
params.put("serviceName", beatInfo.getServiceName());
|
||||
|
||||
try {
|
||||
String result = serverProxy.callAllServers(UtilAndComs.NACOS_URL_BASE + "/api/clientBeat", params);
|
||||
String result = serverProxy.reqAPI(UtilAndComs.NACOS_URL_BASE + "/health", params, HttpMethod.POST);
|
||||
JSONObject jsonObject = JSON.parseObject(result);
|
||||
|
||||
if (jsonObject != null) {
|
||||
|
@ -190,53 +190,39 @@ public class HostReactor {
|
||||
|
||||
private ServiceInfo getSerivceInfo0(String serviceName, String clusters, String env) {
|
||||
|
||||
String key = ServiceInfo.getKey(serviceName, clusters, env, false);
|
||||
String key = ServiceInfo.getKey(serviceName, clusters, env);
|
||||
|
||||
return serviceInfoMap.get(key);
|
||||
}
|
||||
|
||||
private ServiceInfo getSerivceInfo0(String serviceName, String clusters, String env, boolean allIPs) {
|
||||
|
||||
String key = ServiceInfo.getKey(serviceName, clusters, env, allIPs);
|
||||
String key = ServiceInfo.getKey(serviceName, clusters, env);
|
||||
return serviceInfoMap.get(key);
|
||||
}
|
||||
|
||||
public ServiceInfo getServiceInfo(String serviceName, String clusters, String env) {
|
||||
return getServiceInfo(serviceName, clusters, env, false);
|
||||
public ServiceInfo getServiceInfo(final String serviceName, final String clusters) {
|
||||
return getServiceInfo(serviceName, clusters, StringUtils.EMPTY);
|
||||
}
|
||||
|
||||
public ServiceInfo getServiceInfo(String serviceName, String clusters) {
|
||||
String env = StringUtils.EMPTY;
|
||||
return getServiceInfo(serviceName, clusters, env, false);
|
||||
}
|
||||
|
||||
public ServiceInfo getServiceInfo(final String serviceName, final String clusters, final String env,
|
||||
final boolean allIPs) {
|
||||
public ServiceInfo getServiceInfo(final String serviceName, final String clusters, final String env) {
|
||||
|
||||
LogUtils.LOG.debug("failover-mode: " + failoverReactor.isFailoverSwitch());
|
||||
String key = ServiceInfo.getKey(serviceName, clusters, env, allIPs);
|
||||
String key = ServiceInfo.getKey(serviceName, clusters, env);
|
||||
if (failoverReactor.isFailoverSwitch()) {
|
||||
return failoverReactor.getService(key);
|
||||
}
|
||||
|
||||
ServiceInfo serviceObj = getSerivceInfo0(serviceName, clusters, env, allIPs);
|
||||
ServiceInfo serviceObj = getSerivceInfo0(serviceName, clusters, env);
|
||||
|
||||
if (null == serviceObj) {
|
||||
serviceObj = new ServiceInfo(serviceName, clusters, env);
|
||||
|
||||
if (allIPs) {
|
||||
serviceObj.setAllIPs(allIPs);
|
||||
}
|
||||
|
||||
serviceInfoMap.put(serviceObj.getKey(), serviceObj);
|
||||
|
||||
updatingMap.put(serviceName, new Object());
|
||||
|
||||
if (allIPs) {
|
||||
updateService4AllIPNow(serviceName, clusters, env);
|
||||
} else {
|
||||
updateServiceNow(serviceName, clusters, env);
|
||||
}
|
||||
updateServiceNow(serviceName, clusters, env);
|
||||
updatingMap.remove(serviceName);
|
||||
|
||||
} else if (updatingMap.containsKey(serviceName)) {
|
||||
@ -248,29 +234,29 @@ public class HostReactor {
|
||||
serviceObj.wait(updateHoldInterval);
|
||||
} catch (InterruptedException e) {
|
||||
LogUtils.LOG.error("[getServiceInfo]",
|
||||
"serviceName:" + serviceName + ", clusters:" + clusters + ", allIPs:" + allIPs, e);
|
||||
"serviceName:" + serviceName + ", clusters:" + clusters, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
scheduleUpdateIfAbsent(serviceName, clusters, env, allIPs);
|
||||
scheduleUpdateIfAbsent(serviceName, clusters, env);
|
||||
|
||||
return serviceInfoMap.get(serviceObj.getKey());
|
||||
}
|
||||
|
||||
public void scheduleUpdateIfAbsent(String serviceName, String clusters, String env, boolean allIPs) {
|
||||
if (futureMap.get(ServiceInfo.getKey(serviceName, clusters, env, allIPs)) != null) {
|
||||
public void scheduleUpdateIfAbsent(String serviceName, String clusters, String env) {
|
||||
if (futureMap.get(ServiceInfo.getKey(serviceName, clusters, env)) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (futureMap) {
|
||||
if (futureMap.get(ServiceInfo.getKey(serviceName, clusters, env, allIPs)) != null) {
|
||||
if (futureMap.get(ServiceInfo.getKey(serviceName, clusters, env)) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
ScheduledFuture<?> future = addTask(new UpdateTask(serviceName, clusters, env, allIPs));
|
||||
futureMap.put(ServiceInfo.getKey(serviceName, clusters, env, allIPs), future);
|
||||
ScheduledFuture<?> future = addTask(new UpdateTask(serviceName, clusters, env));
|
||||
futureMap.put(ServiceInfo.getKey(serviceName, clusters, env), future);
|
||||
}
|
||||
}
|
||||
|
||||
@ -314,7 +300,7 @@ public class HostReactor {
|
||||
ServiceInfo oldService = getSerivceInfo0(serviceName, clusters, env);
|
||||
try {
|
||||
Map<String, String> params = new HashMap<String, String>(8);
|
||||
params.put("dom", serviceName);
|
||||
params.put("serviceName", serviceName);
|
||||
params.put("clusters", clusters);
|
||||
params.put("udpPort", String.valueOf(pushRecver.getUDPPort()));
|
||||
params.put("env", env);
|
||||
@ -337,7 +323,7 @@ public class HostReactor {
|
||||
params.put("checksum", oldService.getChecksum());
|
||||
}
|
||||
|
||||
String result = serverProxy.reqAPI(UtilAndComs.NACOS_URL_BASE + "/api/srvIPXT", params);
|
||||
String result = serverProxy.reqAPI(UtilAndComs.NACOS_URL_BASE + "/instance/list", params);
|
||||
if (StringUtils.isNotEmpty(result)) {
|
||||
processServiceJSON(result);
|
||||
}
|
||||
@ -353,10 +339,10 @@ public class HostReactor {
|
||||
}
|
||||
}
|
||||
|
||||
public void refreshOnly(String serviceName, String clusters, String env, boolean allIPs) {
|
||||
public void refreshOnly(String serviceName, String clusters, String env) {
|
||||
try {
|
||||
Map<String, String> params = new HashMap<String, String>(16);
|
||||
params.put("dom", serviceName);
|
||||
params.put("serviceName", serviceName);
|
||||
params.put("clusters", clusters);
|
||||
params.put("udpPort", String.valueOf(pushRecver.getUDPPort()));
|
||||
params.put("unit", env);
|
||||
@ -376,11 +362,7 @@ public class HostReactor {
|
||||
params.put("useEnvId", "true");
|
||||
}
|
||||
|
||||
if (allIPs) {
|
||||
serverProxy.reqAPI(UtilAndComs.NACOS_URL_BASE + "/api/srvAllIP", params);
|
||||
} else {
|
||||
serverProxy.reqAPI(UtilAndComs.NACOS_URL_BASE + "/api/srvIPXT", params);
|
||||
}
|
||||
serverProxy.reqAPI(UtilAndComs.NACOS_URL_BASE + "/instance/list", params);
|
||||
} catch (Exception e) {
|
||||
LogUtils.LOG.error("NA", "failed to update serviceName: " + serviceName, e);
|
||||
}
|
||||
@ -391,7 +373,6 @@ public class HostReactor {
|
||||
private String clusters;
|
||||
private String serviceName;
|
||||
private String env;
|
||||
private boolean allIPs = false;
|
||||
|
||||
public UpdateTask(String serviceName, String clusters, String env) {
|
||||
this.serviceName = serviceName;
|
||||
@ -399,41 +380,24 @@ public class HostReactor {
|
||||
this.env = env;
|
||||
}
|
||||
|
||||
public UpdateTask(String serviceName, String clusters, String env, boolean allIPs) {
|
||||
this.serviceName = serviceName;
|
||||
this.clusters = clusters;
|
||||
this.env = env;
|
||||
this.allIPs = allIPs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
ServiceInfo serviceObj = serviceInfoMap.get(ServiceInfo.getKey(serviceName, clusters, env, allIPs));
|
||||
ServiceInfo serviceObj = serviceInfoMap.get(ServiceInfo.getKey(serviceName, clusters, env));
|
||||
|
||||
if (serviceObj == null) {
|
||||
if (allIPs) {
|
||||
updateService4AllIPNow(serviceName, clusters, env);
|
||||
} else {
|
||||
updateServiceNow(serviceName, clusters, env);
|
||||
executor.schedule(this, DEFAULT_DELAY, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
updateServiceNow(serviceName, clusters, env);
|
||||
executor.schedule(this, DEFAULT_DELAY, TimeUnit.MILLISECONDS);
|
||||
return;
|
||||
}
|
||||
|
||||
if (serviceObj.getLastRefTime() <= lastRefTime) {
|
||||
if (allIPs) {
|
||||
updateService4AllIPNow(serviceName, clusters, env);
|
||||
serviceObj = serviceInfoMap.get(ServiceInfo.getKey(serviceName, clusters, env, true));
|
||||
} else {
|
||||
updateServiceNow(serviceName, clusters, env);
|
||||
serviceObj = serviceInfoMap.get(ServiceInfo.getKey(serviceName, clusters, env));
|
||||
}
|
||||
|
||||
updateServiceNow(serviceName, clusters, env);
|
||||
serviceObj = serviceInfoMap.get(ServiceInfo.getKey(serviceName, clusters, env));
|
||||
} else {
|
||||
// if serviceName already updated by push, we should not override it
|
||||
// since the push data may be different from pull through force push
|
||||
refreshOnly(serviceName, clusters, env, allIPs);
|
||||
refreshOnly(serviceName, clusters, env);
|
||||
}
|
||||
|
||||
executor.schedule(this, serviceObj.getCacheMillis(), TimeUnit.MILLISECONDS);
|
||||
|
@ -18,13 +18,15 @@ package com.alibaba.nacos.client.naming.net;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.alibaba.fastjson.TypeReference;
|
||||
import com.alibaba.nacos.api.common.Constants;
|
||||
import com.alibaba.nacos.api.exception.NacosException;
|
||||
import com.alibaba.nacos.api.naming.pojo.Instance;
|
||||
import com.alibaba.nacos.api.naming.pojo.ListView;
|
||||
import com.alibaba.nacos.api.selector.AbstractSelector;
|
||||
import com.alibaba.nacos.api.selector.SelectorType;
|
||||
import com.alibaba.nacos.api.selector.ExpressionSelector;
|
||||
import com.alibaba.nacos.api.selector.SelectorType;
|
||||
import com.alibaba.nacos.client.naming.utils.*;
|
||||
import com.alibaba.nacos.common.util.HttpMethod;
|
||||
import com.alibaba.nacos.common.util.UuidUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -96,9 +98,9 @@ public class NamingProxy {
|
||||
String urlString = "http://" + endpoint + "/nacos/serverlist";
|
||||
|
||||
List<String> headers = Arrays.asList("Client-Version", UtilAndComs.VERSION,
|
||||
"Accept-Encoding", "gzip,deflate,sdch",
|
||||
"Connection", "Keep-Alive",
|
||||
"RequestId", UuidUtils.generateUuid());
|
||||
"Accept-Encoding", "gzip,deflate,sdch",
|
||||
"Connection", "Keep-Alive",
|
||||
"RequestId", UuidUtils.generateUuid());
|
||||
|
||||
HttpClient.HttpResult result = HttpClient.httpGet(urlString, headers, null, UtilAndComs.ENCODING);
|
||||
if (HttpURLConnection.HTTP_OK != result.code) {
|
||||
@ -167,7 +169,7 @@ public class NamingProxy {
|
||||
params.put("serviceName", serviceName);
|
||||
params.put("clusterName", instance.getClusterName());
|
||||
|
||||
reqAPI(UtilAndComs.NACOS_URL_INSTANCE, params, "PUT");
|
||||
reqAPI(UtilAndComs.NACOS_URL_INSTANCE, params, HttpMethod.PUT);
|
||||
}
|
||||
|
||||
public void deregisterService(String serviceName, String ip, int port, String cluster) throws NacosException {
|
||||
@ -182,7 +184,7 @@ public class NamingProxy {
|
||||
params.put("serviceName", serviceName);
|
||||
params.put("cluster", cluster);
|
||||
|
||||
reqAPI(UtilAndComs.NACOS_URL_INSTANCE, params, "DELETE");
|
||||
reqAPI(UtilAndComs.NACOS_URL_INSTANCE, params, HttpMethod.DELETE);
|
||||
}
|
||||
|
||||
public String queryList(String serviceName, String clusters, boolean healthyOnly) throws NacosException {
|
||||
@ -193,7 +195,7 @@ public class NamingProxy {
|
||||
params.put("clusters", clusters);
|
||||
params.put("healthyOnly", String.valueOf(healthyOnly));
|
||||
|
||||
return reqAPI(UtilAndComs.NACOS_URL_BASE + "/instance/list", params, "GET");
|
||||
return reqAPI(UtilAndComs.NACOS_URL_BASE + "/instance/list", params, HttpMethod.GET);
|
||||
}
|
||||
|
||||
public boolean serverHealthy() {
|
||||
@ -284,7 +286,7 @@ public class NamingProxy {
|
||||
}
|
||||
|
||||
public String callServer(String api, Map<String, String> params, String curServer) throws NacosException {
|
||||
return callServer(api, params, curServer, "GET");
|
||||
return callServer(api, params, curServer, HttpMethod.GET);
|
||||
}
|
||||
|
||||
public String callServer(String api, Map<String, String> params, String curServer, String method)
|
||||
@ -323,11 +325,13 @@ public class NamingProxy {
|
||||
}
|
||||
|
||||
public String reqAPI(String api, Map<String, String> params, List<String> servers) {
|
||||
return reqAPI(api, params, servers, "GET");
|
||||
return reqAPI(api, params, servers, HttpMethod.GET);
|
||||
}
|
||||
|
||||
public String reqAPI(String api, Map<String, String> params, List<String> servers, String method) {
|
||||
|
||||
params.put(Constants.REQUEST_PARAM_TENANT_ID, getTenantId());
|
||||
|
||||
if (CollectionUtils.isEmpty(servers) && StringUtils.isEmpty(nacosDomain)) {
|
||||
throw new IllegalArgumentException("no server available");
|
||||
}
|
||||
@ -363,4 +367,11 @@ public class NamingProxy {
|
||||
|
||||
}
|
||||
|
||||
private String getTenantId() {
|
||||
if (UtilAndComs.DEFAULT_NAMESPACE_ID.equals(namespace)) {
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
return namespace;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -16,6 +16,8 @@
|
||||
package com.alibaba.nacos.client;
|
||||
|
||||
import com.alibaba.nacos.api.NacosFactory;
|
||||
import com.alibaba.nacos.api.PropertyKeyConst;
|
||||
import com.alibaba.nacos.api.common.Constants;
|
||||
import com.alibaba.nacos.api.naming.NamingService;
|
||||
import com.alibaba.nacos.api.naming.pojo.Instance;
|
||||
import com.alibaba.nacos.api.naming.pojo.ListView;
|
||||
@ -25,6 +27,7 @@ import org.junit.Test;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
@ -35,7 +38,11 @@ public class NamingTest {
|
||||
@Ignore
|
||||
public void testServiceList() throws Exception {
|
||||
|
||||
NamingService namingService = NacosFactory.createNamingService("127.0.0.1:8848");
|
||||
Properties properties = new Properties();
|
||||
properties.put(PropertyKeyConst.SERVER_ADDR, "11.160.165.126:8848");
|
||||
properties.put(PropertyKeyConst.NAMESPACE, "t1");
|
||||
|
||||
NamingService namingService = NacosFactory.createNamingService(properties);
|
||||
|
||||
Instance instance = new Instance();
|
||||
instance.setIp("1.1.1.1");
|
||||
@ -48,9 +55,9 @@ public class NamingTest {
|
||||
|
||||
namingService.registerInstance("nacos.test.1", instance);
|
||||
|
||||
ExpressionSelector expressionSelector = new ExpressionSelector();
|
||||
expressionSelector.setExpression("INSTANCE.metadata.registerSource = 'dubbo'");
|
||||
ListView<String> serviceList = namingService.getServicesOfServer(1, 10, expressionSelector);
|
||||
// ExpressionSelector expressionSelector = new ExpressionSelector();
|
||||
// expressionSelector.setExpression("INSTANCE.metadata.registerSource = 'dubbo'");
|
||||
// ListView<String> serviceList = namingService.getServicesOfServer(1, 10, expressionSelector);
|
||||
|
||||
Thread.sleep(1000000000L);
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
@SpringBootApplication
|
||||
public class CmdbApp {
|
||||
|
@ -28,6 +28,7 @@ import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping(UtilsAndCommons.NACOS_CMDB_CONTEXT + "/ops")
|
||||
|
@ -17,6 +17,7 @@ package com.alibaba.nacos.cmdb.core;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public class CmdbManager {
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
@Component
|
||||
public class SwitchAndOptions {
|
||||
|
@ -36,6 +36,7 @@ import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
@Component
|
||||
public class CmdbProvider implements CmdbReader, CmdbWriter {
|
||||
|
@ -22,6 +22,7 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public interface CmdbReader {
|
||||
|
||||
|
@ -17,6 +17,7 @@ package com.alibaba.nacos.cmdb.service;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public interface CmdbWriter {
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* @author nacos
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public class Loggers {
|
||||
|
||||
|
@ -21,6 +21,7 @@ import java.util.concurrent.ThreadFactory;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.7.0
|
||||
*/
|
||||
public class UtilsAndCommons {
|
||||
|
||||
|
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* 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 com.alibaba.nacos.common.util;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.8.0
|
||||
*/
|
||||
public class HttpMethod {
|
||||
|
||||
public static final String GET = "GET";
|
||||
|
||||
public static final String HEAD = "HEAD";
|
||||
|
||||
public static final String POST = "POST";
|
||||
|
||||
public static final String PUT = "PUT";
|
||||
|
||||
public static final String PATCH = "PATCH";
|
||||
|
||||
public static final String DELETE = "PATCH";
|
||||
|
||||
public static final String OPTIONS = "PATCH";
|
||||
|
||||
public static final String TRACE = "TRACE";
|
||||
}
|
@ -15,8 +15,27 @@
|
||||
*/
|
||||
package com.alibaba.nacos.naming.controllers;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.alibaba.nacos.core.utils.WebUtils;
|
||||
import com.alibaba.nacos.naming.misc.UtilsAndCommons;
|
||||
import com.alibaba.nacos.naming.web.ApiCommands;
|
||||
import com.alibaba.nacos.naming.web.OverrideParameterRequestWrapper;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.8.0
|
||||
*/
|
||||
public class HealthController {
|
||||
@RestController
|
||||
@RequestMapping(UtilsAndCommons.NACOS_NAMING_CONTEXT + UtilsAndCommons.NACOS_NAMING_HEALTH_CONTEXT)
|
||||
public class HealthController extends ApiCommands {
|
||||
|
||||
@RequestMapping(value = "", method = RequestMethod.POST)
|
||||
public JSONObject update(HttpServletRequest request) throws Exception {
|
||||
return clientBeat(OverrideParameterRequestWrapper.buildRequest(request, "dom", WebUtils.required(request, "serviceName")));
|
||||
}
|
||||
}
|
||||
|
@ -21,10 +21,9 @@ import com.alibaba.nacos.core.utils.WebUtils;
|
||||
import com.alibaba.nacos.naming.core.IpAddress;
|
||||
import com.alibaba.nacos.naming.core.VirtualClusterDomain;
|
||||
import com.alibaba.nacos.naming.exception.NacosException;
|
||||
import com.alibaba.nacos.naming.healthcheck.HealthCheckMode;
|
||||
import com.alibaba.nacos.naming.misc.UtilsAndCommons;
|
||||
import com.alibaba.nacos.naming.web.ApiCommands;
|
||||
import com.alibaba.nacos.naming.web.MockHttpRequest;
|
||||
import com.alibaba.nacos.naming.web.OverrideParameterRequestWrapper;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
@ -32,9 +31,7 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
@ -46,67 +43,18 @@ public class InstanceController extends ApiCommands {
|
||||
@RequestMapping(value = "/instance", method = RequestMethod.PUT)
|
||||
public String register(HttpServletRequest request) throws Exception {
|
||||
|
||||
Map<String, String[]> params = new HashMap<>(request.getParameterMap());
|
||||
MockHttpRequest mockHttpRequest = MockHttpRequest.buildRequest(params);
|
||||
OverrideParameterRequestWrapper requestWrapper = OverrideParameterRequestWrapper.buildRequest(request);
|
||||
|
||||
String serviceJson = WebUtils.optional(request, "service", StringUtils.EMPTY);
|
||||
String clusterJson = WebUtils.optional(request, "cluster", StringUtils.EMPTY);
|
||||
|
||||
// set service info:
|
||||
if (StringUtils.isNotEmpty(serviceJson)) {
|
||||
JSONObject service = JSON.parseObject(serviceJson);
|
||||
mockHttpRequest.addParameter("dom", service.getString("name"));
|
||||
mockHttpRequest.addParameter("app", service.getString("app"));
|
||||
mockHttpRequest.addParameter("group", service.getString("group"));
|
||||
mockHttpRequest.addParameter("protectThreshold", service.getString("protectThreshold"));
|
||||
|
||||
String healthCheckMode = service.getString("healthCheckMode");
|
||||
|
||||
if (HealthCheckMode.server.name().equals(healthCheckMode)) {
|
||||
mockHttpRequest.addParameter("enableHealthCheck", "true");
|
||||
}
|
||||
|
||||
if (HealthCheckMode.client.name().equals(healthCheckMode)) {
|
||||
mockHttpRequest.addParameter("enableClientBeat", "true");
|
||||
}
|
||||
|
||||
if (HealthCheckMode.none.name().equals(healthCheckMode)) {
|
||||
mockHttpRequest.addParameter("enableHealthCheck", "false");
|
||||
mockHttpRequest.addParameter("enableClientBeat", "false");
|
||||
}
|
||||
|
||||
mockHttpRequest.addParameter("serviceMetadata", service.getString("metadata"));
|
||||
requestWrapper.addParameter("dom", service.getString("name"));
|
||||
} else {
|
||||
mockHttpRequest.addParameter("dom", WebUtils.required(request, "serviceName"));
|
||||
requestWrapper.addParameter("dom", WebUtils.required(request, "serviceName"));
|
||||
}
|
||||
|
||||
// set cluster info:
|
||||
if (StringUtils.isNotEmpty(clusterJson)) {
|
||||
JSONObject cluster = JSON.parseObject(clusterJson);
|
||||
String clusterName = cluster.getString("name");
|
||||
if (StringUtils.isEmpty(clusterName)) {
|
||||
clusterName = UtilsAndCommons.DEFAULT_CLUSTER_NAME;
|
||||
}
|
||||
mockHttpRequest.addParameter("clusterName", clusterName);
|
||||
|
||||
JSONObject healthChecker = cluster.getJSONObject("healthChecker");
|
||||
if (healthChecker == null) {
|
||||
mockHttpRequest.addParameter("cktype", "TCP");
|
||||
} else {
|
||||
for (String key : healthChecker.keySet()) {
|
||||
mockHttpRequest.addParameter(key, healthChecker.getString(key));
|
||||
}
|
||||
mockHttpRequest.addParameter("cktype", healthChecker.getString("type"));
|
||||
}
|
||||
|
||||
mockHttpRequest.addParameter("cluster", StringUtils.EMPTY);
|
||||
mockHttpRequest.addParameter("defIPPort", cluster.getString("defaultPort"));
|
||||
mockHttpRequest.addParameter("defCkport", cluster.getString("defaultCheckPort"));
|
||||
mockHttpRequest.addParameter("ipPort4Check", cluster.getString("useIPPort4Check"));
|
||||
mockHttpRequest.addParameter("clusterMetadata", cluster.getString("metadata"));
|
||||
|
||||
}
|
||||
return regService(mockHttpRequest);
|
||||
return regService(requestWrapper);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/instance", method = RequestMethod.DELETE)
|
||||
@ -116,21 +64,12 @@ public class InstanceController extends ApiCommands {
|
||||
|
||||
@RequestMapping(value = {"/instance/update", "instance"}, method = RequestMethod.POST)
|
||||
public String update(HttpServletRequest request) throws Exception {
|
||||
String serviceName = WebUtils.required(request, "serviceName");
|
||||
Map<String, String[]> params = new HashMap<>(request.getParameterMap());
|
||||
MockHttpRequest mockHttpRequest = MockHttpRequest.buildRequest(params);
|
||||
mockHttpRequest.addParameter("dom", serviceName);
|
||||
return regService(mockHttpRequest);
|
||||
return regService(OverrideParameterRequestWrapper.buildRequest(request, "dom", WebUtils.required(request, "serviceName")));
|
||||
}
|
||||
|
||||
@RequestMapping(value = {"/instances", "/instance/list"}, method = RequestMethod.GET)
|
||||
public JSONObject queryList(HttpServletRequest request) throws Exception {
|
||||
|
||||
Map<String, String[]> params = new HashMap<>(request.getParameterMap());
|
||||
params.put("dom", params.get("serviceName"));
|
||||
MockHttpRequest mockHttpRequest = MockHttpRequest.buildRequest(params);
|
||||
|
||||
return srvIPXT(mockHttpRequest);
|
||||
return srvIPXT(OverrideParameterRequestWrapper.buildRequest(request, "dom", WebUtils.required(request, "serviceName")));
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/instance", method = RequestMethod.GET)
|
||||
@ -170,6 +109,5 @@ public class InstanceController extends ApiCommands {
|
||||
}
|
||||
|
||||
throw new IllegalStateException("no matched ip found!");
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -32,18 +32,18 @@ public class RsInfo {
|
||||
private double mem;
|
||||
private int port;
|
||||
private String ip;
|
||||
private String dom;
|
||||
private String serviceName;
|
||||
private String ak;
|
||||
private String cluster;
|
||||
private double weight;
|
||||
private Map<String, String> metadata;
|
||||
|
||||
public String getDom() {
|
||||
return dom;
|
||||
public String getServiceName() {
|
||||
return serviceName;
|
||||
}
|
||||
|
||||
public void setDom(String dom) {
|
||||
this.dom = dom;
|
||||
public void setServiceName(String serviceName) {
|
||||
this.serviceName = serviceName;
|
||||
}
|
||||
|
||||
public String getAk() {
|
||||
|
@ -49,6 +49,8 @@ public class UtilsAndCommons {
|
||||
|
||||
public static final String NACOS_NAMING_INSTANCE_CONTEXT = "/instance";
|
||||
|
||||
public static final String NACOS_NAMING_HEALTH_CONTEXT = "/health";
|
||||
|
||||
public static final String NACOS_NAMING_RAFT_CONTEXT = "/raft";
|
||||
|
||||
public static final String NACOS_SERVER_HEADER = "Nacos-Server";
|
||||
@ -104,6 +106,8 @@ public class UtilsAndCommons {
|
||||
|
||||
public static final String API_DOM = "/api/dom";
|
||||
|
||||
public static final String SERVICE_TENANT_CONNECTOR = "::";
|
||||
|
||||
public static final String INSTANCE_LIST_PERSISTED_PROPERTY_KEY = "nacos.instanceListPersisted";
|
||||
|
||||
public static final boolean INSTANCE_LIST_PERSISTED = Boolean.getBoolean(INSTANCE_LIST_PERSISTED_PROPERTY_KEY);
|
||||
|
@ -103,7 +103,9 @@ public class ApiCommands {
|
||||
|
||||
JSONObject result = new JSONObject();
|
||||
try {
|
||||
result = ApiCommands.this.srvIPXT(MockHttpRequest.buildRequest(params));
|
||||
result = ApiCommands.this.doSrvIPXT(client.getDom(), client.getAgent(), client.getClusters(),
|
||||
inetAddress.getHostAddress(), 0, StringUtils.EMPTY, StringUtils.EMPTY, false,
|
||||
StringUtils.EMPTY, StringUtils.EMPTY, false);
|
||||
} catch (Exception e) {
|
||||
Loggers.SRV_LOG.warn("PUSH-SERVICE: dom is not modified", e);
|
||||
}
|
||||
@ -301,7 +303,7 @@ public class ApiCommands {
|
||||
|
||||
//if domain does not exist, register it.
|
||||
if (virtualClusterDomain == null) {
|
||||
regDom(MockHttpRequest.buildRequest(stringMap));
|
||||
regDom(OverrideParameterRequestWrapper.buildRequest(request, stringMap));
|
||||
Loggers.SRV_LOG.warn("dom not found, register it, dom:" + dom);
|
||||
}
|
||||
|
||||
@ -320,13 +322,13 @@ public class ApiCommands {
|
||||
ipAddress.setInstanceId(ipAddress.generateInstanceId());
|
||||
|
||||
if (!virtualClusterDomain.getClusterMap().containsKey(ipAddress.getClusterName())) {
|
||||
doAddCluster4Dom(MockHttpRequest.buildRequest(stringMap));
|
||||
doAddCluster4Dom(OverrideParameterRequestWrapper.buildRequest(request, stringMap));
|
||||
}
|
||||
|
||||
if (!virtualClusterDomain.allIPs().contains(ipAddress)) {
|
||||
stringMap.put("ipList", Arrays.asList(JSON.toJSONString(Arrays.asList(ipAddress))).toArray(new String[1]));
|
||||
stringMap.put("json", Arrays.asList("true").toArray(new String[1]));
|
||||
addIP4Dom(MockHttpRequest.buildRequest(stringMap));
|
||||
addIP4Dom(OverrideParameterRequestWrapper.buildRequest(request, stringMap));
|
||||
Loggers.SRV_LOG.warn("ip not found, register it, dom:" + dom + ", ip:" + ipAddress);
|
||||
}
|
||||
|
||||
@ -518,9 +520,8 @@ public class ApiCommands {
|
||||
parameterMap.put("ipList", Arrays.asList(JSON.toJSONString(Arrays.asList(ipAddress))).toArray(new String[1]));
|
||||
parameterMap.put("json", Arrays.asList("true").toArray(new String[1]));
|
||||
parameterMap.put("token", Arrays.asList(virtualClusterDomain.getToken()).toArray(new String[1]));
|
||||
MockHttpRequest mockHttpRequest = MockHttpRequest.buildRequest(parameterMap);
|
||||
|
||||
return remvIP4Dom(mockHttpRequest);
|
||||
return remvIP4Dom(OverrideParameterRequestWrapper.buildRequest(request, parameterMap));
|
||||
|
||||
}
|
||||
|
||||
@ -584,7 +585,7 @@ public class ApiCommands {
|
||||
stringMap.put("json", Arrays.asList("true").toArray(new String[1]));
|
||||
stringMap.put("token", Arrays.asList(virtualClusterDomain.getToken()).toArray(new String[1]));
|
||||
|
||||
doAddIP4Dom(MockHttpRequest.buildRequest(stringMap));
|
||||
doAddIP4Dom(OverrideParameterRequestWrapper.buildRequest(request, stringMap));
|
||||
} else {
|
||||
throw new IllegalArgumentException("dom not found: " + dom);
|
||||
}
|
||||
@ -1085,32 +1086,11 @@ public class ApiCommands {
|
||||
return result;
|
||||
}
|
||||
|
||||
@RequestMapping("/srvIPXT")
|
||||
@ResponseBody
|
||||
public JSONObject srvIPXT(HttpServletRequest request) throws Exception {
|
||||
public JSONObject doSrvIPXT(String dom, String agent, String clusters, String clientIP, int udpPort,
|
||||
String error, String env, boolean isCheck, String app, String tid, boolean healthyOnly) throws Exception {
|
||||
|
||||
JSONObject result = new JSONObject();
|
||||
|
||||
if (DistroMapper.getLocalhostIP().equals(UtilsAndCommons.LOCAL_HOST_IP)) {
|
||||
throw new Exception("invalid localhost ip: " + DistroMapper.getLocalhostIP());
|
||||
}
|
||||
|
||||
String dom = WebUtils.required(request, "dom");
|
||||
|
||||
VirtualClusterDomain domObj = (VirtualClusterDomain) domainsManager.getDomain(dom);
|
||||
String agent = request.getHeader("Client-Version");
|
||||
String clusters = WebUtils.optional(request, "clusters", StringUtils.EMPTY);
|
||||
String clientIP = WebUtils.optional(request, "clientIP", StringUtils.EMPTY);
|
||||
Integer udpPort = Integer.parseInt(WebUtils.optional(request, "udpPort", "0"));
|
||||
String env = WebUtils.optional(request, "env", StringUtils.EMPTY);
|
||||
String error = WebUtils.optional(request, "unconsistentDom", StringUtils.EMPTY);
|
||||
boolean isCheck = Boolean.parseBoolean(WebUtils.optional(request, "isCheck", "false"));
|
||||
|
||||
String app = WebUtils.optional(request, "app", StringUtils.EMPTY);
|
||||
|
||||
String tenant = WebUtils.optional(request, "tid", StringUtils.EMPTY);
|
||||
|
||||
boolean healthyOnly = Boolean.parseBoolean(WebUtils.optional(request, "healthOnly", "false"));
|
||||
|
||||
if (!StringUtils.isEmpty(error)) {
|
||||
Loggers.ROLE_LOG.info("ENV-NOT-CONSISTENT", error);
|
||||
@ -1128,12 +1108,12 @@ public class ApiCommands {
|
||||
try {
|
||||
if (udpPort > 0 && PushService.canEnablePush(agent)) {
|
||||
PushService.addClient(dom,
|
||||
clusters,
|
||||
agent,
|
||||
new InetSocketAddress(clientIP, udpPort),
|
||||
pushDataSource,
|
||||
tenant,
|
||||
app);
|
||||
clusters,
|
||||
agent,
|
||||
new InetSocketAddress(clientIP, udpPort),
|
||||
pushDataSource,
|
||||
tid,
|
||||
app);
|
||||
cacheMillis = Switch.getPushCacheMillis(dom);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
@ -1173,7 +1153,7 @@ public class ApiCommands {
|
||||
if ((float) ipMap.get(Boolean.TRUE).size() / srvedIPs.size() <= threshold) {
|
||||
|
||||
Loggers.SRV_LOG.warn("protect threshold reached, return all ips, " +
|
||||
"dom: " + dom);
|
||||
"dom: " + dom);
|
||||
if (isCheck) {
|
||||
result.put("reachProtectThreshold", true);
|
||||
}
|
||||
@ -1229,6 +1209,35 @@ public class ApiCommands {
|
||||
return result;
|
||||
}
|
||||
|
||||
@RequestMapping("/srvIPXT")
|
||||
@ResponseBody
|
||||
public JSONObject srvIPXT(HttpServletRequest request) throws Exception {
|
||||
|
||||
if (DistroMapper.getLocalhostIP().equals(UtilsAndCommons.LOCAL_HOST_IP)) {
|
||||
throw new Exception("invalid localhost ip: " + DistroMapper.getLocalhostIP());
|
||||
}
|
||||
|
||||
String dom = WebUtils.required(request, "dom");
|
||||
|
||||
VirtualClusterDomain domObj = (VirtualClusterDomain) domainsManager.getDomain(dom);
|
||||
String agent = request.getHeader("Client-Version");
|
||||
String clusters = WebUtils.optional(request, "clusters", StringUtils.EMPTY);
|
||||
String clientIP = WebUtils.optional(request, "clientIP", StringUtils.EMPTY);
|
||||
Integer udpPort = Integer.parseInt(WebUtils.optional(request, "udpPort", "0"));
|
||||
String env = WebUtils.optional(request, "env", StringUtils.EMPTY);
|
||||
String error = WebUtils.optional(request, "unconsistentDom", StringUtils.EMPTY);
|
||||
boolean isCheck = Boolean.parseBoolean(WebUtils.optional(request, "isCheck", "false"));
|
||||
|
||||
String app = WebUtils.optional(request, "app", StringUtils.EMPTY);
|
||||
|
||||
String tenant = WebUtils.optional(request, "tid", StringUtils.EMPTY);
|
||||
|
||||
boolean healthyOnly = Boolean.parseBoolean(WebUtils.optional(request, "healthyOnly", "false"));
|
||||
|
||||
return doSrvIPXT(dom, agent, clusters, clientIP, udpPort, error, env, isCheck, app, tenant, healthyOnly);
|
||||
|
||||
}
|
||||
|
||||
@NeedAuth
|
||||
@RequestMapping("/remvIP4Dom")
|
||||
public String remvIP4Dom(HttpServletRequest request) throws Exception {
|
||||
|
@ -34,6 +34,7 @@ import java.util.Map;
|
||||
* @author nacos
|
||||
*/
|
||||
public class DistroFilter implements Filter {
|
||||
|
||||
@Override
|
||||
public void init(FilterConfig filterConfig) throws ServletException {
|
||||
|
||||
|
@ -1,403 +0,0 @@
|
||||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* 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 com.alibaba.nacos.naming.web;
|
||||
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.http.*;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.security.Principal;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
*/
|
||||
public class MockHttpRequest implements HttpServletRequest {
|
||||
|
||||
private Map<String, String[]> params;
|
||||
|
||||
public static MockHttpRequest buildRequest(Map<String, String[]> params) {
|
||||
|
||||
MockHttpRequest request = new MockHttpRequest();
|
||||
request.params = params;
|
||||
request.params.put("encoding", new String[]{"UTF-8"});
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
public static MockHttpRequest buildRequest2(Map<String, String> params) {
|
||||
|
||||
MockHttpRequest request = new MockHttpRequest();
|
||||
Map<String, String[]> arrayMap = new HashMap<>(16);
|
||||
for (String key : params.keySet()) {
|
||||
arrayMap.put(key, new String[]{params.get(key)});
|
||||
}
|
||||
request.params = arrayMap;
|
||||
request.params.put("encoding", new String[]{"UTF-8"});
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
public void addParameter(String key, String value) {
|
||||
params.put(key, new String[]{value});
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAuthType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cookie[] getCookies() {
|
||||
return new Cookie[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getDateHeader(String s) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeader(String s) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<String> getHeaders(String s) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<String> getHeaderNames() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIntHeader(String s) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethod() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPathInfo() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPathTranslated() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContextPath() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getQueryString() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemoteUser() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUserInRole(String s) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Principal getUserPrincipal() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRequestedSessionId() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRequestURI() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringBuffer getRequestURL() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServletPath() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpSession getSession(boolean b) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpSession getSession() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String changeSessionId() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRequestedSessionIdValid() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRequestedSessionIdFromCookie() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRequestedSessionIdFromURL() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRequestedSessionIdFromUrl() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean authenticate(HttpServletResponse httpServletResponse) throws IOException, ServletException {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void login(String s, String s1) throws ServletException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logout() throws ServletException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Part> getParts() throws IOException, ServletException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Part getPart(String s) throws IOException, ServletException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends HttpUpgradeHandler> T upgrade(Class<T> aClass) throws IOException, ServletException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getAttribute(String s) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<String> getAttributeNames() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCharacterEncoding() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCharacterEncoding(String s) throws UnsupportedEncodingException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getContentLength() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getContentLengthLong() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContentType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ServletInputStream getInputStream() throws IOException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getParameter(String s) {
|
||||
return params.get(s)[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<String> getParameterNames() {
|
||||
return new Vector<>(params.keySet()).elements();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getParameterValues(String s) {
|
||||
return params.get(s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String[]> getParameterMap() {
|
||||
return params;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProtocol() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getScheme() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getServerPort() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BufferedReader getReader() throws IOException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemoteAddr() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRemoteHost() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAttribute(String s, Object o) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeAttribute(String s) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Locale getLocale() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<Locale> getLocales() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSecure() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RequestDispatcher getRequestDispatcher(String s) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRealPath(String s) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRemotePort() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocalName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocalAddr() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLocalPort() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ServletContext getServletContext() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AsyncContext startAsync() throws IllegalStateException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAsyncStarted() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAsyncSupported() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AsyncContext getAsyncContext() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DispatcherType getDispatcherType() {
|
||||
return null;
|
||||
}
|
||||
}
|
@ -51,6 +51,18 @@ public class NamingConfig {
|
||||
return registration;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public FilterRegistrationBean tenantFilterRegistration() {
|
||||
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||
|
||||
registration.setFilter(tenantFilter());
|
||||
registration.addUrlPatterns("/v1/ns/instance/*", "/v1/ns/service/*", "/v1/ns/cluster/*", "/v1/ns/health/*");
|
||||
registration.setName("tenantFilter");
|
||||
registration.setOrder(4);
|
||||
|
||||
return registration;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Filter distroFilter() {
|
||||
return new DistroFilter();
|
||||
@ -60,4 +72,9 @@ public class NamingConfig {
|
||||
public Filter authFilter() {
|
||||
return new AuthFilter();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Filter tenantFilter() {
|
||||
return new TenantFilter();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* 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 com.alibaba.nacos.naming.web;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletRequestWrapper;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* A request wrapper to override the parameters.
|
||||
* <p>
|
||||
* Referenced article is https://blog.csdn.net/xieyuooo/article/details/8447301
|
||||
*
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.8.0
|
||||
*/
|
||||
public class OverrideParameterRequestWrapper extends HttpServletRequestWrapper {
|
||||
|
||||
private Map<String, String[]> params = new HashMap<String, String[]>();
|
||||
|
||||
/**
|
||||
* Constructs a request object wrapping the given request.
|
||||
*
|
||||
* @param request The request to wrap
|
||||
* @throws IllegalArgumentException if the request is null
|
||||
*/
|
||||
public OverrideParameterRequestWrapper(HttpServletRequest request) {
|
||||
super(request);
|
||||
this.params.putAll(request.getParameterMap());
|
||||
}
|
||||
|
||||
public static OverrideParameterRequestWrapper buildRequest(HttpServletRequest request) {
|
||||
return new OverrideParameterRequestWrapper(request);
|
||||
}
|
||||
|
||||
public static OverrideParameterRequestWrapper buildRequest(HttpServletRequest request, String name, String value) {
|
||||
OverrideParameterRequestWrapper requestWrapper = new OverrideParameterRequestWrapper(request);
|
||||
requestWrapper.addParameter(name, value);
|
||||
return requestWrapper;
|
||||
}
|
||||
|
||||
public static OverrideParameterRequestWrapper buildRequest(HttpServletRequest request, Map<String, String[]> appendParameters) {
|
||||
OverrideParameterRequestWrapper requestWrapper = new OverrideParameterRequestWrapper(request);
|
||||
requestWrapper.params.putAll(appendParameters);
|
||||
return requestWrapper;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getParameter(String name) {
|
||||
String[] values = params.get(name);
|
||||
if (values == null || values.length == 0) {
|
||||
return null;
|
||||
}
|
||||
return values[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String[]> getParameterMap() {
|
||||
return params;
|
||||
}
|
||||
|
||||
public String[] getParameterValues(String name) {
|
||||
return params.get(name);
|
||||
}
|
||||
|
||||
public void addParameter(String name, String value) {
|
||||
if (value != null) {
|
||||
params.put(name, new String[]{value});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* 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 com.alibaba.nacos.naming.web;
|
||||
|
||||
import com.alibaba.nacos.api.common.Constants;
|
||||
import com.alibaba.nacos.core.utils.WebUtils;
|
||||
import com.alibaba.nacos.naming.misc.UtilsAndCommons;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* A filter to intercept tenant parameter.
|
||||
*
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
* @since 0.8.0
|
||||
*/
|
||||
public class TenantFilter implements Filter {
|
||||
|
||||
@Override
|
||||
public void init(FilterConfig filterConfig) throws ServletException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
|
||||
|
||||
HttpServletRequest req = (HttpServletRequest) request;
|
||||
HttpServletResponse resp = (HttpServletResponse) response;
|
||||
|
||||
String tenantId = WebUtils.optional(req, Constants.REQUEST_PARAM_TENANT_ID, StringUtils.EMPTY);
|
||||
String serviceName = WebUtils.optional(req, Constants.REQUEST_PARAM_SERVICE_NAME, StringUtils.EMPTY);
|
||||
|
||||
if (StringUtils.isBlank(tenantId) || StringUtils.isBlank(serviceName)) {
|
||||
chain.doFilter(req, resp);
|
||||
return;
|
||||
}
|
||||
|
||||
OverrideParameterRequestWrapper requestWrapper = new OverrideParameterRequestWrapper(req);
|
||||
requestWrapper.addParameter(Constants.REQUEST_PARAM_SERVICE_NAME,
|
||||
serviceName + UtilsAndCommons.SERVICE_TENANT_CONNECTOR + tenantId);
|
||||
|
||||
|
||||
chain.doFilter(requestWrapper, resp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
|
||||
}
|
||||
}
|
@ -163,7 +163,7 @@ public class AutoDeregisterInstance_ITCase {
|
||||
|
||||
Assert.assertEquals(instances.size(), 1);
|
||||
BeatInfo beatInfo = new BeatInfo();
|
||||
beatInfo.setDom(serviceName);
|
||||
beatInfo.setServiceName(serviceName);
|
||||
beatInfo.setIp("127.0.0.1");
|
||||
beatInfo.setPort(TEST_PORT);
|
||||
|
||||
@ -207,7 +207,7 @@ public class AutoDeregisterInstance_ITCase {
|
||||
|
||||
Assert.assertEquals(instances.size(), 1);
|
||||
BeatInfo beatInfo = new BeatInfo();
|
||||
beatInfo.setDom(serviceName);
|
||||
beatInfo.setServiceName(serviceName);
|
||||
beatInfo.setIp("127.0.0.1");
|
||||
beatInfo.setPort(TEST_PORT);
|
||||
beatInfo.setCluster("c1");
|
||||
|
@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.alibaba.nacos.test.naming;
|
||||
|
||||
import com.alibaba.nacos.api.NacosFactory;
|
||||
import com.alibaba.nacos.api.PropertyKeyConst;
|
||||
import com.alibaba.nacos.api.exception.NacosException;
|
||||
import com.alibaba.nacos.api.naming.NamingFactory;
|
||||
import com.alibaba.nacos.api.naming.NamingService;
|
||||
@ -29,10 +31,7 @@ import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.web.server.LocalServerPort;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static com.alibaba.nacos.test.naming.NamingBase.*;
|
||||
@ -64,7 +63,14 @@ public class RegisterInstance_ITCase {
|
||||
@Test
|
||||
@Ignore
|
||||
public void regService() throws NacosException, InterruptedException {
|
||||
String serviceName = "dungu.test.99";
|
||||
|
||||
Properties properties = new Properties();
|
||||
properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
|
||||
properties.put(PropertyKeyConst.NAMESPACE, "t3");
|
||||
|
||||
naming = NacosFactory.createNamingService(properties);
|
||||
|
||||
String serviceName = "dungu.test.8";
|
||||
naming.registerInstance(serviceName, "127.0.0.1", 80, "c1");
|
||||
naming.registerInstance(serviceName, "127.0.0.2", 80, "c2");
|
||||
Thread.sleep(100000000L);
|
||||
|
Loading…
Reference in New Issue
Block a user