#497 Make subscription by query optional
This commit is contained in:
parent
6c83ec925f
commit
720ab596a7
@ -89,6 +89,16 @@ public interface NamingService {
|
|||||||
*/
|
*/
|
||||||
List<Instance> getAllInstances(String serviceName) throws NacosException;
|
List<Instance> getAllInstances(String serviceName) throws NacosException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all instances of a service
|
||||||
|
*
|
||||||
|
* @param serviceName name of service
|
||||||
|
* @param subscribe if subscribe the service
|
||||||
|
* @return A list of instance
|
||||||
|
* @throws NacosException
|
||||||
|
*/
|
||||||
|
List<Instance> getAllInstances(String serviceName, boolean subscribe) throws NacosException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all instances within specified clusters of a service
|
* Get all instances within specified clusters of a service
|
||||||
*
|
*
|
||||||
@ -99,6 +109,17 @@ public interface NamingService {
|
|||||||
*/
|
*/
|
||||||
List<Instance> getAllInstances(String serviceName, List<String> clusters) throws NacosException;
|
List<Instance> getAllInstances(String serviceName, List<String> clusters) throws NacosException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all instances within specified clusters of a service
|
||||||
|
*
|
||||||
|
* @param serviceName name of service
|
||||||
|
* @param clusters list of cluster
|
||||||
|
* @param subscribe if subscribe the service
|
||||||
|
* @return A list of qualified instance
|
||||||
|
* @throws NacosException
|
||||||
|
*/
|
||||||
|
List<Instance> getAllInstances(String serviceName, List<String> clusters, boolean subscribe) throws NacosException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get qualified instances of service
|
* Get qualified instances of service
|
||||||
*
|
*
|
||||||
@ -109,6 +130,17 @@ public interface NamingService {
|
|||||||
*/
|
*/
|
||||||
List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException;
|
List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get qualified instances of service
|
||||||
|
*
|
||||||
|
* @param serviceName name of service
|
||||||
|
* @param healthy a flag to indicate returning healthy or unhealthy instances
|
||||||
|
* @param subscribe if subscribe the service
|
||||||
|
* @return A qualified list of instance
|
||||||
|
* @throws NacosException
|
||||||
|
*/
|
||||||
|
List<Instance> selectInstances(String serviceName, boolean healthy, boolean subscribe) throws NacosException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get qualified instances within specified clusters of service
|
* Get qualified instances within specified clusters of service
|
||||||
*
|
*
|
||||||
@ -120,6 +152,18 @@ public interface NamingService {
|
|||||||
*/
|
*/
|
||||||
List<Instance> selectInstances(String serviceName, List<String> clusters, boolean healthy) throws NacosException;
|
List<Instance> selectInstances(String serviceName, List<String> clusters, boolean healthy) throws NacosException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get qualified instances within specified clusters of service
|
||||||
|
*
|
||||||
|
* @param serviceName name of service
|
||||||
|
* @param clusters list of cluster
|
||||||
|
* @param healthy a flag to indicate returning healthy or unhealthy instances
|
||||||
|
* @param subscribe if subscribe the service
|
||||||
|
* @return A qualified list of instance
|
||||||
|
* @throws NacosException
|
||||||
|
*/
|
||||||
|
List<Instance> selectInstances(String serviceName, List<String> clusters, boolean healthy, boolean subscribe) throws NacosException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Select one healthy instance of service using predefined load balance strategy
|
* Select one healthy instance of service using predefined load balance strategy
|
||||||
*
|
*
|
||||||
@ -129,6 +173,16 @@ public interface NamingService {
|
|||||||
*/
|
*/
|
||||||
Instance selectOneHealthyInstance(String serviceName) throws NacosException;
|
Instance selectOneHealthyInstance(String serviceName) throws NacosException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select one healthy instance of service using predefined load balance strategy
|
||||||
|
*
|
||||||
|
* @param serviceName name of service
|
||||||
|
* @param subscribe if subscribe the service
|
||||||
|
* @return qualified instance
|
||||||
|
* @throws NacosException
|
||||||
|
*/
|
||||||
|
Instance selectOneHealthyInstance(String serviceName, boolean subscribe) throws NacosException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Select one healthy instance of service using predefined load balance strategy
|
* Select one healthy instance of service using predefined load balance strategy
|
||||||
*
|
*
|
||||||
@ -139,6 +193,17 @@ public interface NamingService {
|
|||||||
*/
|
*/
|
||||||
Instance selectOneHealthyInstance(String serviceName, List<String> clusters) throws NacosException;
|
Instance selectOneHealthyInstance(String serviceName, List<String> clusters) throws NacosException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select one healthy instance of service using predefined load balance strategy
|
||||||
|
*
|
||||||
|
* @param serviceName name of service
|
||||||
|
* @param clusters a list of clusters should the instance belongs to
|
||||||
|
* @param subscribe if subscribe the service
|
||||||
|
* @return qualified instance
|
||||||
|
* @throws NacosException
|
||||||
|
*/
|
||||||
|
Instance selectOneHealthyInstance(String serviceName, List<String> clusters, boolean subscribe) throws NacosException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subscribe service to receive events of instances alteration
|
* Subscribe service to receive events of instances alteration
|
||||||
*
|
*
|
||||||
|
@ -20,7 +20,6 @@ import com.alibaba.nacos.api.common.Constants;
|
|||||||
import com.alibaba.nacos.api.exception.NacosException;
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
import com.alibaba.nacos.api.naming.NamingService;
|
import com.alibaba.nacos.api.naming.NamingService;
|
||||||
import com.alibaba.nacos.api.naming.listener.EventListener;
|
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.Instance;
|
||||||
import com.alibaba.nacos.api.naming.pojo.ListView;
|
import com.alibaba.nacos.api.naming.pojo.ListView;
|
||||||
import com.alibaba.nacos.api.naming.pojo.ServiceInfo;
|
import com.alibaba.nacos.api.naming.pojo.ServiceInfo;
|
||||||
@ -189,10 +188,25 @@ public class NacosNamingService implements NamingService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Instance> getAllInstances(String serviceName, List<String> clusters) throws NacosException {
|
public List<Instance> getAllInstances(String serviceName, boolean subscribe) throws NacosException {
|
||||||
|
return getAllInstances(serviceName, new ArrayList<String>(), subscribe);
|
||||||
|
}
|
||||||
|
|
||||||
ServiceInfo serviceInfo = hostReactor.getServiceInfo(serviceName, StringUtils.join(clusters, ","),
|
@Override
|
||||||
|
public List<Instance> getAllInstances(String serviceName, List<String> clusters) throws NacosException {
|
||||||
|
return getAllInstances(serviceName, clusters, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Instance> getAllInstances(String serviceName, List<String> clusters, boolean subscribe) throws NacosException {
|
||||||
|
|
||||||
|
ServiceInfo serviceInfo;
|
||||||
|
if (subscribe) {
|
||||||
|
serviceInfo = hostReactor.getServiceInfo(serviceName, StringUtils.join(clusters, ","),
|
||||||
StringUtils.EMPTY, false);
|
StringUtils.EMPTY, false);
|
||||||
|
} else {
|
||||||
|
serviceInfo = hostReactor.getServiceInfoDirectlyFromServer(serviceName, StringUtils.join(clusters, ","));
|
||||||
|
}
|
||||||
List<Instance> list;
|
List<Instance> list;
|
||||||
if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {
|
if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {
|
||||||
return new ArrayList<Instance>();
|
return new ArrayList<Instance>();
|
||||||
@ -201,41 +215,60 @@ public class NacosNamingService implements NamingService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Instance> selectInstances(String serviceName, boolean healthyOnly) throws NacosException {
|
public List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException {
|
||||||
return selectInstances(serviceName, new ArrayList<String>(), healthyOnly);
|
return selectInstances(serviceName, new ArrayList<String>(), healthy);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Instance> selectInstances(String serviceName, boolean healthy, boolean subscribe) throws NacosException {
|
||||||
|
return selectInstances(serviceName, new ArrayList<String>(), healthy, subscribe);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Instance> selectInstances(String serviceName, List<String> clusters, boolean healthy)
|
public List<Instance> selectInstances(String serviceName, List<String> clusters, boolean healthy)
|
||||||
throws NacosException {
|
throws NacosException {
|
||||||
|
return selectInstances(serviceName, clusters, healthy, true);
|
||||||
ServiceInfo serviceInfo = hostReactor.getServiceInfo(serviceName, StringUtils.join(clusters, ","),
|
|
||||||
StringUtils.EMPTY, false);
|
|
||||||
List<Instance> list;
|
|
||||||
if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {
|
|
||||||
return new ArrayList<Instance>();
|
|
||||||
}
|
|
||||||
|
|
||||||
Iterator<Instance> iterator = list.iterator();
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
Instance instance = iterator.next();
|
|
||||||
if (healthy != instance.isHealthy() || !instance.isEnabled() || instance.getWeight() <= 0) {
|
|
||||||
iterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Instance selectOneHealthyInstance(String serviceName) {
|
public List<Instance> selectInstances(String serviceName, List<String> clusters, boolean healthy,
|
||||||
|
boolean subscribe) throws NacosException {
|
||||||
|
|
||||||
|
ServiceInfo serviceInfo;
|
||||||
|
if (subscribe) {
|
||||||
|
serviceInfo = hostReactor.getServiceInfo(serviceName, StringUtils.join(clusters, ","),
|
||||||
|
StringUtils.EMPTY, false);
|
||||||
|
} else {
|
||||||
|
serviceInfo = hostReactor.getServiceInfoDirectlyFromServer(serviceName, StringUtils.join(clusters, ","));
|
||||||
|
}
|
||||||
|
return selectInstances(serviceInfo, healthy);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Instance selectOneHealthyInstance(String serviceName) throws NacosException {
|
||||||
return selectOneHealthyInstance(serviceName, new ArrayList<String>());
|
return selectOneHealthyInstance(serviceName, new ArrayList<String>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Instance selectOneHealthyInstance(String serviceName, List<String> clusters) {
|
public Instance selectOneHealthyInstance(String serviceName, boolean subscribe) throws NacosException {
|
||||||
|
return selectOneHealthyInstance(serviceName, new ArrayList<String>(), subscribe);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Instance selectOneHealthyInstance(String serviceName, List<String> clusters) throws NacosException {
|
||||||
|
return selectOneHealthyInstance(serviceName, clusters, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Instance selectOneHealthyInstance(String serviceName, List<String> clusters, boolean subscribe) throws NacosException {
|
||||||
|
|
||||||
|
if (subscribe) {
|
||||||
return Balancer.RandomByWeight.selectHost(
|
return Balancer.RandomByWeight.selectHost(
|
||||||
hostReactor.getServiceInfo(serviceName, StringUtils.join(clusters, ",")));
|
hostReactor.getServiceInfo(serviceName, StringUtils.join(clusters, ",")));
|
||||||
|
} else {
|
||||||
|
return Balancer.RandomByWeight.selectHost(
|
||||||
|
hostReactor.getServiceInfoDirectlyFromServer(serviceName, StringUtils.join(clusters, ",")));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -280,6 +313,23 @@ public class NacosNamingService implements NamingService {
|
|||||||
return serverProxy.serverHealthy() ? "UP" : "DOWN";
|
return serverProxy.serverHealthy() ? "UP" : "DOWN";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<Instance> selectInstances(ServiceInfo serviceInfo, boolean healthy) {
|
||||||
|
List<Instance> list;
|
||||||
|
if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {
|
||||||
|
return new ArrayList<Instance>();
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator<Instance> iterator = list.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
Instance instance = iterator.next();
|
||||||
|
if (healthy != instance.isHealthy() || !instance.isEnabled() || instance.getWeight() <= 0) {
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
public BeatReactor getBeatReactor() {
|
public BeatReactor getBeatReactor() {
|
||||||
return beatReactor;
|
return beatReactor;
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
package com.alibaba.nacos.client.naming.core;
|
package com.alibaba.nacos.client.naming.core;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
import com.alibaba.nacos.api.naming.pojo.Instance;
|
import com.alibaba.nacos.api.naming.pojo.Instance;
|
||||||
import com.alibaba.nacos.api.naming.pojo.ServiceInfo;
|
import com.alibaba.nacos.api.naming.pojo.ServiceInfo;
|
||||||
import com.alibaba.nacos.client.naming.backups.FailoverReactor;
|
import com.alibaba.nacos.client.naming.backups.FailoverReactor;
|
||||||
@ -210,6 +211,14 @@ public class HostReactor {
|
|||||||
return getServiceInfo(serviceName, clusters, env, false);
|
return getServiceInfo(serviceName, clusters, env, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ServiceInfo getServiceInfoDirectlyFromServer(final String serviceName, final String clusters) throws NacosException {
|
||||||
|
String result = serverProxy.queryList(serviceName, clusters, false);
|
||||||
|
if (StringUtils.isNotEmpty(result)) {
|
||||||
|
return JSON.parseObject(result, ServiceInfo.class);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public ServiceInfo getServiceInfo(final String serviceName, final String clusters, final String env,
|
public ServiceInfo getServiceInfo(final String serviceName, final String clusters, final String env,
|
||||||
final boolean allIPs) {
|
final boolean allIPs) {
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user