This is an automated email from the ASF dual-hosted git repository.
liujun pushed a commit to branch 3.1
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.1 by this push:
new 2e5941f879 [3.1] Fix group key in Nacos Service Discovery (#10253)
2e5941f879 is described below
commit 2e5941f87995abea7748d0171b0e6ede3c3e73e3
Author: Albumen Kevin <[email protected]>
AuthorDate: Mon Jul 4 16:25:49 2022 +0800
[3.1] Fix group key in Nacos Service Discovery (#10253)
---
.../registry/nacos/NacosNamingServiceWrapper.java | 12 +--
.../registry/nacos/NacosServiceDiscovery.java | 32 +++----
.../nacos/util/NacosNamingServiceUtils.java | 17 +++-
.../registry/nacos/NacosServiceDiscoveryTest.java | 97 ++++++++++++++--------
4 files changed, 96 insertions(+), 62 deletions(-)
diff --git
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java
index 6fad8f8d83..95a109d496 100644
---
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java
+++
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java
@@ -43,10 +43,6 @@ public class NacosNamingServiceWrapper {
return namingService.getServerStatus();
}
- public void subscribe(String serviceName, EventListener eventListener)
throws NacosException {
- namingService.subscribe(handleInnerSymbol(serviceName), eventListener);
- }
-
public void subscribe(String serviceName, String group, EventListener
eventListener) throws NacosException {
namingService.subscribe(handleInnerSymbol(serviceName), group,
eventListener);
}
@@ -68,12 +64,8 @@ public class NacosNamingServiceWrapper {
namingService.deregisterInstance(handleInnerSymbol(serviceName),
group, instance);
}
- public ListView<String> getServicesOfServer(int pageNo, int pageSize,
String parameter) throws NacosException {
- return namingService.getServicesOfServer(pageNo, pageSize, parameter);
- }
-
- public List<Instance> selectInstances(String serviceName, boolean healthy)
throws NacosException {
- return namingService.selectInstances(handleInnerSymbol(serviceName),
healthy);
+ public ListView<String> getServicesOfServer(int pageNo, int pageSize,
String group) throws NacosException {
+ return namingService.getServicesOfServer(pageNo, pageSize, group);
}
public List<Instance> selectInstances(String serviceName, String group,
boolean healthy) throws NacosException {
diff --git
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
index 1bf83ccfd7..e170e25be8 100644
---
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
+++
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.registry.nacos;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.config.ConfigurationUtils;
import org.apache.dubbo.common.function.ThrowableFunction;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
@@ -28,7 +29,6 @@ import
org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedLi
import org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils;
import org.apache.dubbo.rpc.model.ApplicationModel;
-import com.alibaba.nacos.api.common.Constants;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.listener.NamingEvent;
import com.alibaba.nacos.api.naming.pojo.Instance;
@@ -39,8 +39,10 @@ import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
+import static com.alibaba.nacos.api.common.Constants.DEFAULT_GROUP;
import static org.apache.dubbo.common.function.ThrowableConsumer.execute;
import static
org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils.createNamingService;
+import static
org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils.getGroup;
import static
org.apache.dubbo.registry.nacos.util.NacosNamingServiceUtils.toInstance;
/**
@@ -53,11 +55,18 @@ public class NacosServiceDiscovery extends
AbstractServiceDiscovery {
private final Logger logger = LoggerFactory.getLogger(getClass());
- private NacosNamingServiceWrapper namingService;
+ private final String group;
+
+ private final NacosNamingServiceWrapper namingService;
+
+ private static final String NACOS_SD_USE_DEFAULT_GROUP_KEY =
"dubbo.nacos-service-discovery.use-default-group";
public NacosServiceDiscovery(ApplicationModel applicationModel, URL
registryURL) {
super(applicationModel, registryURL);
this.namingService = createNamingService(registryURL);
+ // backward compatibility for 3.0.x
+ this.group =
Boolean.parseBoolean(ConfigurationUtils.getProperty(applicationModel,
NACOS_SD_USE_DEFAULT_GROUP_KEY, "false")) ?
+ DEFAULT_GROUP: getGroup(registryURL);
}
@Override
@@ -69,10 +78,7 @@ public class NacosServiceDiscovery extends
AbstractServiceDiscovery {
public void doRegister(ServiceInstance serviceInstance) {
execute(namingService, service -> {
Instance instance = toInstance(serviceInstance);
- // Should not register real group for ServiceInstance
- // Or will cause consumer unable to fetch all of the providers
from every group
- // Provider's group is invisible for consumer
- service.registerInstance(instance.getServiceName(),
Constants.DEFAULT_GROUP, instance);
+ service.registerInstance(instance.getServiceName(), group,
instance);
});
}
@@ -80,20 +86,14 @@ public class NacosServiceDiscovery extends
AbstractServiceDiscovery {
public void doUnregister(ServiceInstance serviceInstance) throws
RuntimeException {
execute(namingService, service -> {
Instance instance = toInstance(serviceInstance);
- // Should not register real group for ServiceInstance
- // Or will cause consumer unable to fetch all of the providers
from every group
- // Provider's group is invisible for consumer
- service.deregisterInstance(instance.getServiceName(),
Constants.DEFAULT_GROUP, instance);
+ service.deregisterInstance(instance.getServiceName(), group,
instance);
});
}
@Override
public Set<String> getServices() {
return ThrowableFunction.execute(namingService, service -> {
- // Should not register real group for ServiceInstance
- // Or will cause consumer unable to fetch all of the providers
from every group
- // Provider's group is invisible for consumer
- ListView<String> view = service.getServicesOfServer(0,
Integer.MAX_VALUE, Constants.DEFAULT_GROUP);
+ ListView<String> view = service.getServicesOfServer(0,
Integer.MAX_VALUE, group);
return new LinkedHashSet<>(view.getData());
});
}
@@ -101,7 +101,7 @@ public class NacosServiceDiscovery extends
AbstractServiceDiscovery {
@Override
public List<ServiceInstance> getInstances(String serviceName) throws
NullPointerException {
return ThrowableFunction.execute(namingService, service ->
- service.selectInstances(serviceName, Constants.DEFAULT_GROUP, true)
+ service.selectInstances(serviceName, group, true)
.stream().map((i) ->
NacosNamingServiceUtils.toServiceInstance(registryURL, i))
.collect(Collectors.toList())
);
@@ -116,7 +116,7 @@ public class NacosServiceDiscovery extends
AbstractServiceDiscovery {
}
execute(namingService, service ->
listener.getServiceNames().forEach(serviceName -> {
try {
- service.subscribe(serviceName, Constants.DEFAULT_GROUP, e -> {
// Register Nacos EventListener
+ service.subscribe(serviceName, group, e -> { // Register Nacos
EventListener
if (e instanceof NamingEvent) {
NamingEvent event = (NamingEvent) e;
handleEvent(event, listener);
diff --git
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java
index 33a8da4dab..857c422817 100644
---
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java
+++
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/util/NacosNamingServiceUtils.java
@@ -39,7 +39,9 @@ import static
com.alibaba.nacos.api.PropertyKeyConst.NAMING_LOAD_CACHE_AT_START;
import static com.alibaba.nacos.api.PropertyKeyConst.PASSWORD;
import static com.alibaba.nacos.api.PropertyKeyConst.SERVER_ADDR;
import static com.alibaba.nacos.api.PropertyKeyConst.USERNAME;
+import static com.alibaba.nacos.api.common.Constants.DEFAULT_GROUP;
import static
com.alibaba.nacos.client.naming.utils.UtilAndComs.NACOS_NAMING_LOG_NAME;
+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;
import static
org.apache.dubbo.common.utils.StringConstantFieldValuePredicate.of;
@@ -51,7 +53,7 @@ import static
org.apache.dubbo.common.utils.StringConstantFieldValuePredicate.of
public class NacosNamingServiceUtils {
private static final Logger logger =
LoggerFactory.getLogger(NacosNamingServiceUtils.class);
- private static String NACOS_GROUP_KEY = "nacos.group";
+ private static final String NACOS_GROUP_KEY = "nacos.group";
/**
* Convert the {@link ServiceInstance} to {@link Instance}
@@ -90,6 +92,19 @@ public class NacosNamingServiceUtils {
return serviceInstance;
}
+ /**
+ * The group of {@link NamingService} to register
+ *
+ * @param connectionURL {@link URL connection url}
+ * @return non-null, "default" as default
+ * @since 2.7.5
+ */
+ public static String getGroup(URL connectionURL) {
+ // Compatible with nacos grouping via group.
+ String group = connectionURL.getParameter(GROUP_KEY, DEFAULT_GROUP);
+ return connectionURL.getParameter(NACOS_GROUP_KEY, group);
+ }
+
/**
* Create an instance of {@link NamingService} from specified {@link URL
connection url}
*
diff --git
a/dubbo-registry/dubbo-registry-nacos/src/test/java/org/apache/dubbo/registry/nacos/NacosServiceDiscoveryTest.java
b/dubbo-registry/dubbo-registry-nacos/src/test/java/org/apache/dubbo/registry/nacos/NacosServiceDiscoveryTest.java
index 77cd1f672b..87f8cd1399 100644
---
a/dubbo-registry/dubbo-registry-nacos/src/test/java/org/apache/dubbo/registry/nacos/NacosServiceDiscoveryTest.java
+++
b/dubbo-registry/dubbo-registry-nacos/src/test/java/org/apache/dubbo/registry/nacos/NacosServiceDiscoveryTest.java
@@ -29,7 +29,9 @@ import org.apache.dubbo.rpc.model.ScopeModelUtil;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.alibaba.nacos.api.naming.pojo.ListView;
+import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
@@ -41,11 +43,12 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Set;
+import static com.alibaba.nacos.api.common.Constants.DEFAULT_GROUP;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -60,22 +63,59 @@ public class NacosServiceDiscoveryTest {
private static final String LOCALHOST = "127.0.0.1";
- private URL registryUrl;
+ protected URL registryUrl = URL.valueOf("nacos://127.0.0.1:" +
NetUtils.getAvailablePort());
private NacosServiceDiscovery nacosServiceDiscovery;
private NacosNamingServiceWrapper namingServiceWrapper;
+ protected String group = DEFAULT_GROUP;
+
private DefaultServiceInstance createServiceInstance(String serviceName,
String host, int port) {
return new DefaultServiceInstance(serviceName, host, port,
ScopeModelUtil.getApplicationModel(registryUrl.getScopeModel()));
}
+ public static class NacosServiceDiscoveryGroupTest1 extends
NacosServiceDiscoveryTest {
+ public NacosServiceDiscoveryGroupTest1() {
+ super();
+ group = "test-group1";
+ registryUrl = URL.valueOf("nacos://127.0.0.1:" +
NetUtils.getAvailablePort()).addParameter("group", group);
+ }
+ }
+
+ public static class NacosServiceDiscoveryGroupTest2 extends
NacosServiceDiscoveryTest {
+ public NacosServiceDiscoveryGroupTest2() {
+ super();
+ group = "test-group2";
+ registryUrl = URL.valueOf("nacos://127.0.0.1:" +
NetUtils.getAvailablePort()).addParameter("group", group);
+ }
+ }
+
+
+
+ public static class NacosServiceDiscoveryGroupTest3 extends
NacosServiceDiscoveryTest {
+ public NacosServiceDiscoveryGroupTest3() {
+ super();
+ group = DEFAULT_GROUP;
+ registryUrl = URL.valueOf("nacos://127.0.0.1:" +
NetUtils.getAvailablePort()).addParameter("group", "test-group3");
+ }
+
+ @BeforeAll
+ public static void beforeClass() {
+
System.setProperty("dubbo.nacos-service-discovery.use-default-group", "true");
+ }
+
+ @AfterAll
+ public static void afterClass() {
+
System.clearProperty("dubbo.nacos-service-discovery.use-default-group");
+ }
+ }
+
@BeforeEach
public void init() throws Exception {
ApplicationModel applicationModel = ApplicationModel.defaultModel();
applicationModel.getApplicationConfigManager().setApplication(new
ApplicationConfig(SERVICE_NAME));
- this.registryUrl = URL.valueOf("nacos://127.0.0.1:" +
NetUtils.getAvailablePort());
registryUrl.setScopeModel(applicationModel);
// this.nacosServiceDiscovery = new NacosServiceDiscovery(SERVICE_NAME,
registryUrl);
@@ -97,45 +137,32 @@ public class NacosServiceDiscoveryTest {
// register
nacosServiceDiscovery.doRegister(serviceInstance);
- List<Instance> instances = new ArrayList<>();
- Instance instance1 = new Instance();
- Instance instance2 = new Instance();
- Instance instance3 = new Instance();
-
- instances.add(instance1);
- instances.add(instance2);
- instances.add(instance3);
+ ArgumentCaptor<Instance> instanceCaptor =
ArgumentCaptor.forClass(Instance.class);
+ verify(namingServiceWrapper, times(1)).registerInstance(any(),
eq(group), instanceCaptor.capture());
- ArgumentCaptor<Instance> instance =
ArgumentCaptor.forClass(Instance.class);
- verify(namingServiceWrapper, times(1)).registerInstance(any(), any(),
instance.capture());
-
- when(namingServiceWrapper.getAllInstances(anyString(),
anyString())).thenReturn(instances);
- assertEquals(3, namingServiceWrapper.getAllInstances(anyString(),
anyString()).size());
+ Instance capture = instanceCaptor.getValue();
+ assertEquals(SERVICE_NAME, capture.getServiceName());
+ assertEquals(LOCALHOST, capture.getIp());
+ assertEquals(serviceInstance.getPort(), capture.getPort());
}
@Test
public void testDoUnRegister() throws NacosException {
// register
-
nacosServiceDiscovery.register(URL.valueOf("dubbo://10.0.2.3:20880/DemoService?interface=DemoService"));
- nacosServiceDiscovery.register();
-
- List<Instance> instances = new ArrayList<>();
- Instance instance1 = new Instance();
- Instance instance2 = new Instance();
- Instance instance3 = new Instance();
-
- instances.add(instance1);
- instances.add(instance2);
- instances.add(instance3);
+ DefaultServiceInstance serviceInstance =
createServiceInstance(SERVICE_NAME, LOCALHOST, NetUtils.getAvailablePort());
+ // register
+ nacosServiceDiscovery.doRegister(serviceInstance);
- ArgumentCaptor<Instance> instance =
ArgumentCaptor.forClass(Instance.class);
- verify(namingServiceWrapper, times(1)).registerInstance(any(), any(),
instance.capture());
+ // unRegister
+ nacosServiceDiscovery.doUnregister(serviceInstance);
- when(namingServiceWrapper.getAllInstances(anyString(),
anyString())).thenReturn(instances);
- assertEquals(3, namingServiceWrapper.getAllInstances(anyString(),
anyString()).size());
+ ArgumentCaptor<Instance> instanceCaptor =
ArgumentCaptor.forClass(Instance.class);
+ verify(namingServiceWrapper, times(1)).deregisterInstance(any(),
eq(group), instanceCaptor.capture());
- // unRegister
- nacosServiceDiscovery.unregister();
+ Instance capture = instanceCaptor.getValue();
+ assertEquals(SERVICE_NAME, capture.getServiceName());
+ assertEquals(LOCALHOST, capture.getIp());
+ assertEquals(serviceInstance.getPort(), capture.getPort());
}
@Test
@@ -145,7 +172,7 @@ public class NacosServiceDiscoveryTest {
nacosServiceDiscovery.doRegister(serviceInstance);
ArgumentCaptor<Instance> instance =
ArgumentCaptor.forClass(Instance.class);
- verify(namingServiceWrapper, times(1)).registerInstance(any(), any(),
instance.capture());
+ verify(namingServiceWrapper, times(1)).registerInstance(any(),
eq(group), instance.capture());
String serviceNameWithoutVersion =
"providers:org.apache.dubbo.registry.nacos.NacosService:default";
String serviceName =
"providers:org.apache.dubbo.registry.nacos.NacosService:1.0.0:default";
@@ -154,7 +181,7 @@ public class NacosServiceDiscoveryTest {
serviceNames.add(serviceName);
ListView<String> result = new ListView<>();
result.setData(serviceNames);
- when(namingServiceWrapper.getServicesOfServer(anyInt(), anyInt(),
anyString())).thenReturn(result);
+ when(namingServiceWrapper.getServicesOfServer(anyInt(), anyInt(),
eq(group))).thenReturn(result);
Set<String> services = nacosServiceDiscovery.getServices();
assertEquals(2, services.size());
}