This is an automated email from the ASF dual-hosted git repository.
liujun pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.0 by this push:
new db15513071 [3.0] Enhance ls command (#10126)
db15513071 is described below
commit db1551307100be928dc09c5ea28df8ca6b3b8bed
Author: Albumen Kevin <[email protected]>
AuthorDate: Fri Jun 10 10:26:07 2022 +0800
[3.0] Enhance ls command (#10126)
---
.../java/org/apache/dubbo/qos/command/impl/Ls.java | 6 +-
.../dubbo/qos/command/util/ServiceCheckUtils.java | 90 +++++++++++------
.../qos/command/util/ServiceCheckUtilsTest.java | 107 +++++++++++++++------
3 files changed, 144 insertions(+), 59 deletions(-)
diff --git
a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java
b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java
index 37221962c8..962a036a38 100644
---
a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java
+++
b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java
@@ -61,7 +61,11 @@ public class Ls implements BaseCommand {
//Content
for (ProviderModel providerModel : providerModelList) {
- tTable.addRow(providerModel.getServiceKey(),
ServiceCheckUtils.isRegistered(providerModel) ? "Y" : "N");
+ if (providerModel.getModuleModel().isInternal()) {
+ tTable.addRow("DubboInternal - " +
providerModel.getServiceKey(),
ServiceCheckUtils.getRegisterStatus(providerModel));
+ } else {
+ tTable.addRow(providerModel.getServiceKey(),
ServiceCheckUtils.getRegisterStatus(providerModel));
+ }
}
stringBuilder.append(tTable.rendering());
diff --git
a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/util/ServiceCheckUtils.java
b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/util/ServiceCheckUtils.java
index 6a40e57ed9..c876c0ccdb 100644
---
a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/util/ServiceCheckUtils.java
+++
b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/util/ServiceCheckUtils.java
@@ -17,50 +17,86 @@
package org.apache.dubbo.qos.command.util;
import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.constants.RegistryConstants;
+import org.apache.dubbo.common.utils.UrlUtils;
import org.apache.dubbo.registry.Registry;
-import org.apache.dubbo.registry.support.AbstractRegistry;
-import org.apache.dubbo.registry.support.RegistryManager;
+import org.apache.dubbo.registry.client.migration.MigrationInvoker;
+import org.apache.dubbo.registry.client.migration.model.MigrationStep;
+import org.apache.dubbo.rpc.cluster.ClusterInvoker;
+import org.apache.dubbo.rpc.cluster.Directory;
import org.apache.dubbo.rpc.model.ConsumerModel;
import org.apache.dubbo.rpc.model.ProviderModel;
-import java.util.Collection;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
public class ServiceCheckUtils {
- public static boolean isRegistered(ProviderModel providerModel) {
+ public static String getRegisterStatus(ProviderModel providerModel) {
// check all registries status
+ List<String> statuses = new LinkedList<>();
for (ProviderModel.RegisterStatedURL registerStatedURL :
providerModel.getStatedUrl()) {
- if (registerStatedURL.isRegistered()) {
- return true;
- }
+ URL registryUrl = registerStatedURL.getRegistryUrl();
+ boolean isServiceDiscovery =
UrlUtils.isServiceDiscoveryURL(registryUrl);
+ String protocol = isServiceDiscovery ?
registryUrl.getParameter(RegistryConstants.REGISTRY_KEY) :
registryUrl.getProtocol();
+ // e.g. zookeeper-A(Y)
+ statuses.add(protocol + "-" + (isServiceDiscovery ? "A" : "I") +
"(" + (registerStatedURL.isRegistered() ? "Y" : "N") + ")");
}
- return false;
+ // e.g. zookeeper-A(Y)/zookeeper-I(Y)
+ return String.join("/", statuses.toArray(new String[0]));
}
- public static int getConsumerAddressNum(ConsumerModel consumerModel) {
- // TODO, only check one registry by default.
+ public static String getConsumerAddressNum(ConsumerModel consumerModel) {
int num = 0;
- RegistryManager registryManager =
consumerModel.getModuleModel().getApplicationModel().getBeanFactory().getBean(RegistryManager.class);
-
- Collection<Registry> registries = registryManager.getRegistries();
- if (CollectionUtils.isNotEmpty(registries)) {
- for (Registry registry : registries) {
- if (!(registry instanceof AbstractRegistry)) {
- continue;
- }
- AbstractRegistry abstractRegistry = (AbstractRegistry)
registry;
- for (Map.Entry<URL, Map<String, List<URL>>> entry :
abstractRegistry.getNotified().entrySet()) {
- if
(entry.getKey().getServiceKey().equals(consumerModel.getServiceKey())) {
- if (CollectionUtils.isNotEmptyMap(entry.getValue())) {
- num = entry.getValue().size();
- }
- }
+ Object object =
consumerModel.getServiceMetadata().getAttribute(CommonConstants.CURRENT_CLUSTER_INVOKER_KEY);
+ Map<Registry, MigrationInvoker<?>> invokerMap;
+ List<String> nums = new LinkedList<>();
+ if (object instanceof Map) {
+ invokerMap = (Map<Registry, MigrationInvoker<?>>) object;
+ for (Map.Entry<Registry, MigrationInvoker<?>> entry :
invokerMap.entrySet()) {
+ URL registryUrl = entry.getKey().getUrl();
+ boolean isServiceDiscovery =
UrlUtils.isServiceDiscoveryURL(registryUrl);
+ String protocol = isServiceDiscovery ?
registryUrl.getParameter(RegistryConstants.REGISTRY_KEY) :
registryUrl.getProtocol();
+ MigrationInvoker<?> migrationInvoker = entry.getValue();
+ MigrationStep migrationStep =
migrationInvoker.getMigrationStep();
+ String interfaceSize =
Optional.ofNullable(migrationInvoker.getInvoker())
+ .map(ClusterInvoker::getDirectory)
+ .map(Directory::getAllInvokers)
+ .map(List::size)
+ .map(String::valueOf)
+ .orElse("-");
+ String applicationSize =
Optional.ofNullable(migrationInvoker.getServiceDiscoveryInvoker())
+ .map(ClusterInvoker::getDirectory)
+ .map(Directory::getAllInvokers)
+ .map(List::size)
+ .map(String::valueOf)
+ .orElse("-");
+ String step;
+ String size;
+ switch (migrationStep) {
+ case APPLICATION_FIRST:
+ step = "AF";
+ size = "I-" + interfaceSize + ",A-" + applicationSize;
+ break;
+ case FORCE_INTERFACE:
+ step = "I";
+ size = interfaceSize;
+ break;
+ default:
+ step = "A";
+ size = applicationSize;
+ break;
}
+ // zookeeper-AF(I-10,A-0)
+ // zookeeper-I(10)
+ // zookeeper-A(10)
+ nums.add(protocol + "-" + step + "(" + size + ")");
}
}
- return num;
+ // zookeeper-AF(I-10,A-0)/nacos-I(10)
+ return String.join("/", nums.toArray(new String[0]));
}
}
diff --git
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/ServiceCheckUtilsTest.java
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/ServiceCheckUtilsTest.java
index 41c0ada3f5..ab1509e06d 100644
---
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/ServiceCheckUtilsTest.java
+++
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/ServiceCheckUtilsTest.java
@@ -17,32 +17,31 @@
package org.apache.dubbo.qos.command.util;
-import com.google.common.collect.Lists;
import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.qos.DemoService;
import org.apache.dubbo.qos.DemoServiceImpl;
import org.apache.dubbo.registry.Registry;
-import org.apache.dubbo.registry.client.ServiceDiscoveryRegistry;
-import org.apache.dubbo.registry.support.RegistryManager;
-
+import org.apache.dubbo.registry.client.migration.MigrationInvoker;
+import org.apache.dubbo.registry.client.migration.model.MigrationStep;
+import org.apache.dubbo.rpc.cluster.ClusterInvoker;
+import org.apache.dubbo.rpc.cluster.Directory;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.ConsumerModel;
-import org.apache.dubbo.rpc.model.ModuleModel;
import org.apache.dubbo.rpc.model.ModuleServiceRepository;
import org.apache.dubbo.rpc.model.ProviderModel;
import org.apache.dubbo.rpc.model.ServiceDescriptor;
import org.apache.dubbo.rpc.model.ServiceMetadata;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
-import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.mockito.Mockito.when;
/**
* Test for ServiceCheckUtils
@@ -69,33 +68,79 @@ public class ServiceCheckUtilsTest {
new ServiceMetadata());
repository.registerProvider(providerModel);
- boolean registered = ServiceCheckUtils.isRegistered(providerModel);
- assertFalse(registered);
- }
-
- private static final ConsumerModel consumerModel;
-
- static {
- consumerModel = Mockito.mock(ConsumerModel.class);
- ServiceDiscoveryRegistry serviceDiscoveryRegistry =
Mockito.mock(ServiceDiscoveryRegistry.class);
- Collection<Registry> registries =
Lists.newArrayList(serviceDiscoveryRegistry);
-
- ModuleModel moduleModel = Mockito.mock(ModuleModel.class);
- ApplicationModel applicationModel =
Mockito.mock(ApplicationModel.class);
- ScopeBeanFactory scopeBeanFactory =
Mockito.mock(ScopeBeanFactory.class);
- RegistryManager registryManager = Mockito.mock(RegistryManager.class);
- when(applicationModel.getBeanFactory()).thenReturn(scopeBeanFactory);
-
when(scopeBeanFactory.getBean(RegistryManager.class)).thenReturn(registryManager);
- when(moduleModel.getApplicationModel()).thenReturn(applicationModel);
- when(consumerModel.getModuleModel()).thenReturn(moduleModel);
+ String url1 =
"service-discovery-registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&dubbo=2.0.2&pid=66099®istry=zookeeper×tamp=1654588337653";
+ String url2 =
"zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&dubbo=2.0.2&pid=66099×tamp=1654588337653";
+ providerModel.getStatedUrl().add(new
ProviderModel.RegisterStatedURL(url, URL.valueOf(url1), true));
+ providerModel.getStatedUrl().add(new
ProviderModel.RegisterStatedURL(url, URL.valueOf(url2), false));
- when(registryManager.getRegistries()).thenReturn(registries);
+ Assertions.assertEquals("zookeeper-A(Y)/zookeeper-I(N)",
ServiceCheckUtils.getRegisterStatus(providerModel));
}
@Test
public void testGetConsumerAddressNum() {
- int consumerAddressNum =
ServiceCheckUtils.getConsumerAddressNum(consumerModel);
- assertEquals(0, consumerAddressNum);
+ ConsumerModel consumerModel = Mockito.mock(ConsumerModel.class);
+ ServiceMetadata serviceMetadata = Mockito.mock(ServiceMetadata.class);
+
Mockito.when(consumerModel.getServiceMetadata()).thenReturn(serviceMetadata);
+ String registry1 =
"service-discovery-registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&dubbo=2.0.2&pid=66099®istry=zookeeper×tamp=1654588337653";
+ String registry2 =
"zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&dubbo=2.0.2&pid=66099×tamp=1654588337653";
+ String registry3 =
"nacos://127.0.0.1:8848/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&dubbo=2.0.2&pid=66099×tamp=1654588337653";
+ Map<Registry, MigrationInvoker<?>> invokerMap = new LinkedHashMap<>();
+ {
+ Registry registry = Mockito.mock(Registry.class);
+ Mockito.when(registry.getUrl()).thenReturn(URL.valueOf(registry1));
+ MigrationInvoker<?> migrationInvoker =
Mockito.mock(MigrationInvoker.class);
+
Mockito.when(migrationInvoker.getMigrationStep()).thenReturn(MigrationStep.FORCE_APPLICATION);
+ ClusterInvoker serviceDiscoveryInvoker =
Mockito.mock(ClusterInvoker.class);
+
Mockito.when(migrationInvoker.getServiceDiscoveryInvoker()).thenReturn(serviceDiscoveryInvoker);
+ Directory<?> sdDirectory = Mockito.mock(Directory.class);
+
Mockito.when(serviceDiscoveryInvoker.getDirectory()).thenReturn(sdDirectory);
+ List sdInvokers = Mockito.mock(List.class);
+ Mockito.when(sdDirectory.getAllInvokers()).thenReturn(sdInvokers);
+ Mockito.when(sdInvokers.size()).thenReturn(5);
+ invokerMap.put(registry, migrationInvoker);
+ }
+
+ {
+ Registry registry = Mockito.mock(Registry.class);
+ Mockito.when(registry.getUrl()).thenReturn(URL.valueOf(registry2));
+ MigrationInvoker<?> migrationInvoker =
Mockito.mock(MigrationInvoker.class);
+
Mockito.when(migrationInvoker.getMigrationStep()).thenReturn(MigrationStep.APPLICATION_FIRST);
+ ClusterInvoker serviceDiscoveryInvoker =
Mockito.mock(ClusterInvoker.class);
+
Mockito.when(migrationInvoker.getServiceDiscoveryInvoker()).thenReturn(serviceDiscoveryInvoker);
+ Directory<?> sdDirectory = Mockito.mock(Directory.class);
+
Mockito.when(serviceDiscoveryInvoker.getDirectory()).thenReturn(sdDirectory);
+ List sdInvokers = Mockito.mock(List.class);
+ Mockito.when(sdDirectory.getAllInvokers()).thenReturn(sdInvokers);
+ Mockito.when(sdInvokers.size()).thenReturn(0);
+
+ ClusterInvoker invoker = Mockito.mock(ClusterInvoker.class);
+ Mockito.when(migrationInvoker.getInvoker()).thenReturn(invoker);
+ Directory<?> directory = Mockito.mock(Directory.class);
+ Mockito.when(invoker.getDirectory()).thenReturn(directory);
+ List invokers = Mockito.mock(List.class);
+ Mockito.when(directory.getAllInvokers()).thenReturn(invokers);
+ Mockito.when(invokers.size()).thenReturn(10);
+ invokerMap.put(registry, migrationInvoker);
+ }
+
+ {
+ Registry registry = Mockito.mock(Registry.class);
+ Mockito.when(registry.getUrl()).thenReturn(URL.valueOf(registry3));
+ MigrationInvoker<?> migrationInvoker =
Mockito.mock(MigrationInvoker.class);
+
Mockito.when(migrationInvoker.getMigrationStep()).thenReturn(MigrationStep.FORCE_INTERFACE);
+ ClusterInvoker invoker = Mockito.mock(ClusterInvoker.class);
+ Mockito.when(migrationInvoker.getInvoker()).thenReturn(invoker);
+ Directory<?> directory = Mockito.mock(Directory.class);
+ Mockito.when(invoker.getDirectory()).thenReturn(directory);
+ List invokers = Mockito.mock(List.class);
+ Mockito.when(directory.getAllInvokers()).thenReturn(invokers);
+ Mockito.when(invokers.size()).thenReturn(10);
+ invokerMap.put(registry, migrationInvoker);
+ }
+
+
Mockito.when(serviceMetadata.getAttribute("currentClusterInvoker")).thenReturn(invokerMap);
+
+ assertEquals("zookeeper-A(5)/zookeeper-AF(I-10,A-0)/nacos-I(10)",
ServiceCheckUtils.getConsumerAddressNum(consumerModel));
}