From f95111029bb36b671021583f567213c99d65538a Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Thu, 8 Jun 2023 16:20:51 +0800 Subject: [PATCH 01/19] Fix injvm invoker check (#12479) * Fix injvm invoker check * Fix injvm invoker check * Fix injvm invoker check --- .../support/wrapper/ScopeClusterInvoker.java | 36 ++++++++++++++----- .../wrapper/ScopeClusterInvokerTest.java | 3 +- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/ScopeClusterInvoker.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/ScopeClusterInvoker.java index 7ac76c2ac3..71b7ddf95d 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/ScopeClusterInvoker.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/ScopeClusterInvoker.java @@ -40,14 +40,14 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import static org.apache.dubbo.common.constants.CommonConstants.BROADCAST_CLUSTER; import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY; import static org.apache.dubbo.rpc.Constants.GENERIC_KEY; import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL; import static org.apache.dubbo.rpc.Constants.SCOPE_KEY; -import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE; import static org.apache.dubbo.rpc.Constants.SCOPE_LOCAL; +import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE; import static org.apache.dubbo.rpc.cluster.Constants.PEER_KEY; -import static org.apache.dubbo.common.constants.CommonConstants.BROADCAST_CLUSTER; /** * ScopeClusterInvoker is a cluster invoker which handles the invocation logic of a single service in a specific scope. @@ -100,7 +100,19 @@ public class ScopeClusterInvoker implements ClusterInvoker, ExporterChange @Override public boolean isAvailable() { - return isExported.get() || directory.isAvailable(); + if (peerFlag || isBroadcast()) { + // If it's a point-to-point direct connection or broadcasting, it should be called remotely. + return invoker.isAvailable(); + } + if (injvmFlag && isForceLocal()) { + // If it's a local call, it should be called locally. + return isExported.get(); + } + if (injvmFlag && isExported.get()) { + // If allow local call, check if local exported first + return true; + } + return invoker.isAvailable(); } @Override @@ -128,7 +140,7 @@ public class ScopeClusterInvoker implements ClusterInvoker, ExporterChange @Override public Result invoke(Invocation invocation) throws RpcException { // When broadcasting, it should be called remotely. - if (BROADCAST_CLUSTER.equalsIgnoreCase(getUrl().getParameter(CLUSTER_KEY))) { + if (isBroadcast()) { if (logger.isDebugEnabled()) { logger.debug("Performing broadcast call for method: " + invocation.getMethodName() + " of service: " + getUrl().getServiceKey()); } @@ -155,6 +167,10 @@ public class ScopeClusterInvoker implements ClusterInvoker, ExporterChange return invoker.invoke(invocation); } + private boolean isBroadcast() { + return BROADCAST_CLUSTER.equalsIgnoreCase(getUrl().getParameter(CLUSTER_KEY)); + } + @Override public void onExporterChangeExport(Exporter exporter) { if (isExported.get()) { @@ -230,9 +246,9 @@ public class ScopeClusterInvoker implements ClusterInvoker, ExporterChange private boolean isInjvmExported() { Boolean localInvoke = RpcContext.getServiceContext().getLocalInvoke(); boolean isExportedValue = isExported.get(); - boolean local = (localInvoke != null && localInvoke); + boolean localOnce = (localInvoke != null && localInvoke); // Determine whether this call is local - if (isExportedValue && local) { + if (isExportedValue && localOnce) { return true; } @@ -242,8 +258,7 @@ public class ScopeClusterInvoker implements ClusterInvoker, ExporterChange } // When calling locally, determine whether it does not meet the requirements - if (!isExportedValue && (SCOPE_LOCAL.equalsIgnoreCase(getUrl().getParameter(SCOPE_KEY)) || - Boolean.TRUE.toString().equalsIgnoreCase(getUrl().getParameter(LOCAL_PROTOCOL)) || local)) { + if (!isExportedValue && (isForceLocal() || localOnce)) { // If it's supposed to be exported to the local JVM ,but it's not, throw an exception throw new RpcException("Local service for " + getUrl().getServiceInterface() + " has not been exposed yet!"); } @@ -251,6 +266,11 @@ public class ScopeClusterInvoker implements ClusterInvoker, ExporterChange return isExportedValue && injvmFlag; } + private boolean isForceLocal() { + return SCOPE_LOCAL.equalsIgnoreCase(getUrl().getParameter(SCOPE_KEY)) || + Boolean.TRUE.toString().equalsIgnoreCase(getUrl().getParameter(LOCAL_PROTOCOL)); + } + /** * Creates a new Invoker for the current ScopeClusterInvoker and exports it to the local JVM. */ diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/wrapper/ScopeClusterInvokerTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/wrapper/ScopeClusterInvokerTest.java index 2d54ba72e8..389aab4d4d 100644 --- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/wrapper/ScopeClusterInvokerTest.java +++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/wrapper/ScopeClusterInvokerTest.java @@ -19,7 +19,6 @@ package org.apache.dubbo.rpc.cluster.support.wrapper; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.extension.ExtensionLoader; - import org.apache.dubbo.metrics.event.MetricsDispatcher; import org.apache.dubbo.rpc.Exporter; import org.apache.dubbo.rpc.Invocation; @@ -165,7 +164,7 @@ class ScopeClusterInvokerTest { RpcInvocation invocation = new RpcInvocation(); invocation.setMethodName("doSomething4"); invocation.setParameterTypes(new Class[]{}); - Assertions.assertTrue(cluster.isAvailable(), ""); + Assertions.assertFalse(cluster.isAvailable(), ""); RpcInvocation finalInvocation = invocation; Assertions.assertThrows(RpcException.class, () -> cluster.invoke(finalInvocation)); From 24935b1bb0e3e569cdac1914e36e622264c74d46 Mon Sep 17 00:00:00 2001 From: wangda <38549158+daziz@users.noreply.github.com> Date: Fri, 9 Jun 2023 10:29:27 +0800 Subject: [PATCH 02/19] Correcting spelling mistakes (#12480) Signed-off-by: zhangwd3 --- .../main/java/com/alibaba/dubbo/container/page/PageServlet.java | 2 +- .../config/spring/context/DubboSpringInitCustomizerHolder.java | 2 +- .../org/apache/dubbo/demo/rest/api/JaxRsRestDemoService.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/PageServlet.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/PageServlet.java index 68e287d510..040101d282 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/PageServlet.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/PageServlet.java @@ -250,7 +250,7 @@ public class PageServlet extends HttpServlet { + n + "_' + i + '_' + j).innerHTML; if (iv.length > 0 && (tv.length < iv.length || tv.indexOf(iv) == -1)) { m = false; break; } } } document.getElementById('tr_" + n - + "_' + i).style.display = (m ? '' : 'none');}\" sytle=\"width: 100%\" />"; + + "_' + i).style.display = (m ? '' : 'none');}\" style=\"width: 100%\" />"; } writer.println(" " + col + ""); } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitCustomizerHolder.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitCustomizerHolder.java index de9ebdd812..7d06e28406 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitCustomizerHolder.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitCustomizerHolder.java @@ -20,7 +20,7 @@ import java.util.HashSet; import java.util.Set; /** - * Hold a set of DubboSpringInitCustomizer, for register customizers by programing. + * Hold a set of DubboSpringInitCustomizer, for register customizers by programming. *

All customizers are store in thread local, and they will be clear after apply once.

* *

Usages:

diff --git a/dubbo-demo/dubbo-demo-interface/src/main/java/org/apache/dubbo/demo/rest/api/JaxRsRestDemoService.java b/dubbo-demo/dubbo-demo-interface/src/main/java/org/apache/dubbo/demo/rest/api/JaxRsRestDemoService.java index 198304a5b6..368489f1cf 100644 --- a/dubbo-demo/dubbo-demo-interface/src/main/java/org/apache/dubbo/demo/rest/api/JaxRsRestDemoService.java +++ b/dubbo-demo/dubbo-demo-interface/src/main/java/org/apache/dubbo/demo/rest/api/JaxRsRestDemoService.java @@ -36,7 +36,7 @@ import java.util.Map; * * @Consumers & @Produces can be not used ,we will make sure the content-type of request by arg type * but the Request method is forbidden disappear - * parameters which annotation are not present , it is from the body (jaxrs anntation is diffrent from spring web from param(only request param can ignore anntation)) + * parameters which annotation are not present , it is from the body (jaxrs annotation is different from spring web from param(only request param can ignore annotation)) * * Every method only one param from body * From 40b805ee88e10bcb62511e0fb1162750cbe83d11 Mon Sep 17 00:00:00 2001 From: Xiang Wei Zhang Date: Fri, 9 Jun 2023 15:21:58 +0800 Subject: [PATCH 03/19] Fix hashCode change in 2.6 DIY ConsistentHashLoadBalance (#12468) * Fix hashCode change in 2.6 DIY ConsistentHashLoadBalance When using 2.6.x DIY ConsistentHashLoadBalance, Invoker will wrap to CompatibleInvoker. Then invokers.hashCode() will return different hashCode event original Invokers not change. This will cause many duplicate Object like ConsistentHashSelector in jvm Eden space, and young gc will be very frequently. * add override equals * Add object and class check equals --- .../main/java/com/alibaba/dubbo/rpc/Invoker.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invoker.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invoker.java index 67d30ccdeb..c8b86f98a2 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invoker.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invoker.java @@ -95,5 +95,21 @@ public interface Invoker extends org.apache.dubbo.rpc.Invoker { public org.apache.dubbo.rpc.Invoker getOriginal() { return invoker; } + + @Override + public int hashCode() { + return invoker.hashCode(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof CompatibleInvoker)) { + return false; + } + return invoker.equals(o); + } } } From 0f7a62a8ff2a2f3f66932cea4609ff06f90bb098 Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Sat, 10 Jun 2023 18:14:30 +0800 Subject: [PATCH 04/19] Fix long time await in ThreadlessExecutor (#12484) * Fix long time await in ThreadlessExecutor * Fix uts --- .../common/threadpool/ThreadlessExecutor.java | 8 ++++++-- .../threadpool/ThreadlessExecutorTest.java | 13 ++++++++----- .../exchange/support/DefaultFutureTest.java | 2 +- .../org/apache/dubbo/rpc/AsyncRpcResult.java | 16 +++++++++++++--- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/ThreadlessExecutor.java b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/ThreadlessExecutor.java index 9e127af51e..23ef3cf235 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/ThreadlessExecutor.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/ThreadlessExecutor.java @@ -52,14 +52,18 @@ public class ThreadlessExecutor extends AbstractExecutorService { * Waits until there is a task, executes the task and all queued tasks (if there're any). The task is either a normal * response or a timeout response. */ - public void waitAndDrain() throws InterruptedException { + public void waitAndDrain(long deadline) throws InterruptedException { throwIfInterrupted(); Runnable runnable = queue.poll(); if (runnable == null) { waiter = Thread.currentThread(); try { while ((runnable = queue.poll()) == null) { - LockSupport.park(this); + long restTime = deadline - System.nanoTime(); + if (restTime <= 0) { + return; + } + LockSupport.parkNanos(this, restTime); throwIfInterrupted(); } } finally { diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/threadpool/ThreadlessExecutorTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/threadpool/ThreadlessExecutorTest.java index 5643c3c422..6c726b0702 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/threadpool/ThreadlessExecutorTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/threadpool/ThreadlessExecutorTest.java @@ -16,10 +16,11 @@ */ package org.apache.dubbo.common.threadpool; -import org.apache.dubbo.common.URL; - +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.concurrent.atomic.AtomicBoolean; + class ThreadlessExecutorTest { private static final ThreadlessExecutor executor; @@ -33,11 +34,13 @@ class ThreadlessExecutorTest { executor.execute(()->{throw new RuntimeException("test");}); } - executor.waitAndDrain(); + executor.waitAndDrain(123); - executor.execute(()->{}); + AtomicBoolean invoked = new AtomicBoolean(false); + executor.execute(()->{invoked.set(true);}); - executor.waitAndDrain(); + executor.waitAndDrain(123); + Assertions.assertTrue(invoked.get()); executor.shutdown(); } diff --git a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/DefaultFutureTest.java b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/DefaultFutureTest.java index be487e2de0..9aec7713e7 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/DefaultFutureTest.java +++ b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/DefaultFutureTest.java @@ -142,7 +142,7 @@ class DefaultFutureTest { try { new InterruptThread(Thread.currentThread()).start(); while (!f. isDone()){ - executor.waitAndDrain(); + executor.waitAndDrain(Long.MAX_VALUE); } f.get(); } catch (Exception e) { diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java index a3759cfc84..5e516c72a9 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java @@ -184,7 +184,7 @@ public class AsyncRpcResult implements Result { ThreadlessExecutor threadlessExecutor = (ThreadlessExecutor) executor; try { while (!responseFuture.isDone()) { - threadlessExecutor.waitAndDrain(); + threadlessExecutor.waitAndDrain(Long.MAX_VALUE); } } finally { threadlessExecutor.shutdown(); @@ -195,17 +195,27 @@ public class AsyncRpcResult implements Result { @Override public Result get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + long deadline = System.nanoTime() + unit.toNanos(timeout); if (executor != null && executor instanceof ThreadlessExecutor) { ThreadlessExecutor threadlessExecutor = (ThreadlessExecutor) executor; try { while (!responseFuture.isDone()) { - threadlessExecutor.waitAndDrain(); + long restTime = deadline - System.nanoTime(); + if (restTime > 0) { + threadlessExecutor.waitAndDrain(deadline); + } else { + throw new TimeoutException("Timeout after " + unit.toMillis(timeout) + "ms waiting for result."); + } } } finally { threadlessExecutor.shutdown(); } } - return responseFuture.get(timeout, unit); + long restTime = deadline - System.nanoTime(); + if (!responseFuture.isDone() && restTime < 0) { + throw new TimeoutException("Timeout after " + unit.toMillis(timeout) + "ms waiting for result."); + } + return responseFuture.get(restTime, TimeUnit.NANOSECONDS); } @Override From c7a69a60a882b49779af27967c78eade6227f6bd Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Sat, 10 Jun 2023 18:15:20 +0800 Subject: [PATCH 05/19] Check registry in checkAndUpdateSubConfigs (#12486) --- .../main/java/org/apache/dubbo/config/ReferenceConfig.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java index 0794718538..50bf549a20 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java @@ -743,6 +743,10 @@ public class ReferenceConfig extends ReferenceConfigBase { checkStubAndLocal(interfaceClass); ConfigValidationUtils.checkMock(interfaceClass, this); + if (StringUtils.isEmpty(url)) { + checkRegistry(); + } + resolveFile(); ConfigValidationUtils.validateReferenceConfig(this); postProcessConfig(); From 8a2dffd55e95d394aa05812d5948cae81fd1a3ed Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Mon, 12 Jun 2023 10:10:19 +0800 Subject: [PATCH 06/19] Add some nacos connection logs (#12494) --- .../nacos/NacosDynamicConfiguration.java | 17 +++++++++++------ .../registry/nacos/NacosConnectionManager.java | 6 +++++- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java index 7a851e45f0..1c1e2afda4 100644 --- a/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java +++ b/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java @@ -17,11 +17,6 @@ package org.apache.dubbo.configcenter.support.nacos; -import com.alibaba.nacos.api.NacosFactory; -import com.alibaba.nacos.api.PropertyKeyConst; -import com.alibaba.nacos.api.config.ConfigService; -import com.alibaba.nacos.api.config.listener.AbstractSharedListener; -import com.alibaba.nacos.api.exception.NacosException; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.config.configcenter.ConfigChangeType; import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent; @@ -38,6 +33,12 @@ import org.apache.dubbo.metrics.config.event.ConfigCenterEvent; import org.apache.dubbo.metrics.event.MetricsEventBus; import org.apache.dubbo.rpc.model.ApplicationModel; +import com.alibaba.nacos.api.NacosFactory; +import com.alibaba.nacos.api.PropertyKeyConst; +import com.alibaba.nacos.api.config.ConfigService; +import com.alibaba.nacos.api.config.listener.AbstractSharedListener; +import com.alibaba.nacos.api.exception.NacosException; + import java.util.Map; import java.util.Properties; import java.util.Set; @@ -107,11 +108,15 @@ public class NacosDynamicConfiguration implements DynamicConfiguration { try { for (int i = 0; i < retryTimes + 1; i++) { tmpConfigServices = NacosFactory.createConfigService(nacosProperties); - if (!check || (UP.equals(tmpConfigServices.getServerStatus()) && testConfigService(tmpConfigServices))) { + String serverStatus = tmpConfigServices.getServerStatus(); + boolean configServiceAvailable = testConfigService(tmpConfigServices); + if (!check || (UP.equals(serverStatus) && configServiceAvailable)) { break; } else { logger.warn(LoggerCodeConstants.CONFIG_ERROR_NACOS, "", "", "Failed to connect to nacos config server. " + + "Server status: " + serverStatus + ". " + + "Config Service Available: " + configServiceAvailable + ". " + (i < retryTimes ? "Dubbo will try to retry in " + sleepMsBetweenRetries + ". " : "Exceed retry max times.") + "Try times: " + (i + 1)); } diff --git a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosConnectionManager.java b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosConnectionManager.java index 2082abd2b0..2992d9677e 100644 --- a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosConnectionManager.java +++ b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosConnectionManager.java @@ -121,11 +121,15 @@ public class NacosConnectionManager { try { for (int i = 0; i < retryTimes + 1; i++) { namingService = NacosFactory.createNamingService(nacosProperties); - if (!check || (UP.equals(namingService.getServerStatus()) && testNamingService(namingService))) { + String serverStatus = namingService.getServerStatus(); + boolean namingServiceAvailable = testNamingService(namingService); + if (!check || (UP.equals(serverStatus) && namingServiceAvailable)) { break; } else { logger.warn(LoggerCodeConstants.REGISTRY_NACOS_EXCEPTION, "", "", "Failed to connect to nacos naming server. " + + "Server status: " + serverStatus + ". " + + "Naming Service Available: " + namingServiceAvailable + ". " + (i < retryTimes ? "Dubbo will try to retry in " + sleepMsBetweenRetries + ". " : "Exceed retry max times.") + "Try times: " + (i + 1)); } From 6325a765bcf3dc4457c9e99a753b418c4657019b Mon Sep 17 00:00:00 2001 From: conghuhu <56248584+conghuhu@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:23:55 +0800 Subject: [PATCH 07/19] feat: add springboot-starter for nacos and zookeeper (#12488) --- .artifacts | 3 + dubbo-distribution/dubbo-bom/pom.xml | 15 +++ .../dubbo-nacos-spring-boot-starter/pom.xml | 44 +++++++ .../pom.xml | 115 ++++++++++++++++++ .../pom.xml | 48 ++++++++ .../observability}/autoconfigure/pom.xml | 0 ...bboMicrometerTracingAutoConfiguration.java | 0 .../DubboObservationAutoConfiguration.java | 0 .../autoconfigure/ObservabilityUtils.java | 0 .../ObservationHandlerGrouping.java | 0 .../ObservationRegistryPostProcessor.java | 0 .../ConditionalOnDubboTracingEnable.java | 0 .../brave/BraveAutoConfiguration.java | 0 .../exporter/otlp/OtlpAutoConfiguration.java | 0 .../exporter/zipkin/HttpSender.java | 0 .../zipkin/ZipkinAutoConfiguration.java | 0 .../exporter/zipkin/ZipkinConfigurations.java | 0 .../zipkin/ZipkinRestTemplateSender.java | 0 .../zipkin/ZipkinWebClientSender.java | 0 .../ZipkinRestTemplateBuilderCustomizer.java | 0 .../ZipkinWebClientBuilderCustomizer.java | 0 .../otel/OpenTelemetryAutoConfiguration.java | 0 .../main/resources/META-INF/spring.factories | 0 ...ot.autoconfigure.AutoConfiguration.imports | 0 ...crometerTracingAutoConfigurationTests.java | 0 .../pom.xml | 0 .../pom.xml | 0 .../pom.xml | 0 .../pom.xml | 0 .../observability}/pom.xml | 2 +- .../dubbo-spring-boot-starters/pom.xml | 41 +++++++ dubbo-spring-boot/pom.xml | 2 +- 32 files changed, 268 insertions(+), 2 deletions(-) create mode 100644 dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-nacos-spring-boot-starter/pom.xml create mode 100644 dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-zookeeper-curator5-spring-boot-starter/pom.xml create mode 100644 dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-zookeeper-spring-boot-starter/pom.xml rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/pom.xml (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboMicrometerTracingAutoConfiguration.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboObservationAutoConfiguration.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservabilityUtils.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservationHandlerGrouping.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservationRegistryPostProcessor.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/annotation/ConditionalOnDubboTracingEnable.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/brave/BraveAutoConfiguration.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/otlp/OtlpAutoConfiguration.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/HttpSender.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinAutoConfiguration.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinConfigurations.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinRestTemplateSender.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinWebClientSender.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/customizer/ZipkinRestTemplateBuilderCustomizer.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/customizer/ZipkinWebClientBuilderCustomizer.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/otel/OpenTelemetryAutoConfiguration.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/resources/META-INF/spring.factories (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/autoconfigure/src/test/java/org/apache/dubbo/spring/boot/observability/autoconfigure/observability/DubboMicrometerTracingAutoConfigurationTests.java (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/dubbo-spring-boot-observability-starter/pom.xml (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/dubbo-spring-boot-tracing-brave-zipkin-starter/pom.xml (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/dubbo-spring-boot-tracing-otel-otlp-starter/pom.xml (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/dubbo-spring-boot-tracing-otel-zipkin-starter/pom.xml (100%) rename dubbo-spring-boot/{dubbo-spring-boot-observability-starters => dubbo-spring-boot-starters/observability}/pom.xml (98%) create mode 100644 dubbo-spring-boot/dubbo-spring-boot-starters/pom.xml diff --git a/.artifacts b/.artifacts index 8a62716f73..a4fd1eb340 100644 --- a/.artifacts +++ b/.artifacts @@ -109,5 +109,8 @@ dubbo-spring-boot-tracing-otel-zipkin-starter dubbo-spring-boot-tracing-otel-otlp-starter dubbo-spring-boot-observability-starter dubbo-spring-boot-starter +dubbo-nacos-spring-boot-starter +dubbo-zookeeper-spring-boot-starter +dubbo-zookeeper-curator5-spring-boot-starter dubbo-spring-security dubbo-xds diff --git a/dubbo-distribution/dubbo-bom/pom.xml b/dubbo-distribution/dubbo-bom/pom.xml index 2e6deddfac..50978767f3 100644 --- a/dubbo-distribution/dubbo-bom/pom.xml +++ b/dubbo-distribution/dubbo-bom/pom.xml @@ -532,6 +532,21 @@ dubbo-spring-boot-observability-starter ${project.version} + + org.apache.dubbo + dubbo-nacos-spring-boot-starter + ${project.version} + + + org.apache.dubbo + dubbo-zookeeper-spring-boot-starter + ${project.version} + + + org.apache.dubbo + dubbo-zookeeper-curator5-spring-boot-starter + ${project.version} + diff --git a/dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-nacos-spring-boot-starter/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-nacos-spring-boot-starter/pom.xml new file mode 100644 index 0000000000..7f4df2957a --- /dev/null +++ b/dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-nacos-spring-boot-starter/pom.xml @@ -0,0 +1,44 @@ + + + + + org.apache.dubbo + dubbo-spring-boot-starters + ${revision} + ../pom.xml + + 4.0.0 + + dubbo-nacos-spring-boot-starter + ${revision} + jar + Apache Dubbo Nacos Spring Boot Starter + + + + + + + com.alibaba.nacos + nacos-client + + + + \ No newline at end of file diff --git a/dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-zookeeper-curator5-spring-boot-starter/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-zookeeper-curator5-spring-boot-starter/pom.xml new file mode 100644 index 0000000000..2cd0feb699 --- /dev/null +++ b/dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-zookeeper-curator5-spring-boot-starter/pom.xml @@ -0,0 +1,115 @@ + + + + + org.apache.dubbo + dubbo-spring-boot-starters + ${revision} + ../pom.xml + + 4.0.0 + + dubbo-zookeeper-curator5-spring-boot-starter + ${revision} + jar + Apache Dubbo Zookeeper Curator5 Spring Boot Starter + + + 5.1.0 + 3.8.1 + + + + + + org.apache.zookeeper + parent + ${zookeeper_version} + pom + import + + + + + + + org.apache.curator + curator-x-discovery + ${curator5_version} + + + org.apache.zookeeper + zookeeper + ${zookeeper_version} + + + io.netty + netty-handler + + + io.netty + netty-transport-native-epoll + + + + + + com.github.spotbugs + spotbugs-annotations + true + + + + commons-cli + commons-cli + + + + org.eclipse.jetty + jetty-server + + + + org.eclipse.jetty + jetty-servlet + + + + org.eclipse.jetty + jetty-client + + + + jline + jline + + + + io.dropwizard.metrics + metrics-core + + + + org.xerial.snappy + snappy-java + + + + \ No newline at end of file diff --git a/dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-zookeeper-spring-boot-starter/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-zookeeper-spring-boot-starter/pom.xml new file mode 100644 index 0000000000..189443c440 --- /dev/null +++ b/dubbo-spring-boot/dubbo-spring-boot-starters/dubbo-zookeeper-spring-boot-starter/pom.xml @@ -0,0 +1,48 @@ + + + + 4.0.0 + + org.apache.dubbo + dubbo-spring-boot-starters + ${revision} + ../pom.xml + + + dubbo-zookeeper-spring-boot-starter + ${revision} + jar + Apache Dubbo Zookeeper Spring Boot Starter + + + + + + + org.apache.curator + curator-x-discovery + + + org.apache.zookeeper + zookeeper + + + + \ No newline at end of file diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/pom.xml similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/pom.xml rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/pom.xml diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboMicrometerTracingAutoConfiguration.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboMicrometerTracingAutoConfiguration.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboMicrometerTracingAutoConfiguration.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboMicrometerTracingAutoConfiguration.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboObservationAutoConfiguration.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboObservationAutoConfiguration.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboObservationAutoConfiguration.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboObservationAutoConfiguration.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservabilityUtils.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservabilityUtils.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservabilityUtils.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservabilityUtils.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservationHandlerGrouping.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservationHandlerGrouping.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservationHandlerGrouping.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservationHandlerGrouping.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservationRegistryPostProcessor.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservationRegistryPostProcessor.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservationRegistryPostProcessor.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/ObservationRegistryPostProcessor.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/annotation/ConditionalOnDubboTracingEnable.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/annotation/ConditionalOnDubboTracingEnable.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/annotation/ConditionalOnDubboTracingEnable.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/annotation/ConditionalOnDubboTracingEnable.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/brave/BraveAutoConfiguration.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/brave/BraveAutoConfiguration.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/brave/BraveAutoConfiguration.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/brave/BraveAutoConfiguration.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/otlp/OtlpAutoConfiguration.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/otlp/OtlpAutoConfiguration.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/otlp/OtlpAutoConfiguration.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/otlp/OtlpAutoConfiguration.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/HttpSender.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/HttpSender.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/HttpSender.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/HttpSender.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinAutoConfiguration.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinAutoConfiguration.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinAutoConfiguration.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinAutoConfiguration.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinConfigurations.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinConfigurations.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinConfigurations.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinConfigurations.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinRestTemplateSender.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinRestTemplateSender.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinRestTemplateSender.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinRestTemplateSender.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinWebClientSender.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinWebClientSender.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinWebClientSender.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/ZipkinWebClientSender.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/customizer/ZipkinRestTemplateBuilderCustomizer.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/customizer/ZipkinRestTemplateBuilderCustomizer.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/customizer/ZipkinRestTemplateBuilderCustomizer.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/customizer/ZipkinRestTemplateBuilderCustomizer.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/customizer/ZipkinWebClientBuilderCustomizer.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/customizer/ZipkinWebClientBuilderCustomizer.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/customizer/ZipkinWebClientBuilderCustomizer.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/exporter/zipkin/customizer/ZipkinWebClientBuilderCustomizer.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/otel/OpenTelemetryAutoConfiguration.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/otel/OpenTelemetryAutoConfiguration.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/otel/OpenTelemetryAutoConfiguration.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/otel/OpenTelemetryAutoConfiguration.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring.factories b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/resources/META-INF/spring.factories similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring.factories rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/resources/META-INF/spring.factories diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/test/java/org/apache/dubbo/spring/boot/observability/autoconfigure/observability/DubboMicrometerTracingAutoConfigurationTests.java b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/test/java/org/apache/dubbo/spring/boot/observability/autoconfigure/observability/DubboMicrometerTracingAutoConfigurationTests.java similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/autoconfigure/src/test/java/org/apache/dubbo/spring/boot/observability/autoconfigure/observability/DubboMicrometerTracingAutoConfigurationTests.java rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/test/java/org/apache/dubbo/spring/boot/observability/autoconfigure/observability/DubboMicrometerTracingAutoConfigurationTests.java diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-observability-starter/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/dubbo-spring-boot-observability-starter/pom.xml similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-observability-starter/pom.xml rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/dubbo-spring-boot-observability-starter/pom.xml diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-tracing-brave-zipkin-starter/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/dubbo-spring-boot-tracing-brave-zipkin-starter/pom.xml similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-tracing-brave-zipkin-starter/pom.xml rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/dubbo-spring-boot-tracing-brave-zipkin-starter/pom.xml diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-tracing-otel-otlp-starter/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/dubbo-spring-boot-tracing-otel-otlp-starter/pom.xml similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-tracing-otel-otlp-starter/pom.xml rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/dubbo-spring-boot-tracing-otel-otlp-starter/pom.xml diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-tracing-otel-zipkin-starter/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/dubbo-spring-boot-tracing-otel-zipkin-starter/pom.xml similarity index 100% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/dubbo-spring-boot-tracing-otel-zipkin-starter/pom.xml rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/dubbo-spring-boot-tracing-otel-zipkin-starter/pom.xml diff --git a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/pom.xml similarity index 98% rename from dubbo-spring-boot/dubbo-spring-boot-observability-starters/pom.xml rename to dubbo-spring-boot/dubbo-spring-boot-starters/observability/pom.xml index 01d7d6fa21..adb9dda980 100644 --- a/dubbo-spring-boot/dubbo-spring-boot-observability-starters/pom.xml +++ b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/pom.xml @@ -20,7 +20,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> org.apache.dubbo - dubbo-spring-boot + dubbo-spring-boot-starters ${revision} ../pom.xml diff --git a/dubbo-spring-boot/dubbo-spring-boot-starters/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/pom.xml new file mode 100644 index 0000000000..7414f9e786 --- /dev/null +++ b/dubbo-spring-boot/dubbo-spring-boot-starters/pom.xml @@ -0,0 +1,41 @@ + + + + + + org.apache.dubbo + dubbo-spring-boot + ${revision} + ../pom.xml + + 4.0.0 + + dubbo-spring-boot-starters + pom + Apache Dubbo Spring Boot Starters + + + observability + dubbo-nacos-spring-boot-starter + dubbo-zookeeper-spring-boot-starter + dubbo-zookeeper-curator5-spring-boot-starter + + + \ No newline at end of file diff --git a/dubbo-spring-boot/pom.xml b/dubbo-spring-boot/pom.xml index 49cebf9b27..65eadbd7fc 100644 --- a/dubbo-spring-boot/pom.xml +++ b/dubbo-spring-boot/pom.xml @@ -36,7 +36,7 @@ dubbo-spring-boot-autoconfigure dubbo-spring-boot-compatible dubbo-spring-boot-starter - dubbo-spring-boot-observability-starters + dubbo-spring-boot-starters From 51f60139f04f4834c44c54c52c81258755903bd0 Mon Sep 17 00:00:00 2001 From: suncairong163 <105478245+suncairong163@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:38:05 +0800 Subject: [PATCH 08/19] Feature/dubbo3.2 export path matcher&invoker to user (#12482) --- .../dubbo/metadata/rest/PathMatcher.java | 73 +++++++++++- .../metadata/rest/ServiceRestMetadata.java | 1 + .../dubbo/metadata/PathMatcherTest.java | 35 ++++++ .../protocol/rest/PathAndInvokerMapper.java | 26 ++-- .../protocol/rest/RestRPCInvocationUtil.java | 111 ++++++++++++++++-- .../protocol/rest/constans/RestConstant.java | 5 + .../rest/handler/NettyHttpHandler.java | 14 ++- .../protocol/rest/JaxrsRestProtocolTest.java | 23 ++++ .../rest/rest/TestGetInvokerService.java | 30 +++++ .../rest/rest/TestGetInvokerServiceImpl.java | 57 +++++++++ 10 files changed, 341 insertions(+), 34 deletions(-) create mode 100644 dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/rest/TestGetInvokerService.java create mode 100644 dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/rest/TestGetInvokerServiceImpl.java diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/PathMatcher.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/PathMatcher.java index f4d57b1c30..7abefcf71e 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/PathMatcher.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/PathMatcher.java @@ -17,6 +17,8 @@ package org.apache.dubbo.metadata.rest; +import java.lang.reflect.Method; +import java.util.Arrays; import java.util.Objects; /** @@ -32,8 +34,13 @@ public class PathMatcher { private boolean hasPathVariable; private String contextPath; private String httpMethod; - // for provider http method compare - private boolean needCompareMethod = true; + // for provider http method compare,http 405 + private boolean needCompareHttpMethod = true; + // compare method directly (for get Invoker by method) + private boolean needCompareServiceMethod = false; + + // service method + private Method method; public PathMatcher(String path) { @@ -53,7 +60,14 @@ public class PathMatcher { setHttpMethod(httpMethod); } + public PathMatcher(Method method) { + this.method = method; + } + private void dealPathVariable(String path) { + if (path == null) { + return; + } this.pathSplits = path.split(SEPARATOR); for (String pathSplit : pathSplits) { @@ -99,6 +113,10 @@ public class PathMatcher { return new PathMatcher(path, version, group, port, method).noNeedHttpMethodCompare(); } + public static PathMatcher getInvokeCreatePathMatcher(Method serviceMethod) { + return new PathMatcher(serviceMethod).setNeedCompareServiceMethod(true); + } + public boolean hasPathVariable() { return hasPathVariable; } @@ -117,7 +135,20 @@ public class PathMatcher { } private PathMatcher noNeedHttpMethodCompare() { - this.needCompareMethod = false; + this.needCompareHttpMethod = false; + return this; + } + + public Method getMethod() { + return method; + } + + public void setMethod(Method method) { + this.method = method; + } + + private PathMatcher setNeedCompareServiceMethod(boolean needCompareServiceMethod) { + this.needCompareServiceMethod = needCompareServiceMethod; return this; } @@ -126,18 +157,48 @@ public class PathMatcher { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PathMatcher that = (PathMatcher) o; - return pathEqual(that) - && Objects.equals(version, that.version) - && (this.needCompareMethod ? Objects.equals(httpMethod, that.httpMethod) : true) + return serviceMethodEqual(that, this) + || pathMatch(that); + } + + private boolean pathMatch(PathMatcher that) { + return (!that.needCompareServiceMethod && !needCompareServiceMethod) // no need service method compare + && pathEqual(that) // path compare + && Objects.equals(version, that.version) // service version compare + && httpMethodMatch(that) // http method compare && Objects.equals(group, that.group) && Objects.equals(port, that.port); } + /** + * it is needed to compare http method when one of needCompareHttpMethod is true,and don`t compare when both needCompareHttpMethod are false + * + * @param that + * @return + */ + private boolean httpMethodMatch(PathMatcher that) { + return !that.needCompareHttpMethod || !this.needCompareHttpMethod ? true: Objects.equals(this.httpMethod, that.httpMethod); + } + + private boolean serviceMethodEqual(PathMatcher thatPathMatcher, PathMatcher thisPathMatcher) { + Method thatMethod = thatPathMatcher.method; + Method thisMethod = thisPathMatcher.method; + return thatMethod != null + && thisMethod != null + && (thatPathMatcher.needCompareServiceMethod || thisPathMatcher.needCompareServiceMethod) + && thisMethod.getName().equals(thatMethod.getName()) + && Arrays.equals(thisMethod.getParameterTypes(), thatMethod.getParameterTypes()); + } + @Override public int hashCode() { return Objects.hash(version, group, port); } private boolean pathEqual(PathMatcher pathMatcher) { + // path is null return false directly + if (this.path == null || pathMatcher.path == null) { + return false; + } // no place hold diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ServiceRestMetadata.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ServiceRestMetadata.java index 14f8bdcbb9..b384bbd7d5 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ServiceRestMetadata.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ServiceRestMetadata.java @@ -111,6 +111,7 @@ public class ServiceRestMetadata implements Serializable { public void addRestMethodMetadata(RestMethodMetadata restMethodMetadata) { PathMatcher pathMather = new PathMatcher(restMethodMetadata.getRequest().getPath(), this.getVersion(), this.getGroup(), this.getPort(),restMethodMetadata.getRequest().getMethod()); + pathMather.setMethod(restMethodMetadata.getReflectMethod()); addPathToServiceMap(pathMather, restMethodMetadata); addMethodToServiceMap(restMethodMetadata); getMeta().add(restMethodMetadata); diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/PathMatcherTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/PathMatcherTest.java index 8e56cc202d..b46675c3bf 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/PathMatcherTest.java +++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/PathMatcherTest.java @@ -20,6 +20,8 @@ import org.apache.dubbo.metadata.rest.PathMatcher; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.lang.reflect.Method; + public class PathMatcherTest { @Test @@ -65,4 +67,37 @@ public class PathMatcherTest { Assertions.assertEquals(pathMatherMeta, pathMatherMeta1); Assertions.assertEquals(pathMatherMeta.toString(), pathMatherMeta1.toString()); } + + @Test + void testMethodCompare() { + Method hashCode = null; + Method equals = null; + try { + hashCode = Object.class.getDeclaredMethod("hashCode"); + equals = Object.class.getDeclaredMethod("equals", Object.class); + } catch (NoSuchMethodException e) { + + } + + // no need to compare service method + PathMatcher pathMatcher = new PathMatcher(hashCode); + PathMatcher pathMatchers = new PathMatcher(hashCode); + Assertions.assertNotEquals(pathMatcher, pathMatchers); + + + // equal + PathMatcher pathMatherMetaHashCode = PathMatcher.getInvokeCreatePathMatcher(hashCode); + PathMatcher pathMatherMetaHashCodes = new PathMatcher(hashCode); + Assertions.assertEquals(pathMatherMetaHashCode, pathMatherMetaHashCodes); + + + PathMatcher pathMatherMetaEquals = PathMatcher.getInvokeCreatePathMatcher(equals); + PathMatcher pathMatherMetaEqual = PathMatcher.getInvokeCreatePathMatcher(equals); + Assertions.assertEquals(pathMatherMetaEqual, pathMatherMetaEquals); + + + Assertions.assertNotEquals(pathMatherMetaHashCode, pathMatherMetaEquals); + } + + } diff --git a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/PathAndInvokerMapper.java b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/PathAndInvokerMapper.java index 1d7aa3de05..a9fc5c2d2d 100644 --- a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/PathAndInvokerMapper.java +++ b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/PathAndInvokerMapper.java @@ -22,7 +22,6 @@ import org.apache.dubbo.metadata.rest.PathMatcher; import org.apache.dubbo.metadata.rest.RestMethodMetadata; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.protocol.rest.exception.DoublePathCheckException; -import org.apache.dubbo.rpc.protocol.rest.exception.PathNoFoundException; import org.apache.dubbo.rpc.protocol.rest.pair.InvokerAndRestMethodMetadataPair; import java.util.Map; @@ -56,31 +55,26 @@ public class PathAndInvokerMapper { }); } + /** - * acquire metadata & invoker by service info - * - * @param path - * @param version - * @param group - * @param port + * get rest method metadata by path matcher + * @param pathMatcher * @return */ - public InvokerAndRestMethodMetadataPair getRestMethodMetadata(String path, String version, String group, Integer port,String method) { - - - PathMatcher pathMather = PathMatcher.getInvokeCreatePathMatcher(path, version, group, port,method); + public InvokerAndRestMethodMetadataPair getRestMethodMetadata(PathMatcher pathMatcher) { // first search from pathToServiceMapNoPathVariable - if (pathToServiceMapNoPathVariable.containsKey(pathMather)) { - return pathToServiceMapNoPathVariable.get(pathMather); + if (pathToServiceMapNoPathVariable.containsKey(pathMatcher)) { + return pathToServiceMapNoPathVariable.get(pathMatcher); } // second search from pathToServiceMapContainPathVariable - if (pathToServiceMapContainPathVariable.containsKey(pathMather)) { - return pathToServiceMapContainPathVariable.get(pathMather); + if (pathToServiceMapContainPathVariable.containsKey(pathMatcher)) { + return pathToServiceMapContainPathVariable.get(pathMatcher); } - throw new PathNoFoundException("rest service Path no found, current path info:" + pathMather); + return null; + } /** diff --git a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestRPCInvocationUtil.java b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestRPCInvocationUtil.java index 1d0221a587..e736a39292 100644 --- a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestRPCInvocationUtil.java +++ b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestRPCInvocationUtil.java @@ -20,16 +20,21 @@ import org.apache.dubbo.common.BaseServiceMetadata; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.metadata.rest.ArgInfo; +import org.apache.dubbo.metadata.rest.PathMatcher; import org.apache.dubbo.metadata.rest.RestMethodMetadata; +import org.apache.dubbo.rpc.Invoker; +import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcInvocation; import org.apache.dubbo.rpc.protocol.rest.annotation.ParamParserManager; import org.apache.dubbo.rpc.protocol.rest.annotation.param.parse.provider.ProviderParseContext; +import org.apache.dubbo.rpc.protocol.rest.constans.RestConstant; import org.apache.dubbo.rpc.protocol.rest.exception.ParamParseException; import org.apache.dubbo.rpc.protocol.rest.pair.InvokerAndRestMethodMetadataPair; import org.apache.dubbo.rpc.protocol.rest.request.RequestFacade; import org.apache.dubbo.rpc.protocol.rest.util.HttpHeaderUtil; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; @@ -77,15 +82,15 @@ public class RestRPCInvocationUtil { * create parseMethodArgs context * * @param request - * @param servletRequest - * @param servletResponse + * @param originRequest + * @param originResponse * @param restMethodMetadata * @return */ - private static ProviderParseContext createParseContext(RequestFacade request, Object servletRequest, Object servletResponse, RestMethodMetadata restMethodMetadata) { + private static ProviderParseContext createParseContext(RequestFacade request, Object originRequest, Object originResponse, RestMethodMetadata restMethodMetadata) { ProviderParseContext parseContext = new ProviderParseContext(request); - parseContext.setResponse(servletResponse); - parseContext.setRequest(servletRequest); + parseContext.setResponse(originResponse); + parseContext.setRequest(originRequest); Object[] objects = new Object[restMethodMetadata.getArgInfos().size()]; parseContext.setArgs(Arrays.asList(objects)); @@ -124,19 +129,105 @@ public class RestRPCInvocationUtil { /** - * get path mapping + * get InvokerAndRestMethodMetadataPair by path matcher * - * @param request - * @param pathAndInvokerMapper + * @param pathMatcher * @return */ - public static InvokerAndRestMethodMetadataPair getRestMethodMetadata(RequestFacade request, PathAndInvokerMapper pathAndInvokerMapper) { + public static InvokerAndRestMethodMetadataPair getRestMethodMetadataAndInvokerPair(PathMatcher pathMatcher) { + + PathAndInvokerMapper pathAndInvokerMapper = (PathAndInvokerMapper) RpcContext.getServerAttachment().getObjectAttachment(RestConstant.PATH_AND_INVOKER_MAPPER); + + if (pathAndInvokerMapper == null) { + return null; + } + return pathAndInvokerMapper.getRestMethodMetadata(pathMatcher); + } + + /** + * get InvokerAndRestMethodMetadataPair from rpc context + * + * @param request + * @return + */ + + public static InvokerAndRestMethodMetadataPair getRestMethodMetadataAndInvokerPair(RequestFacade request) { + + + PathMatcher pathMather = createPathMatcher(request); + + return getRestMethodMetadataAndInvokerPair(pathMather); + } + + + /** + * get invoker by request + * + * @param request + * @return + */ + + public static Invoker getInvokerByRequest(RequestFacade request) { + + PathMatcher pathMatcher = createPathMatcher(request); + + return getInvoker(pathMatcher); + } + + + /** + * get invoker by service method + * + * compare method`s name,param types + * + * @param serviceMethod + * @return + */ + + public static Invoker getInvokerByServiceInvokeMethod(Method serviceMethod) { + + if (serviceMethod == null) { + return null; + } + + InvokerAndRestMethodMetadataPair pair = getRestMethodMetadataAndInvokerPair(PathMatcher.getInvokeCreatePathMatcher(serviceMethod)); + + if (pair == null) { + return null; + } + + return pair.getInvoker(); + } + + /** + * get invoker by path matcher + * + * @param pathMatcher + * @return + */ + public static Invoker getInvoker(PathMatcher pathMatcher) { + InvokerAndRestMethodMetadataPair pair = getRestMethodMetadataAndInvokerPair(pathMatcher); + + if (pair == null) { + return null; + } + + return pair.getInvoker(); + } + + /** + * create path matcher by request + * + * @param request + * @return + */ + public static PathMatcher createPathMatcher(RequestFacade request) { String path = request.getPath(); String version = request.getHeader(RestHeaderEnum.VERSION.getHeader()); String group = request.getHeader(RestHeaderEnum.GROUP.getHeader()); String method = request.getMethod(); - return pathAndInvokerMapper.getRestMethodMetadata(path, version, group, null, method); + return PathMatcher.getInvokeCreatePathMatcher(path, version, group, null, method); } diff --git a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/constans/RestConstant.java b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/constans/RestConstant.java index b853c5477c..09835f8cd6 100644 --- a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/constans/RestConstant.java +++ b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/constans/RestConstant.java @@ -63,5 +63,10 @@ public interface RestConstant { int IDLE_TIMEOUT = -1; int KEEP_ALIVE_TIMEOUT = 60; + /** + * ServerAttachment pathAndInvokerMapper key + */ + String PATH_AND_INVOKER_MAPPER = "pathAndInvokerMapper"; + } diff --git a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/handler/NettyHttpHandler.java b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/handler/NettyHttpHandler.java index 7edf7c4ddf..f82f21737d 100644 --- a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/handler/NettyHttpHandler.java +++ b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/handler/NettyHttpHandler.java @@ -17,6 +17,7 @@ package org.apache.dubbo.rpc.protocol.rest.handler; import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpRequest; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.metadata.rest.RestMethodMetadata; @@ -44,6 +45,8 @@ import org.apache.dubbo.rpc.protocol.rest.util.MediaTypeUtil; import java.io.IOException; +import static org.apache.dubbo.rpc.protocol.rest.constans.RestConstant.PATH_AND_INVOKER_MAPPER; + /** * netty http request handler */ @@ -72,6 +75,8 @@ public class NettyHttpHandler implements HttpHandler{ + URL exportUrl = URL.valueOf("rest://127.0.0.1:" + availablePort + "/rest?interface=org.apache.dubbo.rpc.protocol.rest.rest.TestGetInvokerService"); + + TestGetInvokerService server = new TestGetInvokerServiceImpl(); + + URL url = this.registerProvider(exportUrl, server, DemoService.class); + + Exporter exporter = protocol.export(proxy.getInvoker(server, TestGetInvokerService.class, url)); + + TestGetInvokerService invokerService = this.proxy.getProxy(protocol.refer(TestGetInvokerService.class, url)); + + + String invoker = invokerService.getInvoker(); + Assertions.assertEquals("success", invoker); + + exporter.unexport(); + }); + } + private URL registerProvider(URL url, Object impl, Class interfaceClass) { ServiceDescriptor serviceDescriptor = repository.registerService(interfaceClass); ProviderModel providerModel = new ProviderModel( diff --git a/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/rest/TestGetInvokerService.java b/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/rest/TestGetInvokerService.java new file mode 100644 index 0000000000..39b42e740b --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/rest/TestGetInvokerService.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.dubbo.rpc.protocol.rest.rest; + + +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +@Path("/test") +public interface TestGetInvokerService { + + + @GET + @Path("/getInvoker") + String getInvoker(); +} diff --git a/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/rest/TestGetInvokerServiceImpl.java b/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/rest/TestGetInvokerServiceImpl.java new file mode 100644 index 0000000000..b61f4afdfa --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/rest/TestGetInvokerServiceImpl.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.dubbo.rpc.protocol.rest.rest; + + +import org.apache.dubbo.rpc.Invoker; +import org.apache.dubbo.rpc.RpcContext; +import org.apache.dubbo.rpc.protocol.rest.RestRPCInvocationUtil; +import org.apache.dubbo.rpc.protocol.rest.request.RequestFacade; +import org.junit.jupiter.api.Assertions; + +import java.lang.reflect.Method; + +public class TestGetInvokerServiceImpl implements TestGetInvokerService { + + + @Override + public String getInvoker() { + Object request = RpcContext.getServiceContext().getRequest(); + Invoker invokerByRequest = RestRPCInvocationUtil.getInvokerByRequest((RequestFacade) request); + + + Method hello = null; + Method hashcode = null; + try { + hello = TestGetInvokerServiceImpl.class.getDeclaredMethod("getInvoker"); + hashcode = TestGetInvokerServiceImpl.class.getDeclaredMethod("hashcode"); + + } catch (NoSuchMethodException e) { + + } + + Invoker invokerByServiceInvokeMethod = RestRPCInvocationUtil.getInvokerByServiceInvokeMethod(hello); + + Invoker invoker = RestRPCInvocationUtil.getInvokerByServiceInvokeMethod(hashcode); + + + Assertions.assertEquals(invokerByRequest, invokerByServiceInvokeMethod); + Assertions.assertNull(invoker); + + return "success"; + } +} From 0f336d87364abe6b685785a8a4ebc23a28fcb08c Mon Sep 17 00:00:00 2001 From: Ken Liu Date: Mon, 12 Jun 2023 19:03:09 +0800 Subject: [PATCH 09/19] fix dependency check (#12505) --- .artifacts | 1 + dubbo-distribution/dubbo-bom/pom.xml | 5 +++++ dubbo-test/dubbo-dependencies-all/pom.xml | 15 +++++++++++++++ .../org/apache/dubbo/dependency/FileTest.java | 2 +- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.artifacts b/.artifacts index a4fd1eb340..539c51deed 100644 --- a/.artifacts +++ b/.artifacts @@ -109,6 +109,7 @@ dubbo-spring-boot-tracing-otel-zipkin-starter dubbo-spring-boot-tracing-otel-otlp-starter dubbo-spring-boot-observability-starter dubbo-spring-boot-starter +dubbo-spring-boot-starters dubbo-nacos-spring-boot-starter dubbo-zookeeper-spring-boot-starter dubbo-zookeeper-curator5-spring-boot-starter diff --git a/dubbo-distribution/dubbo-bom/pom.xml b/dubbo-distribution/dubbo-bom/pom.xml index 50978767f3..2d163f10e8 100644 --- a/dubbo-distribution/dubbo-bom/pom.xml +++ b/dubbo-distribution/dubbo-bom/pom.xml @@ -502,6 +502,11 @@ pom ${project.version} + + org.apache.dubbo + dubbo-spring-boot-starters + ${project.version} + org.apache.dubbo dubbo-spring-boot-observability-starters diff --git a/dubbo-test/dubbo-dependencies-all/pom.xml b/dubbo-test/dubbo-dependencies-all/pom.xml index 3a8f9177e1..526743f360 100644 --- a/dubbo-test/dubbo-dependencies-all/pom.xml +++ b/dubbo-test/dubbo-dependencies-all/pom.xml @@ -419,6 +419,21 @@ dubbo-spring-boot-observability-starter ${project.version} + + org.apache.dubbo + dubbo-nacos-spring-boot-starter + ${project.version} + + + org.apache.dubbo + dubbo-zookeeper-spring-boot-starter + ${project.version} + + + org.apache.dubbo + dubbo-zookeeper-curator5-spring-boot-starter + ${project.version} + diff --git a/dubbo-test/dubbo-test-modules/src/test/java/org/apache/dubbo/dependency/FileTest.java b/dubbo-test/dubbo-test-modules/src/test/java/org/apache/dubbo/dependency/FileTest.java index c8038141a9..a9182429f5 100644 --- a/dubbo-test/dubbo-test-modules/src/test/java/org/apache/dubbo/dependency/FileTest.java +++ b/dubbo-test/dubbo-test-modules/src/test/java/org/apache/dubbo/dependency/FileTest.java @@ -61,7 +61,7 @@ class FileTest { ignoredModulesInDubboAll.add(Pattern.compile("dubbo-distribution")); ignoredModulesInDubboAll.add(Pattern.compile("dubbo-metadata-processor")); ignoredModulesInDubboAll.add(Pattern.compile("dubbo-native.*")); - ignoredModulesInDubboAll.add(Pattern.compile("dubbo-spring-boot.*")); + ignoredModulesInDubboAll.add(Pattern.compile(".*spring-boot.*")); ignoredModulesInDubboAll.add(Pattern.compile("dubbo-maven-plugin")); } From 784edd7a85e95ef1512232a13182df6b251329d2 Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Mon, 12 Jun 2023 19:28:03 +0800 Subject: [PATCH 10/19] Support Reference check timeout (#12506) --- .../java/org/apache/dubbo/config/ModuleConfig.java | 13 +++++++++++++ .../dubbo/config/deploy/DefaultModuleDeployer.java | 5 ++++- .../src/main/resources/META-INF/dubbo.xsd | 5 +++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/ModuleConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/ModuleConfig.java index 539fe9137d..511c6bbfb7 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/config/ModuleConfig.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ModuleConfig.java @@ -92,6 +92,11 @@ public class ModuleConfig extends AbstractConfig { */ private Integer exportThreadNum; + /** + * The timeout to check references + */ + private Long checkReferenceTimeout; + public ModuleConfig() { super(); } @@ -251,4 +256,12 @@ public class ModuleConfig extends AbstractConfig { public void setExportAsync(Boolean exportAsync) { this.exportAsync = exportAsync; } + + public Long getCheckReferenceTimeout() { + return checkReferenceTimeout; + } + + public void setCheckReferenceTimeout(Long checkReferenceTimeout) { + this.checkReferenceTimeout = checkReferenceTimeout; + } } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java index 7c4eaf6baa..6bde316558 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java @@ -46,6 +46,7 @@ import org.apache.dubbo.rpc.model.ProviderModel; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -395,8 +396,10 @@ public class DefaultModuleDeployer extends AbstractDeployer impleme } private void checkReferences() { + Optional module = configManager.getModule(); + long timeout = module.map(ModuleConfig::getCheckReferenceTimeout).orElse(30000L); for (ReferenceConfigBase rc : configManager.getReferences()) { - referenceCache.check(rc, 3000); + referenceCache.check(rc, timeout); } } diff --git a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd index 73e059465a..a2bcbee0bd 100644 --- a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd +++ b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd @@ -624,6 +624,11 @@ + + + + + From 15ec892cb896e886390000ac476c8c430f63adaa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 19:45:55 +0800 Subject: [PATCH 11/19] Bump bytebuddy.version from 1.14.4 to 1.14.5 (#12502) Bumps `bytebuddy.version` from 1.14.4 to 1.14.5. Updates `byte-buddy` from 1.14.4 to 1.14.5 - [Release notes](https://github.com/raphw/byte-buddy/releases) - [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md) - [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.14.4...byte-buddy-1.14.5) Updates `byte-buddy-agent` from 1.14.4 to 1.14.5 - [Release notes](https://github.com/raphw/byte-buddy/releases) - [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md) - [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.14.4...byte-buddy-1.14.5) --- updated-dependencies: - dependency-name: net.bytebuddy:byte-buddy dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: net.bytebuddy:byte-buddy-agent dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dubbo-spring-boot/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dubbo-spring-boot/pom.xml b/dubbo-spring-boot/pom.xml index 65eadbd7fc..17d648e32f 100644 --- a/dubbo-spring-boot/pom.xml +++ b/dubbo-spring-boot/pom.xml @@ -45,7 +45,7 @@ 2.20.0 - 1.14.4 + 1.14.5 From 4c67c26c8eb758b266caee5b5b00a7e9a37d8c7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 19:46:02 +0800 Subject: [PATCH 12/19] Bump license-maven-plugin from 2.0.1 to 2.1.0 (#12501) Bumps [license-maven-plugin](https://github.com/mojohaus/license-maven-plugin) from 2.0.1 to 2.1.0. - [Release notes](https://github.com/mojohaus/license-maven-plugin/releases) - [Commits](https://github.com/mojohaus/license-maven-plugin/compare/2.0.1...2.1.0) --- updated-dependencies: - dependency-name: org.codehaus.mojo:license-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 113f3e32e5..8c788de547 100644 --- a/pom.xml +++ b/pom.xml @@ -503,7 +503,7 @@ org.codehaus.mojo license-maven-plugin - 2.0.1 + 2.1.0 license-check From a01ac38cbf24bbeef62fe3289fe1e40b4ac0e92f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 19:46:12 +0800 Subject: [PATCH 13/19] Bump fabric8_kubernetes_version from 6.6.2 to 6.7.1 (#12500) Bumps `fabric8_kubernetes_version` from 6.6.2 to 6.7.1. Updates `kubernetes-client` from 6.6.2 to 6.7.1 - [Release notes](https://github.com/fabric8io/kubernetes-client/releases) - [Changelog](https://github.com/fabric8io/kubernetes-client/blob/master/CHANGELOG.md) - [Commits](https://github.com/fabric8io/kubernetes-client/compare/v6.6.2...v6.7.1) Updates `kubernetes-server-mock` from 6.6.2 to 6.7.1 --- updated-dependencies: - dependency-name: io.fabric8:kubernetes-client dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: io.fabric8:kubernetes-server-mock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dubbo-dependencies-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml index 446cbae787..fe221c4865 100644 --- a/dubbo-dependencies-bom/pom.xml +++ b/dubbo-dependencies-bom/pom.xml @@ -167,7 +167,7 @@ 1.10.18 - 6.6.2 + 6.7.1 1.0.11 From fc6fbd60f9e5767fa98b347287145e6b69d8522d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 19:46:22 +0800 Subject: [PATCH 14/19] Bump opentelemetry-bom from 1.26.0 to 1.27.0 (#12499) Bumps [opentelemetry-bom](https://github.com/open-telemetry/opentelemetry-java) from 1.26.0 to 1.27.0. - [Release notes](https://github.com/open-telemetry/opentelemetry-java/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-java/compare/v1.26.0...v1.27.0) --- updated-dependencies: - dependency-name: io.opentelemetry:opentelemetry-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../dubbo-spring-boot-starters/observability/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/pom.xml index adb9dda980..17343de508 100644 --- a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/pom.xml +++ b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/pom.xml @@ -40,7 +40,7 @@ 1.11.0 1.1.1 - 1.26.0 + 1.27.0 2.16.4 0.16.0 From e92f85d980a80126f547cc3ea549c126034dde73 Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Mon, 12 Jun 2023 20:27:55 +0800 Subject: [PATCH 15/19] Support client gracefully shutdown (#12504) * Support client gracefully shutdown * fix check * Fix init --- .../org/apache/dubbo/remoting/Constants.java | 2 ++ .../exchange/support/DefaultFuture.java | 33 ++++++++++++++----- .../support/header/HeaderExchangeChannel.java | 10 +++++- .../support/header/HeaderExchangeHandler.java | 10 +++++- .../exchange/support/DefaultFutureTest.java | 2 +- 5 files changed, 46 insertions(+), 11 deletions(-) diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/Constants.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/Constants.java index bd2ad05220..a5f7fcebef 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/Constants.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/Constants.java @@ -134,6 +134,8 @@ public interface Constants { int DEFAULT_RECONNECT_PERIOD = 2000; + String CHANNEL_SHUTDOWN_TIMEOUT_KEY = "channel.shutdown.timeout"; + String SEND_RECONNECT_KEY = "send.reconnect"; String CHECK_KEY = "check"; diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/DefaultFuture.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/DefaultFuture.java index 3e38371d1e..3539723adb 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/DefaultFuture.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/DefaultFuture.java @@ -19,6 +19,7 @@ package org.apache.dubbo.remoting.exchange.support; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.resource.GlobalResourceInitializer; +import org.apache.dubbo.common.serialize.SerializationException; import org.apache.dubbo.common.timer.HashedWheelTimer; import org.apache.dubbo.common.timer.Timeout; import org.apache.dubbo.common.timer.Timer; @@ -26,7 +27,6 @@ import org.apache.dubbo.common.timer.TimerTask; import org.apache.dubbo.common.utils.NamedThreadFactory; import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.RemotingException; -import org.apache.dubbo.common.serialize.SerializationException; import org.apache.dubbo.remoting.TimeoutException; import org.apache.dubbo.remoting.exchange.Request; import org.apache.dubbo.remoting.exchange.Response; @@ -150,22 +150,39 @@ public class DefaultFuture extends CompletableFuture { * * @param channel channel to close */ - public static void closeChannel(Channel channel) { + public static void closeChannel(Channel channel, long timeout) { + long deadline = timeout > 0 ? System.currentTimeMillis() + timeout : 0; for (Map.Entry entry : CHANNELS.entrySet()) { if (channel.equals(entry.getValue())) { DefaultFuture future = getFuture(entry.getKey()); if (future != null && !future.isDone()) { - Response disconnectResponse = new Response(future.getId()); - disconnectResponse.setStatus(Response.CHANNEL_INACTIVE); - disconnectResponse.setErrorMessage("Channel " + - channel + " is inactive. Directly return the unFinished request : " + - (logger.isDebugEnabled() ? future.getRequest() : future.getRequest().copyWithoutData())); - DefaultFuture.received(channel, disconnectResponse); + long restTime = deadline - System.currentTimeMillis(); + if (restTime > 0) { + try { + future.get(restTime, TimeUnit.MILLISECONDS); + } catch (java.util.concurrent.TimeoutException ignore) { + logger.warn(PROTOCOL_TIMEOUT_SERVER, "", "", + "Trying to close channel " + channel + ", but response is not received in " + + timeout + "ms, and the request id is " + future.id); + } catch (Throwable ignore) {} + } + if (!future.isDone()) { + respInactive(channel, future); + } } } } } + private static void respInactive(Channel channel, DefaultFuture future) { + Response disconnectResponse = new Response(future.getId()); + disconnectResponse.setStatus(Response.CHANNEL_INACTIVE); + disconnectResponse.setErrorMessage("Channel " + + channel + " is inactive. Directly return the unFinished request : " + + (logger.isDebugEnabled() ? future.getRequest() : future.getRequest().copyWithoutData())); + DefaultFuture.received(channel, disconnectResponse); + } + public static void received(Channel channel, Response response) { received(channel, response, false); } diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java index 6c4e7fd09c..5bb08fa8e2 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java @@ -18,6 +18,7 @@ package org.apache.dubbo.remoting.exchange.support.header; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.Version; +import org.apache.dubbo.common.config.ConfigurationUtils; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.remoting.Channel; @@ -30,6 +31,7 @@ import org.apache.dubbo.remoting.exchange.Response; import org.apache.dubbo.remoting.exchange.support.DefaultFuture; import java.net.InetSocketAddress; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -48,6 +50,8 @@ final class HeaderExchangeChannel implements ExchangeChannel { private final Channel channel; + private final long shutdownTimeout; + private volatile boolean closed = false; HeaderExchangeChannel(Channel channel) { @@ -55,6 +59,10 @@ final class HeaderExchangeChannel implements ExchangeChannel { throw new IllegalArgumentException("channel == null"); } this.channel = channel; + this.shutdownTimeout = Optional.ofNullable(channel.getUrl()) + .map(URL::getOrDefaultApplicationModel) + .map(ConfigurationUtils::getServerShutdownTimeout) + .orElse(DEFAULT_TIMEOUT); } static HeaderExchangeChannel getOrAddChannel(Channel ch) { @@ -159,7 +167,7 @@ final class HeaderExchangeChannel implements ExchangeChannel { closed = true; try { // graceful close - DefaultFuture.closeChannel(channel); + DefaultFuture.closeChannel(channel, shutdownTimeout); } catch (Exception e) { logger.warn(TRANSPORT_FAILED_CLOSE, "", "", e.getMessage(), e); } diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeHandler.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeHandler.java index fd9d660d05..2fe6253140 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeHandler.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeHandler.java @@ -17,6 +17,7 @@ package org.apache.dubbo.remoting.exchange.support.header; import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.config.ConfigurationUtils; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.NetUtils; @@ -132,6 +133,8 @@ public class HeaderExchangeHandler implements ChannelHandlerDelegate { public void connected(Channel channel) throws RemotingException { ExchangeChannel exchangeChannel = HeaderExchangeChannel.getOrAddChannel(channel); handler.connected(exchangeChannel); + channel.setAttribute(Constants.CHANNEL_SHUTDOWN_TIMEOUT_KEY, + ConfigurationUtils.getServerShutdownTimeout(channel.getUrl().getOrDefaultApplicationModel())); } @Override @@ -140,7 +143,12 @@ public class HeaderExchangeHandler implements ChannelHandlerDelegate { try { handler.disconnected(exchangeChannel); } finally { - DefaultFuture.closeChannel(channel); + int shutdownTimeout = 0; + Object timeoutObj = channel.getAttribute(Constants.CHANNEL_SHUTDOWN_TIMEOUT_KEY); + if (timeoutObj instanceof Integer) { + shutdownTimeout = (Integer) timeoutObj; + } + DefaultFuture.closeChannel(channel, shutdownTimeout); HeaderExchangeChannel.removeChannel(channel); } } diff --git a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/DefaultFutureTest.java b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/DefaultFutureTest.java index 9aec7713e7..1e28237370 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/DefaultFutureTest.java +++ b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/DefaultFutureTest.java @@ -167,7 +167,7 @@ class DefaultFutureTest { ExecutorService executor = ExtensionLoader.getExtensionLoader(ExecutorRepository.class) .getDefaultExtension().createExecutorIfAbsent(URL.valueOf("dubbo://127.0.0.1:23456")); DefaultFuture.newFuture(channel, request, 1000, executor); - DefaultFuture.closeChannel(channel); + DefaultFuture.closeChannel(channel, 0); Assertions.assertFalse(executor.isTerminated()); } From 3fa518505fc54be59e4306300891e54db4610240 Mon Sep 17 00:00:00 2001 From: Ken Liu Date: Mon, 12 Jun 2023 20:30:42 +0800 Subject: [PATCH 16/19] Add log for remote configuration. (#12294) * add log for remote configuration. * Give dynamic routing rule notification 'info' log level. * remove unused imports * revert warn log change * fix import --------- Co-authored-by: Albumen Kevin --- .../router/condition/config/ListenableStateRouter.java | 4 ++-- .../apache/dubbo/rpc/cluster/router/tag/TagStateRouter.java | 4 ++-- .../dubbo/config/deploy/DefaultApplicationDeployer.java | 6 ++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableStateRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableStateRouter.java index 40758c4f3e..0efbe0be39 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableStateRouter.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableStateRouter.java @@ -64,8 +64,8 @@ public abstract class ListenableStateRouter extends AbstractStateRouter im @Override public synchronized void process(ConfigChangedEvent event) { - if (logger.isDebugEnabled()) { - logger.debug("Notification of condition rule, change type is: " + event.getChangeType() + + if (logger.isInfoEnabled()) { + logger.info("Notification of condition rule, change type is: " + event.getChangeType() + ", raw rule is:\n " + event.getContent()); } diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagStateRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagStateRouter.java index 5b8f9519ea..c3470776b2 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagStateRouter.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagStateRouter.java @@ -63,8 +63,8 @@ public class TagStateRouter extends AbstractStateRouter implements Configu @Override public synchronized void process(ConfigChangedEvent event) { - if (logger.isDebugEnabled()) { - logger.debug("Notification of tag rule, change type is: " + event.getChangeType() + ", raw rule is:\n " + + if (logger.isInfoEnabled()) { + logger.info("Notification of tag rule, change type is: " + event.getChangeType() + ", raw rule is:\n " + event.getContent()); } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java index ca597f2ee9..bf8d285681 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java @@ -837,12 +837,18 @@ public class DefaultApplicationDeployer extends AbstractDeployer configMap = parseProperties(configContent); From bde608ec3cf0cad32e2704e89e008a83bc27c46c Mon Sep 17 00:00:00 2001 From: wxbty <38374721+wxbty@users.noreply.github.com> Date: Mon, 12 Jun 2023 20:47:02 +0800 Subject: [PATCH 17/19] fail fast when protocol exp (#12361) * fail fast when protocol exp * use hasExtension * Adjust the spi detection position * remove unuse * remove unuse --- .../registry/integration/RegistryDirectory.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java index 9cbedfbc47..6405c75eab 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java @@ -119,6 +119,18 @@ public class RegistryDirectory extends DynamicDirectory { @Override public void subscribe(URL url) { + + // Fail-fast detection protocol spi + String queryProtocols = this.queryMap.get(PROTOCOL_KEY); + if (StringUtils.isNotBlank(queryProtocols)) { + String[] acceptProtocols = queryProtocols.split(","); + for (String acceptProtocol : acceptProtocols) { + if (!moduleModel.getApplicationModel().getExtensionLoader(Protocol.class).hasExtension(acceptProtocol)) { + throw new IllegalStateException("No such extension org.apache.dubbo.rpc.Protocol by name " + acceptProtocol + ", please check whether related SPI module is missing"); + } + } + } + ApplicationModel applicationModel = url.getApplicationModel(); MetricsEventBus.post(RegistryEvent.toSubscribeEvent(applicationModel),() -> { From dd94c1561ade672cc253eef79828f6d2daf5a676 Mon Sep 17 00:00:00 2001 From: Ken Liu Date: Mon, 12 Jun 2023 20:48:03 +0800 Subject: [PATCH 18/19] fix router match condition (#12491) * fix router match condition * fix ut compilation * add null check --- .../configurator/AbstractConfigurator.java | 2 +- .../parser/model/ConditionMatch.java | 18 +++++++++++-- .../configurator/parser/model/ParamMatch.java | 4 +-- .../cluster/router/tag/model/ParamMatch.java | 2 +- .../configurator/parser/ConfigParserTest.java | 18 ++++++------- .../metadata/AbstractServiceNameMapping.java | 26 ++++++++++--------- .../client/ServiceDiscoveryRegistry.java | 4 ++- 7 files changed, 46 insertions(+), 28 deletions(-) diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java index 55ebed253c..1a6b1381b9 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java @@ -128,7 +128,7 @@ public abstract class AbstractConfigurator implements Configurator { if (apiVersion != null && apiVersion.startsWith(RULE_VERSION_V30)) { ConditionMatch matcher = (ConditionMatch) configuratorUrl.getAttribute(MATCH_CONDITION); if (matcher != null) { - if (matcher.isMatch(url)) { + if (matcher.isMatch(host, url)) { return doConfigure(url, configuratorUrl.removeParameters(conditionKeys)); } else { logger.debug("Cannot apply configurator rule, param mismatch, current params are " + url + ", params in rule is " + matcher); diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConditionMatch.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConditionMatch.java index b16c2c978a..4a828d4484 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConditionMatch.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConditionMatch.java @@ -26,6 +26,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY; public class ConditionMatch { private AddressMatch address; + private AddressMatch providerAddress; private ListStringMatch service; private ListStringMatch app; private List param; @@ -38,6 +39,14 @@ public class ConditionMatch { this.address = address; } + public AddressMatch getProviderAddress() { + return providerAddress; + } + + public void setProviderAddress(AddressMatch providerAddress) { + this.providerAddress = providerAddress; + } + public ListStringMatch getService() { return service; } @@ -62,8 +71,12 @@ public class ConditionMatch { this.param = param; } - public boolean isMatch(URL url) { - if (getAddress() != null && !getAddress().isMatch(url.getAddress())) { + public boolean isMatch(String host, URL url) { + if (getAddress() != null && !getAddress().isMatch(host)) { + return false; + } + + if (getProviderAddress() != null && !getProviderAddress().isMatch(url.getAddress())) { return false; } @@ -90,6 +103,7 @@ public class ConditionMatch { public String toString() { return "ConditionMatch{" + "address='" + address + '\'' + + "providerAddress='" + providerAddress + '\'' + ", service='" + service + '\'' + ", app='" + app + '\'' + ", param='" + param + '\'' + diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ParamMatch.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ParamMatch.java index 0f1501cb69..42303e6a49 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ParamMatch.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ParamMatch.java @@ -40,12 +40,12 @@ public class ParamMatch { } public boolean isMatch(URL url) { - if (key == null) { + if (key == null || value == null) { return false; } String input = url.getParameter(key); - return input != null && value.isMatch(input); + return value.isMatch(input); } @Override diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/ParamMatch.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/ParamMatch.java index bef3366e83..bab1284436 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/ParamMatch.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/ParamMatch.java @@ -39,7 +39,7 @@ public class ParamMatch { } public boolean isMatch(String input) { - if (getValue() != null && input != null) { + if (getValue() != null) { return getValue().isMatch(input); } return false; diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java index dd30a0a037..f5596d56b4 100644 --- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java +++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java @@ -187,11 +187,11 @@ class ConfigParserTest { URL notMatchURL3 = URL.valueOf("dubbo://10.0.0.1:20880/DemoService?match_key1=value_not_match");// key not match ConditionMatch matcher = (ConditionMatch) url.getAttribute(MATCH_CONDITION); - Assertions.assertTrue(matcher.isMatch(matchURL1)); - Assertions.assertTrue(matcher.isMatch(matchURL2)); - Assertions.assertFalse(matcher.isMatch(notMatchURL1)); - Assertions.assertFalse(matcher.isMatch(notMatchURL2)); - Assertions.assertFalse(matcher.isMatch(notMatchURL3)); + Assertions.assertTrue(matcher.isMatch(matchURL1.getAddress(), matchURL1)); + Assertions.assertTrue(matcher.isMatch(matchURL2.getAddress(), matchURL2)); + Assertions.assertFalse(matcher.isMatch(notMatchURL1.getAddress(), notMatchURL1)); + Assertions.assertFalse(matcher.isMatch(notMatchURL2.getAddress(), notMatchURL2)); + Assertions.assertFalse(matcher.isMatch(notMatchURL3.getAddress(), notMatchURL3)); } } @@ -211,8 +211,8 @@ class ConfigParserTest { URL notMatchURL = URL.valueOf("dubbo://10.0.0.1:20880/DemoService?match_key1=value_not_match");// key not match ConditionMatch matcher = (ConditionMatch) url.getAttribute(MATCH_CONDITION); - Assertions.assertTrue(matcher.isMatch(matchURL)); - Assertions.assertFalse(matcher.isMatch(notMatchURL)); + Assertions.assertTrue(matcher.isMatch(matchURL.getAddress(), matchURL)); + Assertions.assertFalse(matcher.isMatch(notMatchURL.getAddress(), notMatchURL)); } } @@ -232,8 +232,8 @@ class ConfigParserTest { URL notMatchURL = URL.valueOf("dubbo://10.0.0.1:20880/DemoService?match_key1=value_not_match");// key not match ConditionMatch matcher = (ConditionMatch) url.getAttribute(MATCH_CONDITION); - Assertions.assertTrue(matcher.isMatch(matchURL)); - Assertions.assertFalse(matcher.isMatch(notMatchURL)); + Assertions.assertTrue(matcher.isMatch(matchURL.getAddress(), matchURL)); + Assertions.assertFalse(matcher.isMatch(notMatchURL.getAddress(), notMatchURL)); } } diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java index 675067276d..6ed85622ee 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java @@ -124,18 +124,20 @@ public abstract class AbstractServiceNameMapping implements ServiceNameMapping { @Override public MappingListener stopListen(URL subscribeURL, MappingListener listener) { synchronized (mappingListeners) { - String mappingKey = ServiceNameMapping.buildMappingKey(subscribeURL); - Set listeners = mappingListeners.get(mappingKey); - //todo, remove listener from remote metadata center - if (CollectionUtils.isNotEmpty(listeners)) { - listeners.remove(listener); - listener.stop(); - removeListener(subscribeURL, listener); - } - if (CollectionUtils.isEmpty(listeners)) { - mappingListeners.remove(mappingKey); - removeCachedMapping(mappingKey); - removeMappingLock(mappingKey); + if (listener != null) { + String mappingKey = ServiceNameMapping.buildMappingKey(subscribeURL); + Set listeners = mappingListeners.get(mappingKey); + //todo, remove listener from remote metadata center + if (CollectionUtils.isNotEmpty(listeners)) { + listeners.remove(listener); + listener.stop(); + removeListener(subscribeURL, listener); + } + if (CollectionUtils.isEmpty(listeners)) { + mappingListeners.remove(mappingKey); + removeCachedMapping(mappingKey); + removeMappingLock(mappingKey); + } } return listener; } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java index 003892c6ca..d808a05b97 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java @@ -248,7 +248,9 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { serviceDiscovery.unsubscribe(url, listener); String protocolServiceKey = url.getProtocolServiceKey(); Set serviceNames = serviceNameMapping.getMapping(url); - serviceNameMapping.stopListen(url, mappingListeners.remove(protocolServiceKey)); + if (mappingListeners.get(protocolServiceKey) != null) { + serviceNameMapping.stopListen(url, mappingListeners.remove(protocolServiceKey)); + } if (CollectionUtils.isNotEmpty(serviceNames)) { String serviceNamesKey = toStringKeys(serviceNames); Lock appSubscriptionLock = getAppSubscription(serviceNamesKey); From 2cb12ff9a6444b69f6b7f1b3cac7532be93e6083 Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Mon, 12 Jun 2023 20:51:13 +0800 Subject: [PATCH 19/19] Fix AbstractProxyProtocol compatibility (#12507) --- .../dubbo/rpc/protocol/AbstractProtocol.java | 3 +- .../rpc/protocol/AbstractProxyProtocol.java | 87 ++++++++++++------- .../dubbo/rpc/protocol/rest/RestProtocol.java | 15 ++-- 3 files changed, 65 insertions(+), 40 deletions(-) diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java index fd49e60298..25a3068693 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java @@ -42,7 +42,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY; import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE; @@ -63,7 +62,7 @@ public abstract class AbstractProtocol implements Protocol, ScopeModelAware { /** * */ - protected final ConcurrentMap serverMap = new ConcurrentHashMap<>(); + protected final Map serverMap = new ConcurrentHashMap<>(); // TODO SoftReference protected final Set> invokers = new ConcurrentHashSet<>(); diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java index db55424ed6..e1727c38ca 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java @@ -19,9 +19,11 @@ package org.apache.dubbo.rpc.protocol; import org.apache.dubbo.common.Parameters; import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.utils.NetUtils; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.ChannelHandler; +import org.apache.dubbo.remoting.Constants; import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.RemotingServer; import org.apache.dubbo.rpc.Exporter; @@ -30,7 +32,6 @@ import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.ProtocolServer; import org.apache.dubbo.rpc.ProxyFactory; import org.apache.dubbo.rpc.Result; -import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcException; import java.net.InetSocketAddress; @@ -41,6 +42,8 @@ import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; +import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE; import static org.apache.dubbo.common.constants.LoggerCodeConstants.PROTOCOL_UNSUPPORTED; /** @@ -48,7 +51,7 @@ import static org.apache.dubbo.common.constants.LoggerCodeConstants.PROTOCOL_UNS */ public abstract class AbstractProxyProtocol extends AbstractProtocol { - protected final List> rpcExceptions = new CopyOnWriteArrayList>(); + private final List> rpcExceptions = new CopyOnWriteArrayList>(); protected ProxyFactory proxyFactory; @@ -84,35 +87,7 @@ public abstract class AbstractProxyProtocol extends AbstractProtocol { return exporter; } } - final Runnable runnable = doExport(proxyFactory.getProxy( - new Invoker() { - @Override - public Class getInterface() { - return invoker.getInterface(); - } - - @Override - public Result invoke(Invocation invocation) throws RpcException { - RpcContext.getServiceContext().getObjectAttachments().forEach(invocation::setObjectAttachment); - return invoker.invoke(invocation); - } - - @Override - public URL getUrl() { - return invoker.getUrl(); - } - - @Override - public boolean isAvailable() { - return invoker.isAvailable(); - } - - @Override - public void destroy() { - invoker.destroy(); - } - }, true), invoker.getInterface(), - invoker.getUrl()); + final Runnable runnable = doExport(proxyFactory.getProxy(invoker, true), invoker.getInterface(), invoker.getUrl()); exporter = new AbstractExporter(invoker) { @Override public void afterUnExport() { @@ -130,6 +105,46 @@ public abstract class AbstractProxyProtocol extends AbstractProtocol { return exporter; } + @Override + protected Invoker protocolBindingRefer(final Class type, final URL url) throws RpcException { + final Invoker target = proxyFactory.getInvoker(doRefer(type, url), type, url); + Invoker invoker = new AbstractInvoker(type, url) { + @Override + protected Result doInvoke(Invocation invocation) throws Throwable { + try { + Result result = target.invoke(invocation); + // FIXME result is an AsyncRpcResult instance. + Throwable e = result.getException(); + if (e != null) { + for (Class rpcException : rpcExceptions) { + if (rpcException.isAssignableFrom(e.getClass())) { + throw getRpcException(type, url, invocation, e); + } + } + } + return result; + } catch (RpcException e) { + if (e.getCode() == RpcException.UNKNOWN_EXCEPTION) { + e.setCode(getErrorCode(e.getCause())); + } + throw e; + } catch (Throwable e) { + throw getRpcException(type, url, invocation, e); + } + } + + @Override + public void destroy() { + super.destroy(); + target.destroy(); + invokers.remove(this); + AbstractProxyProtocol.this.destroyInternal(url); + } + }; + invokers.add(invoker); + return invoker; + } + // used to destroy unused clients and other resource protected void destroyInternal(URL url) { // subclass override @@ -142,12 +157,22 @@ public abstract class AbstractProxyProtocol extends AbstractProtocol { return re; } + protected String getAddr(URL url) { + String bindIp = url.getParameter(Constants.BIND_IP_KEY, url.getHost()); + if (url.getParameter(ANYHOST_KEY, false)) { + bindIp = ANYHOST_VALUE; + } + return NetUtils.getIpByHost(bindIp) + ":" + url.getParameter(Constants.BIND_PORT_KEY, url.getPort()); + } + protected int getErrorCode(Throwable e) { return RpcException.UNKNOWN_EXCEPTION; } protected abstract Runnable doExport(T impl, Class type, URL url) throws RpcException; + protected abstract T doRefer(Class type, URL url) throws RpcException; + protected class ProxyProtocolServer implements ProtocolServer { private RemotingServer server; diff --git a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java index ad273efda3..f42a2e7266 100644 --- a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java +++ b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java @@ -31,7 +31,6 @@ import org.apache.dubbo.rpc.protocol.AbstractProtocol; import org.apache.dubbo.rpc.protocol.rest.annotation.consumer.HttpConnectionPreBuildIntercept; import org.apache.dubbo.rpc.protocol.rest.annotation.metadata.MetadataResolver; - import java.util.Map; import java.util.Objects; import java.util.Set; @@ -91,12 +90,14 @@ public class RestProtocol extends AbstractProtocol { // TODO add Extension filter // create rest server - RestProtocolServer server = (RestProtocolServer) ConcurrentHashMapUtils.computeIfAbsent(serverMap, getAddr(url), restServer -> { - RestProtocolServer s = serverFactory.createServer(url.getParameter(SERVER_KEY, DEFAULT_SERVER)); - s.setAddress(url.getAddress()); - s.start(url); - return s; - }); + RestProtocolServer server = (RestProtocolServer) ConcurrentHashMapUtils.computeIfAbsent( + (ConcurrentMap) serverMap, + getAddr(url), restServer -> { + RestProtocolServer s = serverFactory.createServer(url.getParameter(SERVER_KEY, DEFAULT_SERVER)); + s.setAddress(url.getAddress()); + s.start(url); + return s; + }); server.deploy(serviceRestMetadata, invoker);