diff --git a/.artifacts b/.artifacts index e1853baca8..6467d70a70 100644 --- a/.artifacts +++ b/.artifacts @@ -109,5 +109,9 @@ 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 dubbo-spring-security dubbo-xds 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/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-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/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/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-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)); 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/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-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-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-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); + } } } 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(); 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); 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/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-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 @@ + + + + + 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-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 * diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml index 680fc1cdde..8f9bf8f84b 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 diff --git a/dubbo-distribution/dubbo-bom/pom.xml b/dubbo-distribution/dubbo-bom/pom.xml index b997f52fc0..379d40096a 100644 --- a/dubbo-distribution/dubbo-bom/pom.xml +++ b/dubbo-distribution/dubbo-bom/pom.xml @@ -501,6 +501,11 @@ pom ${project.version} + + org.apache.dubbo + dubbo-spring-boot-starters + ${project.version} + org.apache.dubbo dubbo-spring-boot-observability-starters @@ -531,6 +536,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-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-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-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); 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),() -> { 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)); } 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 dd04c121d8..3fd883d0aa 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 @@ -137,6 +137,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 be487e2de0..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 @@ -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) { @@ -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()); } 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 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/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/RestProtocol.java b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java index 8344a7ca17..8ef0acad5b 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 @@ -35,7 +35,6 @@ import org.apache.dubbo.rpc.protocol.rest.annotation.metadata.MetadataResolver; import org.apache.dubbo.rpc.protocol.rest.deploy.ServiceDeployer; import org.apache.dubbo.rpc.protocol.rest.deploy.ServiceDeployerManager; - import java.util.Map; import java.util.Objects; import java.util.Set; 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 15ce6cd72c..730f4b01c9 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; @@ -45,6 +46,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 */ @@ -78,6 +81,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"; + } +} 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 96% 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..17343de508 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 @@ -40,7 +40,7 @@ 1.11.0 1.1.1 - 1.26.0 + 1.27.0 2.16.4 0.16.0 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..17d648e32f 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 @@ -45,7 +45,7 @@ 2.20.0 - 1.14.4 + 1.14.5 diff --git a/dubbo-test/dubbo-dependencies-all/pom.xml b/dubbo-test/dubbo-dependencies-all/pom.xml index feec7f36d3..bc255a4221 100644 --- a/dubbo-test/dubbo-dependencies-all/pom.xml +++ b/dubbo-test/dubbo-dependencies-all/pom.xml @@ -417,6 +417,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 e69e3b98ea..0d2aabbfd3 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 @@ -64,7 +64,7 @@ class FileTest { ignoredModulesInDubboAll.add(Pattern.compile("dubbo-metadata-processor")); ignoredModulesInDubboAll.add(Pattern.compile("dubbo-native.*")); ignoredModulesInDubboAll.add(Pattern.compile("dubbo-config-spring6.*")); - ignoredModulesInDubboAll.add(Pattern.compile("dubbo-spring-boot.*")); + ignoredModulesInDubboAll.add(Pattern.compile(".*spring-boot.*")); ignoredModulesInDubboAll.add(Pattern.compile("dubbo-annotation-processor.*")); ignoredModulesInDubboAll.add(Pattern.compile("dubbo-maven-plugin")); } diff --git a/pom.xml b/pom.xml index 14aea95bc8..f8bee0e59f 100644 --- a/pom.xml +++ b/pom.xml @@ -515,7 +515,7 @@ org.codehaus.mojo license-maven-plugin - 2.0.1 + 2.1.0 license-check