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());
     }

Reply via email to