diff --git a/.artifacts b/.artifacts
index e18fed5eb5..539c51deed 100644
--- a/.artifacts
+++ b/.artifacts
@@ -114,5 +114,4 @@ dubbo-nacos-spring-boot-starter
dubbo-zookeeper-spring-boot-starter
dubbo-zookeeper-curator5-spring-boot-starter
dubbo-spring-security
-dubbo-tracing
dubbo-xds
diff --git a/dubbo-cluster/pom.xml b/dubbo-cluster/pom.xml
index 08b83b8cca..130b7e3f7e 100644
--- a/dubbo-cluster/pom.xml
+++ b/dubbo-cluster/pom.xml
@@ -86,5 +86,10 @@
${project.parent.version}
true
+
+ io.micrometer
+ micrometer-tracing-integration-test
+ test
+
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
index a1ea668291..c4561dfe4f 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
@@ -476,15 +476,21 @@ public abstract class AbstractDirectory implements Directory {
}
private boolean addValidInvoker(Invoker invoker) {
+ boolean result;
synchronized (this.validInvokers) {
- return this.validInvokers.add(invoker);
+ result = this.validInvokers.add(invoker);
}
+ MetricsEventBus.publish(RegistryEvent.refreshDirectoryEvent(applicationModel, getSummary()));
+ return result;
}
private boolean removeValidInvoker(Invoker invoker) {
+ boolean result;
synchronized (this.validInvokers) {
- return this.validInvokers.remove(invoker);
+ result = this.validInvokers.remove(invoker);
}
+ MetricsEventBus.publish(RegistryEvent.refreshDirectoryEvent(applicationModel, getSummary()));
+ return result;
}
protected abstract List> doList(SingleRouterChain singleRouterChain,
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java
index 8a17dc0fc0..36e3d3eb59 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java
@@ -36,6 +36,7 @@ import static org.apache.dubbo.common.constants.LoggerCodeConstants.CLUSTER_FAIL
*/
public class StaticDirectory extends AbstractDirectory {
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(StaticDirectory.class);
+ private final Class interfaceClass;
public StaticDirectory(List> invokers) {
this(null, invokers, null);
@@ -55,11 +56,12 @@ public class StaticDirectory extends AbstractDirectory {
throw new IllegalArgumentException("invokers == null");
}
this.setInvokers(new BitList<>(invokers));
+ this.interfaceClass = invokers.get(0).getInterface();
}
@Override
public Class getInterface() {
- return getInvokers().get(0).getInterface();
+ return interfaceClass;
}
@Override
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationSenderFilter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/filter/support/ObservationSenderFilter.java
similarity index 78%
rename from dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationSenderFilter.java
rename to dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/filter/support/ObservationSenderFilter.java
index bce47b7b9a..233a5ed35b 100644
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationSenderFilter.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/filter/support/ObservationSenderFilter.java
@@ -14,9 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing.filter;
+package org.apache.dubbo.rpc.cluster.filter.support;
import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.metrics.observation.DefaultDubboClientObservationConvention;
+import org.apache.dubbo.metrics.observation.DubboClientContext;
+import org.apache.dubbo.metrics.observation.DubboClientObservationConvention;
+import org.apache.dubbo.metrics.observation.DubboObservationDocumentation;
import org.apache.dubbo.rpc.BaseFilter;
import org.apache.dubbo.rpc.Filter;
import org.apache.dubbo.rpc.Invocation;
@@ -26,10 +30,6 @@ import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.cluster.filter.ClusterFilter;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.ScopeModelAware;
-import org.apache.dubbo.tracing.DefaultDubboClientObservationConvention;
-import org.apache.dubbo.tracing.DubboClientObservationConvention;
-import org.apache.dubbo.tracing.DubboObservationDocumentation;
-import org.apache.dubbo.tracing.context.DubboClientContext;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
@@ -39,7 +39,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;
/**
* A {@link Filter} that creates an {@link Observation} around the outgoing message.
*/
-@Activate(group = CONSUMER, order = Integer.MIN_VALUE + 50, onClass = "io.micrometer.observation.NoopObservationRegistry")
+@Activate(group = CONSUMER, order = -1, onClass = "io.micrometer.observation.NoopObservationRegistry")
public class ObservationSenderFilter implements ClusterFilter, BaseFilter.Listener, ScopeModelAware {
private ObservationRegistry observationRegistry;
@@ -47,8 +47,12 @@ public class ObservationSenderFilter implements ClusterFilter, BaseFilter.Listen
private DubboClientObservationConvention clientObservationConvention;
public ObservationSenderFilter(ApplicationModel applicationModel) {
- observationRegistry = applicationModel.getBeanFactory().getBean(ObservationRegistry.class);
- clientObservationConvention = applicationModel.getBeanFactory().getBean(DubboClientObservationConvention.class);
+ applicationModel.getApplicationConfigManager().getTracing().ifPresent(cfg -> {
+ if (Boolean.TRUE.equals(cfg.getEnabled())) {
+ observationRegistry = applicationModel.getBeanFactory().getBean(ObservationRegistry.class);
+ clientObservationConvention = applicationModel.getBeanFactory().getBean(DubboClientObservationConvention.class);
+ }
+ });
}
@Override
@@ -71,9 +75,6 @@ public class ObservationSenderFilter implements ClusterFilter, BaseFilter.Listen
if (observation == null) {
return;
}
- if (appResponse != null && appResponse.hasException()) {
- observation.error(appResponse.getException());
- }
observation.stop();
}
diff --git a/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter b/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
index 28a9e73853..cd0a2f44e8 100644
--- a/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
+++ b/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
@@ -1,4 +1,5 @@
consumercontext=org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter
consumer-classloader=org.apache.dubbo.rpc.cluster.filter.support.ConsumerClassLoaderFilter
router-snapshot=org.apache.dubbo.rpc.cluster.router.RouterSnapshotFilter
+observationsender=org.apache.dubbo.rpc.cluster.filter.support.ObservationSenderFilter
metricsClusterFilter=org.apache.dubbo.rpc.cluster.filter.support.MetricsClusterFilter
\ No newline at end of file
diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/AbstractObservationFilterTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/AbstractObservationFilterTest.java
new file mode 100644
index 0000000000..567e9cab3b
--- /dev/null
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/AbstractObservationFilterTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.cluster.filter;
+
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.TracingConfig;
+import org.apache.dubbo.rpc.AppResponse;
+import org.apache.dubbo.rpc.BaseFilter;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.RpcInvocation;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+
+import io.micrometer.tracing.test.SampleTestRunner;
+import org.junit.jupiter.api.AfterEach;
+
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.mock;
+
+abstract class AbstractObservationFilterTest extends SampleTestRunner {
+
+ ApplicationModel applicationModel;
+ RpcInvocation invocation;
+
+ BaseFilter filter;
+
+ Invoker> invoker = mock(Invoker.class);
+
+ static final String INTERFACE_NAME = "org.apache.dubbo.MockInterface";
+ static final String METHOD_NAME = "mockMethod";
+ static final String GROUP = "mockGroup";
+ static final String VERSION = "1.0.0";
+
+ @AfterEach
+ public void teardown() {
+ if (applicationModel != null) {
+ applicationModel.destroy();
+ }
+ }
+
+ abstract BaseFilter createFilter(ApplicationModel applicationModel);
+
+ void setupConfig() {
+ ApplicationConfig config = new ApplicationConfig();
+ config.setName("MockObservations");
+
+ applicationModel = ApplicationModel.defaultModel();
+ applicationModel.getApplicationConfigManager().setApplication(config);
+
+ invocation = new RpcInvocation(new MockInvocation());
+ invocation.addInvokedInvoker(invoker);
+
+ applicationModel.getBeanFactory().registerBean(getObservationRegistry());
+ TracingConfig tracingConfig = new TracingConfig();
+ tracingConfig.setEnabled(true);
+ applicationModel.getApplicationConfigManager().setTracing(tracingConfig);
+
+ filter = createFilter(applicationModel);
+
+ given(invoker.invoke(invocation)).willReturn(new AppResponse("success"));
+
+ initParam();
+ }
+
+ private void initParam() {
+ invocation.setTargetServiceUniqueName(GROUP + "/" + INTERFACE_NAME + ":" + VERSION);
+ invocation.setMethodName(METHOD_NAME);
+ invocation.setParameterTypes(new Class[] {String.class});
+ }
+
+}
diff --git a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationSenderFilterTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/ObservationSenderFilterTest.java
similarity index 92%
rename from dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationSenderFilterTest.java
rename to dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/ObservationSenderFilterTest.java
index 071bc0e978..1315686740 100644
--- a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationSenderFilterTest.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/ObservationSenderFilterTest.java
@@ -15,22 +15,23 @@
* limitations under the License.
*/
-package org.apache.dubbo.tracing.filter;
+package org.apache.dubbo.rpc.cluster.filter;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.RpcContext;
-import org.apache.dubbo.rpc.cluster.filter.ClusterFilter;
+import org.apache.dubbo.rpc.cluster.filter.support.ObservationSenderFilter;
import org.apache.dubbo.rpc.model.ApplicationModel;
import io.micrometer.common.KeyValues;
import io.micrometer.core.tck.MeterRegistryAssert;
+import io.micrometer.tracing.test.SampleTestRunner;
import io.micrometer.tracing.test.simple.SpansAssert;
import org.assertj.core.api.BDDAssertions;
class ObservationSenderFilterTest extends AbstractObservationFilterTest {
@Override
- public SampleTestRunnerConsumer yourCode() {
+ public SampleTestRunner.SampleTestRunnerConsumer yourCode() {
return (buildingBlocks, meterRegistry) -> {
setupConfig();
setupAttachments();
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/EchoService.java b/dubbo-common/src/main/java/com/alibaba/dubbo/rpc/service/EchoService.java
similarity index 100%
rename from dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/EchoService.java
rename to dubbo-common/src/main/java/com/alibaba/dubbo/rpc/service/EchoService.java
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/GenericException.java b/dubbo-common/src/main/java/com/alibaba/dubbo/rpc/service/GenericException.java
similarity index 58%
rename from dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/GenericException.java
rename to dubbo-common/src/main/java/com/alibaba/dubbo/rpc/service/GenericException.java
index 1a94cebf4f..0d5ac6fed2 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/GenericException.java
+++ b/dubbo-common/src/main/java/com/alibaba/dubbo/rpc/service/GenericException.java
@@ -17,46 +17,28 @@
package com.alibaba.dubbo.rpc.service;
-import org.apache.dubbo.common.utils.StringUtils;
@Deprecated
-public class GenericException extends RuntimeException {
+public class GenericException extends org.apache.dubbo.rpc.service.GenericException {
private static final long serialVersionUID = -1182299763306599962L;
- private String exceptionClass;
-
- private String exceptionMessage;
-
public GenericException() {
}
- public GenericException(String exceptionClass, String exceptionMessage) {
+ public GenericException(String exceptionMessage) {
super(exceptionMessage);
- this.exceptionClass = exceptionClass;
- this.exceptionMessage = exceptionMessage;
+ }
+
+ public GenericException(String exceptionClass, String exceptionMessage) {
+ super(exceptionClass, exceptionMessage);
}
public GenericException(Throwable cause) {
- super(StringUtils.toString(cause));
- this.exceptionClass = cause.getClass().getName();
- this.exceptionMessage = cause.getMessage();
+ super(cause);
}
- public String getExceptionClass() {
- return exceptionClass;
+ public GenericException(String message, Throwable cause, String exceptionClass, String exceptionMessage) {
+ super(message, cause, exceptionClass, exceptionMessage);
}
-
- public void setExceptionClass(String exceptionClass) {
- this.exceptionClass = exceptionClass;
- }
-
- public String getExceptionMessage() {
- return exceptionMessage;
- }
-
- public void setExceptionMessage(String exceptionMessage) {
- this.exceptionMessage = exceptionMessage;
- }
-
}
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/GenericService.java b/dubbo-common/src/main/java/com/alibaba/dubbo/rpc/service/GenericService.java
similarity index 93%
rename from dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/GenericService.java
rename to dubbo-common/src/main/java/com/alibaba/dubbo/rpc/service/GenericService.java
index b63b60bd3e..cc3282a7a0 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/GenericService.java
+++ b/dubbo-common/src/main/java/com/alibaba/dubbo/rpc/service/GenericService.java
@@ -22,5 +22,5 @@ public interface GenericService extends org.apache.dubbo.rpc.service.GenericServ
@Override
Object $invoke(String method, String[] parameterTypes, Object[] args)
- throws com.alibaba.dubbo.rpc.service.GenericException;
+ throws GenericException;
}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/LoggerCodeConstants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/LoggerCodeConstants.java
index 83e7b62dfa..0a3bfa2125 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/LoggerCodeConstants.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/LoggerCodeConstants.java
@@ -92,8 +92,6 @@ public interface LoggerCodeConstants {
String VULNERABILITY_WARNING = "0-28";
- String COMMON_NOT_FOUND_TRACER_DEPENDENCY = "0-29";
-
// Registry module
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporter.java b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegisterTypeEnum.java
similarity index 54%
rename from dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporter.java
rename to dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegisterTypeEnum.java
index 9b8f12ee4b..2aaeb929fc 100644
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporter.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegisterTypeEnum.java
@@ -14,24 +14,31 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing.exporter;
+package org.apache.dubbo.common.constants;
-import brave.handler.SpanHandler;
-import io.opentelemetry.sdk.trace.export.SpanExporter;
-
-public interface TraceExporter {
+/**
+ * Indicate that a service need to be registered to registry or not
+ */
+public enum RegisterTypeEnum {
/**
- * for otel
- *
- * @return
+ * Never register. Cannot be registered by any command(like QoS-online).
*/
- SpanExporter getSpanExporter();
+ NEVER_REGISTER,
/**
- * for brave
- *
- * @return
+ * Manual register. Can be registered by command(like QoS-online), but not register by default.
*/
- SpanHandler getSpanHandler();
+ MANUAL_REGISTER,
+
+ /**
+ * (INTERNAL) Auto register by deployer. Will be registered after deployer started.
+ * (Delay publish when starting. Prevent service from being invoked before all services are started)
+ */
+ AUTO_REGISTER_BY_DEPLOYER,
+
+ /**
+ * Auto register. Will be registered when one service is exported.
+ */
+ AUTO_REGISTER;
}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
index 5f000daa8a..be0f96d247 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
@@ -73,6 +73,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Pattern;
+import java.util.stream.Collectors;
import static java.util.Arrays.asList;
import static java.util.ServiceLoader.load;
@@ -346,7 +347,9 @@ public class ExtensionLoader {
checkDestroyed();
// solve the bug of using @SPI's wrapper method to report a null pointer exception.
Map, T> activateExtensionsMap = new TreeMap<>(activateComparator);
- List names = values == null ? new ArrayList<>(0) : asList(values);
+ List names = values == null ?
+ new ArrayList<>(0) :
+ Arrays.stream(values).map(StringUtils::trim).collect(Collectors.toList());
Set namesSet = new HashSet<>(names);
if (!namesSet.contains(REMOVE_VALUE_PREFIX + DEFAULT_KEY)) {
if (cachedActivateGroups.size() == 0) {
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java
index e659b10b6f..058f1d1622 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java
@@ -21,6 +21,8 @@ import org.apache.dubbo.config.support.Parameter;
import org.apache.dubbo.rpc.model.ModuleModel;
import org.apache.dubbo.rpc.support.ProtocolUtils;
+import java.beans.Transient;
+
import static org.apache.dubbo.common.constants.CommonConstants.INVOKER_LISTENER_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.REFERENCE_FILTER_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.REFER_ASYNC_KEY;
@@ -184,6 +186,7 @@ public abstract class AbstractReferenceConfig extends AbstractInterfaceConfig {
}
@Override
+ @Transient
protected boolean isNeedCheckMethod() {
return StringUtils.isEmpty(getGeneric());
}
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 511c6bbfb7..ef6eaf870d 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
@@ -22,6 +22,7 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.ModuleModel;
import org.apache.dubbo.rpc.model.ScopeModel;
+import java.beans.Transient;
import java.util.ArrayList;
import java.util.List;
@@ -135,11 +136,13 @@ public class ModuleConfig extends AbstractConfig {
}
@Override
+ @Transient
public ModuleModel getScopeModel() {
return (ModuleModel) super.getScopeModel();
}
@Override
+ @Transient
protected ScopeModel getDefaultModel() {
return ApplicationModel.defaultModel().getDefaultModule();
}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java b/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
index bfeacacba5..e2115e5cde 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
@@ -150,6 +150,7 @@ public abstract class ReferenceConfigBase extends AbstractReferenceConfig {
}
@Override
+ @Transient
public Map getMetaData() {
return getMetaData(null);
}
@@ -226,7 +227,7 @@ public abstract class ReferenceConfigBase extends AbstractReferenceConfig {
public static Class> determineInterfaceClass(String generic, String interfaceName, ClassLoader classLoader) {
if (ProtocolUtils.isGeneric(generic)) {
- return GenericService.class;
+ return com.alibaba.dubbo.rpc.service.GenericService.class;
}
try {
if (StringUtils.isNotEmpty(interfaceName)) {
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java b/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
index 0db03d0208..93279cf657 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.config;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.constants.RegisterTypeEnum;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.annotation.Service;
@@ -180,6 +181,7 @@ public abstract class ServiceConfigBase extends AbstractServiceConfig {
}
@Override
+ @Transient
public Map getMetaData() {
return getMetaData(null);
}
@@ -416,7 +418,7 @@ public abstract class ServiceConfigBase extends AbstractServiceConfig {
* export service and auto start application instance
*/
public final void export() {
- export(true);
+ export(RegisterTypeEnum.AUTO_REGISTER);
}
public abstract void unexport();
@@ -425,7 +427,24 @@ public abstract class ServiceConfigBase extends AbstractServiceConfig {
public abstract boolean isUnexported();
- public abstract void export(boolean register);
+ /**
+ * Export service to network
+ *
+ * @param registerType register type of current export action.
+ */
+ public abstract void export(RegisterTypeEnum registerType);
- public abstract void register();
+ /**
+ * Register delay published service to registry.
+ */
+ public final void register() {
+ register(false);
+ }
+
+ /**
+ * Register delay published service to registry.
+ *
+ * @param byDeployer register by deployer or not.
+ */
+ public abstract void register(boolean byDeployer);
}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/BaggageConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/BaggageConfig.java
index b39f0ece30..beba9b5ddd 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/BaggageConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/BaggageConfig.java
@@ -39,19 +39,6 @@ public class BaggageConfig implements Serializable {
*/
private List remoteFields = new ArrayList<>();
- public BaggageConfig() {
- }
-
- public BaggageConfig(Boolean enabled) {
- this.enabled = enabled;
- }
-
- public BaggageConfig(Boolean enabled, Correlation correlation, List remoteFields) {
- this.enabled = enabled;
- this.correlation = correlation;
- this.remoteFields = remoteFields;
- }
-
public Boolean getEnabled() {
return enabled;
}
@@ -89,18 +76,6 @@ public class BaggageConfig implements Serializable {
*/
private List fields = new ArrayList<>();
- public Correlation() {
- }
-
- public Correlation(boolean enabled) {
- this.enabled = enabled;
- }
-
- public Correlation(boolean enabled, List fields) {
- this.enabled = enabled;
- this.fields = fields;
- }
-
public boolean isEnabled() {
return this.enabled;
}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java
index 871a5afbab..58de4dcd80 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java
@@ -56,28 +56,15 @@ public class ExporterConfig implements Serializable {
private String endpoint;
/**
- * Connection timeout for requests to Zipkin. (seconds)
+ * Connection timeout for requests to Zipkin.
*/
private Duration connectTimeout = Duration.ofSeconds(1);
/**
- * Read timeout for requests to Zipkin. (seconds)
+ * Read timeout for requests to Zipkin.
*/
private Duration readTimeout = Duration.ofSeconds(10);
- public ZipkinConfig() {
- }
-
- public ZipkinConfig(String endpoint) {
- this.endpoint = endpoint;
- }
-
- public ZipkinConfig(String endpoint, Duration connectTimeout, Duration readTimeout) {
- this.endpoint = endpoint;
- this.connectTimeout = connectTimeout;
- this.readTimeout = readTimeout;
- }
-
public String getEndpoint() {
return endpoint;
}
@@ -111,7 +98,7 @@ public class ExporterConfig implements Serializable {
private String endpoint;
/**
- * The maximum time to wait for the collector to process an exported batch of spans. (seconds)
+ * The maximum time to wait for the collector to process an exported batch of spans.
*/
private Duration timeout = Duration.ofSeconds(10);
@@ -123,24 +110,6 @@ public class ExporterConfig implements Serializable {
private Map headers = new HashMap<>();
- public OtlpConfig() {
- }
-
- public OtlpConfig(String endpoint) {
- this.endpoint = endpoint;
- }
-
- public OtlpConfig(String endpoint, Duration timeout) {
- this.endpoint = endpoint;
- this.timeout = timeout;
- }
-
- public OtlpConfig(String endpoint, Duration timeout, String compressionMethod) {
- this.endpoint = endpoint;
- this.timeout = timeout;
- this.compressionMethod = compressionMethod;
- }
-
public String getEndpoint() {
return endpoint;
}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/PropagationConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/PropagationConfig.java
index c574bd0e6d..8e52353323 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/PropagationConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/PropagationConfig.java
@@ -29,13 +29,6 @@ public class PropagationConfig implements Serializable {
*/
private String type = W3C;
- public PropagationConfig() {
- }
-
- public PropagationConfig(String type) {
- this.type = type;
- }
-
public String getType() {
return type;
}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
index 0e98a98b5f..a605527190 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
@@ -25,13 +25,6 @@ public class SamplingConfig implements Serializable {
*/
private float probability = 0.10f;
- public SamplingConfig() {
- }
-
- public SamplingConfig(float probability) {
- this.probability = probability;
- }
-
public float getProbability() {
return this.probability;
}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/service/GenericException.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/service/GenericException.java
index 23f8add206..39860701f6 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/service/GenericException.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/service/GenericException.java
@@ -16,12 +16,8 @@
*/
package org.apache.dubbo.rpc.service;
-import org.apache.dubbo.common.utils.JsonUtils;
import org.apache.dubbo.common.utils.StringUtils;
-import java.beans.Transient;
-import java.io.Serializable;
-
/**
* GenericException
*
@@ -31,169 +27,50 @@ public class GenericException extends RuntimeException {
private static final long serialVersionUID = -1182299763306599962L;
- private boolean useCause;
-
private String exceptionClass;
private String exceptionMessage;
- private final GenericExceptionInfo genericExceptionInfo;
-
public GenericException() {
- this(null, null);
+ }
+
+ public GenericException(String exceptionMessage) {
+ super(exceptionMessage);
+ this.exceptionMessage = exceptionMessage;
}
public GenericException(String exceptionClass, String exceptionMessage) {
super(exceptionMessage);
- this.useCause = false;
this.exceptionClass = exceptionClass;
this.exceptionMessage = exceptionMessage;
- this.genericExceptionInfo = new GenericExceptionInfo(exceptionClass, exceptionMessage, exceptionMessage, getStackTrace());
}
public GenericException(Throwable cause) {
super(StringUtils.toString(cause));
- this.useCause = false;
this.exceptionClass = cause.getClass().getName();
this.exceptionMessage = cause.getMessage();
- this.genericExceptionInfo = new GenericExceptionInfo(this.exceptionClass, this.exceptionMessage, super.getMessage(), getStackTrace());
}
- protected GenericException(GenericExceptionInfo info) {
- super(info.getMsg(), null, true, false);
- setStackTrace(info.getStackTrace());
- this.useCause = false;
- this.exceptionClass = info.getExClass();
- this.exceptionMessage = info.getExMsg();
- this.genericExceptionInfo = info;
+ public GenericException(String message, Throwable cause, String exceptionClass, String exceptionMessage) {
+ super(message, cause);
+ this.exceptionClass = exceptionClass;
+ this.exceptionMessage = exceptionMessage;
}
- @Transient
public String getExceptionClass() {
- if(this.useCause) {
- return ((GenericException)getCause()).getExceptionClass();
- }
return exceptionClass;
}
-
public void setExceptionClass(String exceptionClass) {
- if(this.useCause) {
- ((GenericException)getCause()).setExceptionClass(exceptionClass);
- return;
- }
this.exceptionClass = exceptionClass;
}
- @Transient
public String getExceptionMessage() {
- if(this.useCause) {
- return ((GenericException)getCause()).getExceptionMessage();
- }
return exceptionMessage;
}
public void setExceptionMessage(String exceptionMessage) {
- if(this.useCause) {
- ((GenericException)getCause()).setExceptionMessage(exceptionMessage);
- return;
- }
this.exceptionMessage = exceptionMessage;
}
- @Override
- @Transient
- public StackTraceElement[] getStackTrace() {
- if(this.useCause) {
- return ((GenericException)getCause()).getStackTrace();
- }
- return super.getStackTrace();
- }
-
- @Override
- @Transient
- public String getMessage() {
- if(this.useCause) {
- return getCause().getMessage();
- }
- return JsonUtils.toJson(GenericExceptionInfo.createNoStackTrace(genericExceptionInfo));
- }
-
- public String getGenericException() {
- if(this.useCause) {
- return ((GenericException)getCause()).getGenericException();
- }
- return JsonUtils.toJson(genericExceptionInfo);
- }
-
- public void setGenericException(String json) {
- GenericExceptionInfo info = JsonUtils.toJavaObject(json, GenericExceptionInfo.class);
- if(info == null) {
- return;
- }
- this.useCause = true;
- initCause(new GenericException(info));
- }
-
- @Override
- @Transient
- public String getLocalizedMessage() {
- return getMessage();
- }
-
- /**
- * create generic exception info
- */
- public static class GenericExceptionInfo implements Serializable {
- private String exClass;
- private String exMsg;
- private String msg;
- private StackTraceElement[] stackTrace;
-
- public GenericExceptionInfo() {
- }
-
- public GenericExceptionInfo(String exceptionClass, String exceptionMessage, String message, StackTraceElement[] stackTrace) {
- this.exClass = exceptionClass;
- this.exMsg = exceptionMessage;
- this.msg = message;
- this.stackTrace = stackTrace;
- }
-
- public static GenericExceptionInfo createNoStackTrace(GenericExceptionInfo info) {
- return new GenericExceptionInfo(info.getExClass(), info.getExMsg(), info.getMsg(), null);
- }
-
- public String getMsg() {
- return msg;
- }
-
- public String getExClass() {
- return exClass;
- }
-
- public String getExMsg() {
- return exMsg;
- }
-
- public void setExClass(String exClass) {
- this.exClass = exClass;
- }
-
- public void setExMsg(String exMsg) {
- this.exMsg = exMsg;
- }
-
- public void setMsg(String msg) {
- this.msg = msg;
- }
-
- public StackTraceElement[] getStackTrace() {
- return stackTrace;
- }
-
- public void setStackTrace(StackTraceElement[] stackTrace) {
- this.stackTrace = stackTrace;
- }
- }
}
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java
index 4f8f1474f1..2e2b2a0884 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java
@@ -221,7 +221,7 @@ class ExtensionLoaderTest {
}
@Test
- void test_getActivateExtension_WithWrapper() {
+ void test_getActivateExtension_WithWrapper1() {
URL url = URL.valueOf("test://localhost/test");
List list = getExtensionLoader(ActivateExt1.class)
.getActivateExtension(url, new String[]{}, "order");
@@ -596,7 +596,7 @@ class ExtensionLoaderTest {
}
@Test
- void testLoadDefaultActivateExtension() {
+ void testLoadDefaultActivateExtension1() {
// test default
URL url = URL.valueOf("test://localhost/test?ext=order1,default");
List list = getExtensionLoader(ActivateExt1.class)
@@ -620,6 +620,31 @@ class ExtensionLoaderTest {
assertSame(list.get(1).getClass(), OrderActivateExtImpl1.class);
}
+ @Test
+ void testLoadDefaultActivateExtension2() {
+ // test default
+ URL url = URL.valueOf("test://localhost/test?ext=order1 , default");
+ List list = getExtensionLoader(ActivateExt1.class)
+ .getActivateExtension(url, "ext", "default_group");
+ Assertions.assertEquals(2, list.size());
+ assertSame(list.get(0).getClass(), OrderActivateExtImpl1.class);
+ assertSame(list.get(1).getClass(), ActivateExt1Impl1.class);
+
+ url = URL.valueOf("test://localhost/test?ext=default, order1");
+ list = getExtensionLoader(ActivateExt1.class)
+ .getActivateExtension(url, "ext", "default_group");
+ Assertions.assertEquals(2, list.size());
+ assertSame(list.get(0).getClass(), ActivateExt1Impl1.class);
+ assertSame(list.get(1).getClass(), OrderActivateExtImpl1.class);
+
+ url = URL.valueOf("test://localhost/test?ext=order1");
+ list = getExtensionLoader(ActivateExt1.class)
+ .getActivateExtension(url, "ext", "default_group");
+ Assertions.assertEquals(2, list.size());
+ assertSame(list.get(0).getClass(), ActivateExt1Impl1.class);
+ assertSame(list.get(1).getClass(), OrderActivateExtImpl1.class);
+ }
+
@Test
void testInjectExtension() {
// register bean for test ScopeBeanExtensionInjector
diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/Constants.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/Constants.java
index f62a9bd177..4ed46e5e23 100644
--- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/Constants.java
+++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/Constants.java
@@ -23,21 +23,532 @@ import org.apache.dubbo.common.constants.QosConstants;
import org.apache.dubbo.common.constants.RegistryConstants;
import org.apache.dubbo.common.constants.RemotingConstants;
+import java.util.concurrent.ExecutorService;
+import java.util.regex.Pattern;
+
@Deprecated
public class Constants implements CommonConstants,
- QosConstants,
- FilterConstants,
- RegistryConstants,
- RemotingConstants,
- org.apache.dubbo.config.Constants,
- org.apache.dubbo.remoting.Constants,
- org.apache.dubbo.rpc.cluster.Constants,
- org.apache.dubbo.monitor.Constants,
- org.apache.dubbo.rpc.Constants,
- org.apache.dubbo.rpc.protocol.dubbo.Constants,
- org.apache.dubbo.common.serialize.Constants,
- org.apache.dubbo.common.config.configcenter.Constants,
- org.apache.dubbo.metadata.report.support.Constants ,
- org.apache.dubbo.rpc.protocol.rest.Constants,
- org.apache.dubbo.registry.Constants {
+ QosConstants,
+ FilterConstants,
+ RegistryConstants,
+ RemotingConstants,
+ org.apache.dubbo.config.Constants,
+ org.apache.dubbo.remoting.Constants,
+ org.apache.dubbo.rpc.cluster.Constants,
+ org.apache.dubbo.monitor.Constants,
+ org.apache.dubbo.rpc.Constants,
+ org.apache.dubbo.rpc.protocol.dubbo.Constants,
+ org.apache.dubbo.common.serialize.Constants,
+ org.apache.dubbo.common.config.configcenter.Constants,
+ org.apache.dubbo.metadata.report.support.Constants,
+ org.apache.dubbo.rpc.protocol.rest.Constants,
+ org.apache.dubbo.registry.Constants {
+ public static final String PROVIDER = "provider";
+
+ public static final String CONSUMER = "consumer";
+
+ public static final String REGISTER = "register";
+
+ public static final String UNREGISTER = "unregister";
+
+ public static final String SUBSCRIBE = "subscribe";
+
+ public static final String UNSUBSCRIBE = "unsubscribe";
+
+ public static final String CATEGORY_KEY = "category";
+
+ public static final String PROVIDERS_CATEGORY = "providers";
+
+ public static final String CONSUMERS_CATEGORY = "consumers";
+
+ public static final String ROUTERS_CATEGORY = "routers";
+
+ public static final String CONFIGURATORS_CATEGORY = "configurators";
+
+ public static final String DEFAULT_CATEGORY = PROVIDERS_CATEGORY;
+
+ public static final String ENABLED_KEY = "enabled";
+
+ public static final String DISABLED_KEY = "disabled";
+
+ public static final String VALIDATION_KEY = "validation";
+
+ public static final String CACHE_KEY = "cache";
+
+ public static final String DYNAMIC_KEY = "dynamic";
+
+ public static final String DUBBO_PROPERTIES_KEY = "dubbo.properties.file";
+
+ public static final String DEFAULT_DUBBO_PROPERTIES = "dubbo.properties";
+
+ public static final String SENT_KEY = "sent";
+
+ public static final boolean DEFAULT_SENT = false;
+
+ public static final String REGISTRY_PROTOCOL = "registry";
+
+ public static final String $INVOKE = "$invoke";
+
+ public static final String $ECHO = "$echo";
+
+ public static final int DEFAULT_IO_THREADS = Runtime.getRuntime()
+ .availableProcessors() + 1;
+
+ public static final String DEFAULT_PROXY = "javassist";
+
+ public static final int DEFAULT_PAYLOAD = 8 * 1024 * 1024;
+
+ public static final String DEFAULT_CLUSTER = "failover";
+
+ public static final String DEFAULT_DIRECTORY = "dubbo";
+
+ public static final String DEFAULT_LOADBALANCE = "random";
+
+ public static final String DEFAULT_PROTOCOL = "dubbo";
+
+ public static final String DEFAULT_EXCHANGER = "header";
+
+ public static final String DEFAULT_TRANSPORTER = "netty";
+
+ public static final String DEFAULT_REMOTING_SERVER = "netty";
+
+ public static final String DEFAULT_REMOTING_CLIENT = "netty";
+
+ public static final String DEFAULT_REMOTING_CODEC = "dubbo";
+
+ public static final String DEFAULT_REMOTING_SERIALIZATION = "hessian2";
+
+ public static final String DEFAULT_HTTP_SERVER = "servlet";
+
+ public static final String DEFAULT_HTTP_CLIENT = "jdk";
+
+ public static final String DEFAULT_HTTP_SERIALIZATION = "json";
+
+ public static final String DEFAULT_CHARSET = "UTF-8";
+
+ public static final int DEFAULT_WEIGHT = 100;
+
+ public static final int DEFAULT_FORKS = 2;
+
+ public static final String DEFAULT_THREAD_NAME = "Dubbo";
+
+ public static final int DEFAULT_CORE_THREADS = 0;
+
+ public static final int DEFAULT_THREADS = 200;
+
+ public static final int DEFAULT_QUEUES = 0;
+
+ public static final int DEFAULT_ALIVE = 60 * 1000;
+
+ public static final int DEFAULT_CONNECTIONS = 0;
+
+ public static final int DEFAULT_ACCEPTS = 0;
+
+ public static final int DEFAULT_IDLE_TIMEOUT = 600 * 1000;
+
+ public static final int DEFAULT_HEARTBEAT = 60 * 1000;
+
+ public static final int DEFAULT_TIMEOUT = 1000;
+
+ public static final int DEFAULT_CONNECT_TIMEOUT = 3000;
+
+ public static final int DEFAULT_RETRIES = 2;
+
+ public static final int DEFAULT_BUFFER_SIZE = 8 * 1024;
+
+ public static final int MAX_BUFFER_SIZE = 16 * 1024;
+
+ public static final int MIN_BUFFER_SIZE = 1 * 1024;
+
+ public static final String REMOVE_VALUE_PREFIX = "-";
+
+ public static final String HIDE_KEY_PREFIX = ".";
+
+ public static final String DEFAULT_KEY_PREFIX = "default.";
+
+ public static final String DEFAULT_KEY = "default";
+
+ public static final String LOADBALANCE_KEY = "loadbalance";
+
+ public static final String ROUTER_KEY = "router";
+
+ public static final String CLUSTER_KEY = "cluster";
+
+ public static final String REGISTRY_KEY = "registry";
+
+ public static final String MONITOR_KEY = "monitor";
+
+ public static final String SIDE_KEY = "side";
+
+ public static final String PROVIDER_SIDE = "provider";
+
+ public static final String CONSUMER_SIDE = "consumer";
+
+ public static final String DEFAULT_REGISTRY = "dubbo";
+
+ public static final String BACKUP_KEY = "backup";
+
+ public static final String DIRECTORY_KEY = "directory";
+
+ public static final String DEPRECATED_KEY = "deprecated";
+
+ public static final String ANYHOST_KEY = "anyhost";
+
+ public static final String ANYHOST_VALUE = "0.0.0.0";
+
+ public static final String LOCALHOST_KEY = "localhost";
+
+ public static final String LOCALHOST_VALUE = "127.0.0.1";
+
+ public static final String APPLICATION_KEY = "application";
+
+ public static final String LOCAL_KEY = "local";
+
+ public static final String STUB_KEY = "stub";
+
+ public static final String MOCK_KEY = "mock";
+
+ public static final String PROTOCOL_KEY = "protocol";
+
+ public static final String PROXY_KEY = "proxy";
+
+ public static final String WEIGHT_KEY = "weight";
+
+ public static final String FORKS_KEY = "forks";
+
+ public static final String DEFAULT_THREADPOOL = "limited";
+
+ public static final String DEFAULT_CLIENT_THREADPOOL = "cached";
+
+ public static final String THREADPOOL_KEY = "threadpool";
+
+ public static final String THREAD_NAME_KEY = "threadname";
+
+ public static final String IO_THREADS_KEY = "iothreads";
+
+ public static final String CORE_THREADS_KEY = "corethreads";
+
+ public static final String THREADS_KEY = "threads";
+
+ public static final String QUEUES_KEY = "queues";
+
+ public static final String ALIVE_KEY = "alive";
+
+ public static final String EXECUTES_KEY = "executes";
+
+ public static final String BUFFER_KEY = "buffer";
+
+ public static final String PAYLOAD_KEY = "payload";
+
+ public static final String REFERENCE_FILTER_KEY = "reference.filter";
+
+ public static final String INVOKER_LISTENER_KEY = "invoker.listener";
+
+ public static final String SERVICE_FILTER_KEY = "service.filter";
+
+ public static final String EXPORTER_LISTENER_KEY = "exporter.listener";
+
+ public static final String ACCESS_LOG_KEY = "accesslog";
+
+ public static final String ACTIVES_KEY = "actives";
+
+ public static final String CONNECTIONS_KEY = "connections";
+
+ public static final String ACCEPTS_KEY = "accepts";
+
+ public static final String IDLE_TIMEOUT_KEY = "idle.timeout";
+
+ public static final String HEARTBEAT_KEY = "heartbeat";
+
+ public static final String HEARTBEAT_TIMEOUT_KEY = "heartbeat.timeout";
+
+ public static final String CONNECT_TIMEOUT_KEY = "connect.timeout";
+
+ public static final String TIMEOUT_KEY = "timeout";
+
+ public static final String RETRIES_KEY = "retries";
+
+ public static final String PROMPT_KEY = "prompt";
+
+ public static final String DEFAULT_PROMPT = "dubbo>";
+
+ public static final String CODEC_KEY = "codec";
+
+ public static final String SERIALIZATION_KEY = "serialization";
+
+ public static final String EXCHANGER_KEY = "exchanger";
+
+ public static final String TRANSPORTER_KEY = "transporter";
+
+ public static final String SERVER_KEY = "server";
+
+ public static final String CLIENT_KEY = "client";
+
+ public static final String ID_KEY = "id";
+
+ public static final String ASYNC_KEY = "async";
+
+ public static final String RETURN_KEY = "return";
+
+ public static final String TOKEN_KEY = "token";
+
+ public static final String METHOD_KEY = "method";
+
+ public static final String METHODS_KEY = "methods";
+
+ public static final String CHARSET_KEY = "charset";
+
+ public static final String RECONNECT_KEY = "reconnect";
+
+ public static final String SEND_RECONNECT_KEY = "send.reconnect";
+
+ public static final int DEFAULT_RECONNECT_PERIOD = 2000;
+
+ public static final String SHUTDOWN_TIMEOUT_KEY = "shutdown.timeout";
+
+ public static final int DEFAULT_SHUTDOWN_TIMEOUT = 1000 * 60 * 15;
+
+ public static final String PID_KEY = "pid";
+
+ public static final String TIMESTAMP_KEY = "timestamp";
+
+ public static final String WARMUP_KEY = "warmup";
+
+ public static final int DEFAULT_WARMUP = 10 * 60 * 1000;
+
+ public static final String CHECK_KEY = "check";
+
+ public static final String REGISTER_KEY = "register";
+
+ public static final String SUBSCRIBE_KEY = "subscribe";
+
+ public static final String GROUP_KEY = "group";
+
+ public static final String PATH_KEY = "path";
+
+ public static final String INTERFACE_KEY = "interface";
+
+ public static final String GENERIC_KEY = "generic";
+
+ public static final String FILE_KEY = "file";
+
+ public static final String WAIT_KEY = "wait";
+
+ public static final String CLASSIFIER_KEY = "classifier";
+
+ public static final String VERSION_KEY = "version";
+
+ public static final String REVISION_KEY = "revision";
+
+ public static final String DUBBO_VERSION_KEY = "dubbo";
+
+ public static final String HESSIAN_VERSION_KEY = "hessian.version";
+
+ public static final String DISPATCHER_KEY = "dispatcher";
+
+ public static final String CHANNEL_HANDLER_KEY = "channel.handler";
+
+ public static final String DEFAULT_CHANNEL_HANDLER = "default";
+
+ public static final String ANY_VALUE = "*";
+
+ public static final String COMMA_SEPARATOR = ",";
+
+ public static final Pattern COMMA_SPLIT_PATTERN = Pattern
+ .compile("\\s*[,]+\\s*");
+
+ public final static String PATH_SEPARATOR = "/";
+
+ public static final String REGISTRY_SEPARATOR = "|";
+
+ public static final Pattern REGISTRY_SPLIT_PATTERN = Pattern
+ .compile("\\s*[|;]+\\s*");
+
+ public static final String SEMICOLON_SEPARATOR = ";";
+
+ public static final Pattern SEMICOLON_SPLIT_PATTERN = Pattern
+ .compile("\\s*[;]+\\s*");
+
+ public static final String CONNECT_QUEUE_CAPACITY = "connect.queue.capacity";
+
+ public static final String CONNECT_QUEUE_WARNING_SIZE = "connect.queue.warning.size";
+
+ public static final int DEFAULT_CONNECT_QUEUE_WARNING_SIZE = 1000;
+
+ public static final String CHANNEL_ATTRIBUTE_READONLY_KEY = "channel.readonly";
+
+ public static final String CHANNEL_READONLYEVENT_SENT_KEY = "channel.readonly.sent";
+
+ public static final String CHANNEL_SEND_READONLYEVENT_KEY = "channel.readonly.send";
+
+ public static final String COUNT_PROTOCOL = "count";
+
+ public static final String TRACE_PROTOCOL = "trace";
+
+ public static final String EMPTY_PROTOCOL = "empty";
+
+ public static final String ADMIN_PROTOCOL = "admin";
+
+ public static final String PROVIDER_PROTOCOL = "provider";
+
+ public static final String CONSUMER_PROTOCOL = "consumer";
+
+ public static final String ROUTE_PROTOCOL = "route";
+
+ public static final String SCRIPT_PROTOCOL = "script";
+
+ public static final String CONDITION_PROTOCOL = "condition";
+
+ public static final String MOCK_PROTOCOL = "mock";
+
+ public static final String RETURN_PREFIX = "return ";
+
+ public static final String THROW_PREFIX = "throw";
+
+ public static final String FAIL_PREFIX = "fail:";
+
+ public static final String FORCE_PREFIX = "force:";
+
+ public static final String FORCE_KEY = "force";
+
+ public static final String MERGER_KEY = "merger";
+
+ public static final String CLUSTER_AVAILABLE_CHECK_KEY = "cluster.availablecheck";
+
+ public static final boolean DEFAULT_CLUSTER_AVAILABLE_CHECK = true;
+
+ public static final String CLUSTER_STICKY_KEY = "sticky";
+
+ public static final boolean DEFAULT_CLUSTER_STICKY = false;
+
+ public static final String LAZY_CONNECT_KEY = "lazy";
+
+ public static final String LAZY_CONNECT_INITIAL_STATE_KEY = "connect.lazy.initial.state";
+
+ public static final boolean DEFAULT_LAZY_CONNECT_INITIAL_STATE = true;
+
+ public static final String REGISTRY_FILESAVE_SYNC_KEY = "save.file";
+
+ public static final String REGISTRY_RETRY_PERIOD_KEY = "retry.period";
+
+ public static final int DEFAULT_REGISTRY_RETRY_PERIOD = 5 * 1000;
+
+ public static final String REGISTRY_RECONNECT_PERIOD_KEY = "reconnect.period";
+
+ public static final int DEFAULT_REGISTRY_RECONNECT_PERIOD = 3 * 1000;
+
+ public static final String SESSION_TIMEOUT_KEY = "session";
+
+ public static final int DEFAULT_SESSION_TIMEOUT = 60 * 1000;
+
+ public static final String EXPORT_KEY = "export";
+
+ public static final String REFER_KEY = "refer";
+
+ public static final String CALLBACK_SERVICE_KEY = "callback.service.instid";
+
+ public static final String CALLBACK_INSTANCES_LIMIT_KEY = "callbacks";
+
+ public static final int DEFAULT_CALLBACK_INSTANCES = 1;
+
+ public static final String CALLBACK_SERVICE_PROXY_KEY = "callback.service.proxy";
+
+ public static final String IS_CALLBACK_SERVICE = "is_callback_service";
+
+ public static final String CHANNEL_CALLBACK_KEY = "channel.callback.invokers.key";
+
+ @Deprecated
+ public static final String SHUTDOWN_WAIT_SECONDS_KEY = "dubbo.service.shutdown.wait.seconds";
+
+ public static final String SHUTDOWN_WAIT_KEY = "dubbo.service.shutdown.wait";
+
+ public static final String IS_SERVER_KEY = "isserver";
+
+ public static final int DEFAULT_SERVER_SHUTDOWN_TIMEOUT = 10000;
+
+ public static final String ON_CONNECT_KEY = "onconnect";
+
+ public static final String ON_DISCONNECT_KEY = "ondisconnect";
+
+ public static final String ON_INVOKE_METHOD_KEY = "oninvoke.method";
+
+ public static final String ON_RETURN_METHOD_KEY = "onreturn.method";
+
+ public static final String ON_THROW_METHOD_KEY = "onthrow.method";
+
+ public static final String ON_INVOKE_INSTANCE_KEY = "oninvoke.instance";
+
+ public static final String ON_RETURN_INSTANCE_KEY = "onreturn.instance";
+
+ public static final String ON_THROW_INSTANCE_KEY = "onthrow.instance";
+
+ public static final String OVERRIDE_PROTOCOL = "override";
+
+ public static final String PRIORITY_KEY = "priority";
+
+ public static final String RULE_KEY = "rule";
+
+ public static final String TYPE_KEY = "type";
+
+ public static final String RUNTIME_KEY = "runtime";
+
+ public static final String ROUTER_TYPE_CLEAR = "clean";
+
+ public static final String DEFAULT_SCRIPT_TYPE_KEY = "javascript";
+
+ public static final String STUB_EVENT_KEY = "dubbo.stub.event";
+
+ public static final boolean DEFAULT_STUB_EVENT = false;
+
+ public static final String STUB_EVENT_METHODS_KEY = "dubbo.stub.event.methods";
+
+ public static final String INVOCATION_NEED_MOCK = "invocation.need.mock";
+
+ public static final String LOCAL_PROTOCOL = "injvm";
+
+ public static final String AUTO_ATTACH_INVOCATIONID_KEY = "invocationid.autoattach";
+
+ public static final String SCOPE_KEY = "scope";
+
+ public static final String SCOPE_LOCAL = "local";
+
+ public static final String SCOPE_REMOTE = "remote";
+
+ public static final String SCOPE_NONE = "none";
+
+ public static final String RELIABLE_PROTOCOL = "napoli";
+
+ public static final String TPS_LIMIT_RATE_KEY = "tps";
+
+ public static final String TPS_LIMIT_INTERVAL_KEY = "tps.interval";
+
+ public static final long DEFAULT_TPS_LIMIT_INTERVAL = 60 * 1000;
+
+ public static final String DECODE_IN_IO_THREAD_KEY = "decode.in.io";
+
+ public static final boolean DEFAULT_DECODE_IN_IO_THREAD = true;
+
+ public static final String INPUT_KEY = "input";
+
+ public static final String OUTPUT_KEY = "output";
+
+ public static final String EXECUTOR_SERVICE_COMPONENT_KEY = ExecutorService.class.getName();
+
+ public static final String GENERIC_SERIALIZATION_NATIVE_JAVA = "nativejava";
+
+ public static final String GENERIC_SERIALIZATION_DEFAULT = "true";
+
+ public static final String INVOKER_CONNECTED_KEY = "connected";
+
+ public static final String INVOKER_INSIDE_INVOKERS_KEY = "inside.invokers";
+
+ public static final String INVOKER_INSIDE_INVOKER_COUNT_KEY = "inside.invoker.count";
+
+ public static final String CLUSTER_SWITCH_FACTOR = "cluster.switch.factor";
+
+ public static final String CLUSTER_SWITCH_LOG_ERROR = "cluster.switch.log.error";
+
+ public static final double DEFAULT_CLUSTER_SWITCH_FACTOR = 2;
+
+ public static final String DISPATHER_KEY = "dispather";
}
diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java
index 2eda40f495..85e5cfcfe5 100644
--- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java
+++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java
@@ -17,14 +17,15 @@
package com.alibaba.dubbo.rpc;
+import org.apache.dubbo.rpc.model.ServiceModel;
+
+import java.beans.Transient;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
-import org.apache.dubbo.rpc.model.ServiceModel;
-
@Deprecated
public interface Invocation extends org.apache.dubbo.rpc.Invocation {
@@ -184,6 +185,7 @@ public interface Invocation extends org.apache.dubbo.rpc.Invocation {
}
@Override
+ @Transient
public Invoker> getInvoker() {
return new Invoker.CompatibleInvoker(delegate.getInvoker());
}
diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/RpcContext.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/RpcContext.java
index 4c49bc1793..cfc5fb4b8b 100644
--- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/RpcContext.java
+++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/RpcContext.java
@@ -37,6 +37,7 @@ import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import java.util.stream.Collectors;
@Deprecated
public class RpcContext {
@@ -320,6 +321,25 @@ public class RpcContext {
return isConsumerSide();
}
+ @Deprecated
+ public Invoker> getInvoker() {
+ org.apache.dubbo.rpc.Invoker> invoker = newRpcContext.getInvoker();
+ if (invoker == null) {
+ return null;
+ }
+ return new Invoker.CompatibleInvoker<>(invoker);
+ }
+
+ @Deprecated
+ public List> getInvokers() {
+ List> invokers = newRpcContext.getInvokers();
+ if (CollectionUtils.isEmpty(invokers)) {
+ return Collections.emptyList();
+ }
+ return invokers.stream()
+ .map(Invoker.CompatibleInvoker::new)
+ .collect(Collectors.toList());
+ }
/**
* Async invocation. Timeout will be handled even if Future.get() is not called.
*
diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/RpcInvocation.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/RpcInvocation.java
index 9035294927..7206210ceb 100644
--- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/RpcInvocation.java
+++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/RpcInvocation.java
@@ -17,6 +17,10 @@
package com.alibaba.dubbo.rpc;
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.URL;
+
+import java.beans.Transient;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.Arrays;
@@ -24,9 +28,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.URL;
-
+@Deprecated
public class RpcInvocation implements Invocation, Serializable {
private static final long serialVersionUID = -4355285085441097045L;
@@ -101,6 +103,7 @@ public class RpcInvocation implements Invocation, Serializable {
this.invoker = invoker;
}
+ @Transient
public Invoker> getInvoker() {
return invoker;
}
diff --git a/dubbo-config/dubbo-config-api/pom.xml b/dubbo-config/dubbo-config-api/pom.xml
index 7bd4234ebd..fec3459350 100644
--- a/dubbo-config/dubbo-config-api/pom.xml
+++ b/dubbo-config/dubbo-config-api/pom.xml
@@ -72,12 +72,6 @@
${project.parent.version}
-
- org.apache.dubbo
- dubbo-tracing
- ${project.parent.version}
-
-
org.apache.dubbo
dubbo-monitor-api
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
index a382c2fdb4..e3d3028a44 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.URLBuilder;
import org.apache.dubbo.common.Version;
import org.apache.dubbo.common.config.ConfigurationUtils;
import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.constants.RegisterTypeEnum;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
@@ -57,11 +58,14 @@ import java.beans.Transient;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.TreeSet;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.TreeSet;
import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -148,7 +152,7 @@ public class ServiceConfig extends ServiceConfigBase {
/**
* The exported services
*/
- private final List> exporters = new ArrayList>();
+ private final Map>> exporters = new ConcurrentHashMap<>();
private final List serviceListeners = new ArrayList<>();
@@ -196,19 +200,23 @@ public class ServiceConfig extends ServiceConfigBase {
return;
}
if (!exporters.isEmpty()) {
- for (Exporter> exporter : exporters) {
- try {
- exporter.unregister();
- } catch (Throwable t) {
- logger.warn(CONFIG_UNEXPORT_ERROR, "", "", "Unexpected error occurred when unexport " + exporter, t);
+ for (List> es : exporters.values()) {
+ for (Exporter> exporter : es) {
+ try {
+ exporter.unregister();
+ } catch (Throwable t) {
+ logger.warn(CONFIG_UNEXPORT_ERROR, "", "", "Unexpected error occurred when unexport " + exporter, t);
+ }
}
}
waitForIdle();
- for (Exporter> exporter : exporters) {
- try {
- exporter.unexport();
- } catch (Throwable t) {
- logger.warn(CONFIG_UNEXPORT_ERROR, "", "", "Unexpected error occurred when unexport " + exporter, t);
+ for (List> es : exporters.values()) {
+ for (Exporter> exporter : es) {
+ try {
+ exporter.unexport();
+ } catch (Throwable t) {
+ logger.warn(CONFIG_UNEXPORT_ERROR, "", "", "Unexpected error occurred when unexport " + exporter, t);
+ }
}
}
exporters.clear();
@@ -280,7 +288,7 @@ public class ServiceConfig extends ServiceConfigBase {
}
@Override
- public void export(boolean register) {
+ public void export(RegisterTypeEnum registerType) {
if (this.exported) {
return;
}
@@ -301,16 +309,19 @@ public class ServiceConfig extends ServiceConfigBase {
if (shouldDelay()) {
// should register if delay export
- doDelayExport(true);
+ doDelayExport();
+ } else if (Integer.valueOf(-1).equals(getDelay())) {
+ // should not register by default
+ doExport(RegisterTypeEnum.MANUAL_REGISTER);
} else {
- doExport(register);
+ doExport(registerType);
}
}
}
}
@Override
- public void register() {
+ public void register(boolean byDeployer) {
if (!this.exported) {
return;
}
@@ -320,17 +331,23 @@ public class ServiceConfig extends ServiceConfigBase {
return;
}
- for (Exporter> exporter : exporters) {
+ for (Exporter> exporter : exporters.getOrDefault(RegisterTypeEnum.AUTO_REGISTER, Collections.emptyList())) {
exporter.register();
}
+
+ if (byDeployer) {
+ for (Exporter> exporter : exporters.getOrDefault(RegisterTypeEnum.AUTO_REGISTER_BY_DEPLOYER, Collections.emptyList())) {
+ exporter.register();
+ }
+ }
}
}
- protected void doDelayExport(boolean register) {
+ protected void doDelayExport() {
ExecutorRepository.getInstance(getScopeModel().getApplicationModel()).getServiceExportExecutor()
.schedule(() -> {
try {
- doExport(register);
+ doExport(RegisterTypeEnum.AUTO_REGISTER);
} catch (Exception e) {
logger.error(CONFIG_FAILED_EXPORT_SERVICE, "configuration server disconnected", "", "Failed to (async)export service config: " + interfaceName, e);
}
@@ -457,7 +474,7 @@ public class ServiceConfig extends ServiceConfigBase {
checkAndUpdateSubConfigs();
}
- protected synchronized void doExport(boolean register) {
+ protected synchronized void doExport(RegisterTypeEnum registerType) {
if (unexported) {
throw new IllegalStateException("The service " + interfaceClass.getName() + " has already unexported!");
}
@@ -468,12 +485,12 @@ public class ServiceConfig extends ServiceConfigBase {
if (StringUtils.isEmpty(path)) {
path = interfaceName;
}
- doExportUrls(register);
+ doExportUrls(registerType);
exported();
}
@SuppressWarnings({"unchecked", "rawtypes"})
- private void doExportUrls(boolean register) {
+ private void doExportUrls(RegisterTypeEnum registerType) {
ModuleServiceRepository repository = getScopeModel().getServiceRepository();
ServiceDescriptor serviceDescriptor;
final boolean serverService = ref instanceof ServerService;
@@ -505,10 +522,10 @@ public class ServiceConfig extends ServiceConfigBase {
.orElse(path), group, version);
// stub service will use generated service name
if (!serverService) {
- // In case user specified path, register service one more time to map it to path.
+ // In case user specified path, registerImmediately service one more time to map it to path.
repository.registerService(pathKey, interfaceClass);
}
- doExportUrlsFor1Protocol(protocolConfig, registryURLs, register);
+ doExportUrlsFor1Protocol(protocolConfig, registryURLs, registerType);
}
return null;
}
@@ -517,7 +534,7 @@ public class ServiceConfig extends ServiceConfigBase {
providerModel.setServiceUrls(urls);
}
- private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List registryURLs, boolean register) {
+ private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List registryURLs, RegisterTypeEnum registerType) {
Map map = buildAttributes(protocolConfig);
// remove null key and null value
@@ -529,7 +546,7 @@ public class ServiceConfig extends ServiceConfigBase {
processServiceExecutor(url);
- exportUrl(url, registryURLs, register);
+ exportUrl(url, registryURLs, registerType);
}
private void processServiceExecutor(URL url) {
@@ -711,7 +728,7 @@ public class ServiceConfig extends ServiceConfigBase {
return url;
}
- private void exportUrl(URL url, List registryURLs, boolean register) {
+ private void exportUrl(URL url, List registryURLs, RegisterTypeEnum registerType) {
String scope = url.getParameter(SCOPE_KEY);
// don't export when none is configured
if (!SCOPE_NONE.equalsIgnoreCase(scope)) {
@@ -735,7 +752,7 @@ public class ServiceConfig extends ServiceConfigBase {
build();
}
- url = exportRemote(url, registryURLs, register);
+ url = exportRemote(url, registryURLs, registerType);
if (!isGeneric(generic) && !getScopeModel().isInternal()) {
MetadataUtils.publishServiceDefinition(url, providerModel.getServiceModel(), getApplicationModel());
}
@@ -750,7 +767,7 @@ public class ServiceConfig extends ServiceConfigBase {
URL localUrl = URLBuilder.from(url).
setProtocol(protocol).
build();
- localUrl = exportRemote(localUrl, registryURLs, register);
+ localUrl = exportRemote(localUrl, registryURLs, registerType);
if (!isGeneric(generic) && !getScopeModel().isInternal()) {
MetadataUtils.publishServiceDefinition(localUrl, providerModel.getServiceModel(), getApplicationModel());
}
@@ -762,8 +779,8 @@ public class ServiceConfig extends ServiceConfigBase {
this.urls.add(url);
}
- private URL exportRemote(URL url, List registryURLs, boolean register) {
- if (CollectionUtils.isNotEmpty(registryURLs)) {
+ private URL exportRemote(URL url, List registryURLs, RegisterTypeEnum registerType) {
+ if (CollectionUtils.isNotEmpty(registryURLs) && registerType != RegisterTypeEnum.NEVER_REGISTER) {
for (URL registryURL : registryURLs) {
if (SERVICE_REGISTRY_PROTOCOL.equals(registryURL.getProtocol())) {
url = url.addParameterIfAbsent(SERVICE_NAME_MAPPING_KEY, "true");
@@ -794,7 +811,7 @@ public class ServiceConfig extends ServiceConfigBase {
}
}
- doExportUrl(registryURL.putAttribute(EXPORT_KEY, url), true, register);
+ doExportUrl(registryURL.putAttribute(EXPORT_KEY, url), true, registerType);
}
} else {
@@ -803,7 +820,7 @@ public class ServiceConfig extends ServiceConfigBase {
logger.info("Export dubbo service " + interfaceClass.getName() + " to url " + url);
}
- doExportUrl(url, true, register);
+ doExportUrl(url, true, registerType);
}
@@ -811,16 +828,22 @@ public class ServiceConfig extends ServiceConfigBase {
}
@SuppressWarnings({"unchecked", "rawtypes"})
- private void doExportUrl(URL url, boolean withMetaData, boolean register) {
- if (!register) {
+ private void doExportUrl(URL url, boolean withMetaData, RegisterTypeEnum registerType) {
+ if (!url.getParameter(REGISTER_KEY, true)) {
+ registerType = RegisterTypeEnum.MANUAL_REGISTER;
+ }
+ if (registerType == RegisterTypeEnum.NEVER_REGISTER ||
+ registerType == RegisterTypeEnum.MANUAL_REGISTER ||
+ registerType == RegisterTypeEnum.AUTO_REGISTER_BY_DEPLOYER) {
url = url.addParameter(REGISTER_KEY, false);
}
+
Invoker> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, url);
if (withMetaData) {
invoker = new DelegateProviderMetaDataInvoker(invoker, this);
}
Exporter> exporter = protocolSPI.export(invoker);
- exporters.add(exporter);
+ exporters.computeIfAbsent(registerType, k -> new CopyOnWriteArrayList<>()).add(exporter);
}
@@ -836,7 +859,7 @@ public class ServiceConfig extends ServiceConfigBase {
local = local.setScopeModel(getScopeModel())
.setServiceModel(providerModel);
local = local.addParameter(EXPORTER_LISTENER_KEY, LOCAL_PROTOCOL);
- doExportUrl(local, false, true);
+ doExportUrl(local, false, RegisterTypeEnum.AUTO_REGISTER);
logger.info("Export dubbo service " + interfaceClass.getName() + " to local registry url : " + local);
}
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 6302ee6eb3..ac012ee3d5 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
@@ -38,6 +38,7 @@ import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.threadpool.manager.ExecutorRepository;
import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
import org.apache.dubbo.common.utils.ArrayUtils;
+import org.apache.dubbo.common.utils.ClassUtils;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.ApplicationConfig;
@@ -46,7 +47,6 @@ import org.apache.dubbo.config.DubboShutdownHook;
import org.apache.dubbo.config.MetadataReportConfig;
import org.apache.dubbo.config.MetricsConfig;
import org.apache.dubbo.config.RegistryConfig;
-import org.apache.dubbo.config.TracingConfig;
import org.apache.dubbo.config.context.ConfigManager;
import org.apache.dubbo.config.utils.CompositeReferenceCache;
import org.apache.dubbo.config.utils.ConfigValidationUtils;
@@ -60,7 +60,6 @@ import org.apache.dubbo.metrics.report.DefaultMetricsReporterFactory;
import org.apache.dubbo.metrics.report.MetricsReporter;
import org.apache.dubbo.metrics.report.MetricsReporterFactory;
import org.apache.dubbo.metrics.service.MetricsServiceExporter;
-import org.apache.dubbo.metrics.utils.MetricsSupportUtil;
import org.apache.dubbo.registry.Registry;
import org.apache.dubbo.registry.RegistryFactory;
import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;
@@ -71,8 +70,6 @@ import org.apache.dubbo.rpc.model.ModuleServiceRepository;
import org.apache.dubbo.rpc.model.ProviderModel;
import org.apache.dubbo.rpc.model.ScopeModel;
import org.apache.dubbo.rpc.model.ScopeModelUtil;
-import org.apache.dubbo.tracing.DubboObservationRegistry;
-import org.apache.dubbo.tracing.utils.ObservationSupportUtil;
import java.io.IOException;
import java.util.ArrayList;
@@ -155,7 +152,7 @@ public class DefaultApplicationDeployer extends AbstractDeployer deployListeners = applicationModel.getExtensionLoader(ApplicationDeployListener.class)
- .getSupportedExtensionInstances();
+ .getSupportedExtensionInstances();
for (ApplicationDeployListener listener : deployListeners) {
this.addDeployListener(listener);
}
@@ -229,9 +226,6 @@ public class DefaultApplicationDeployer extends AbstractDeployer defaultRegistries = configManager.getDefaultRegistries();
if (defaultRegistries.size() > 0) {
defaultRegistries
- .stream()
- .filter(this::isUsedRegistryAsConfigCenter)
- .map(this::registryAsConfigCenter)
- .forEach(configCenter -> {
- if (configManager.getConfigCenter(configCenter.getId()).isPresent()) {
- return;
- }
- configManager.addConfigCenter(configCenter);
- logger.info("use registry as config-center: " + configCenter);
+ .stream()
+ .filter(this::isUsedRegistryAsConfigCenter)
+ .map(this::registryAsConfigCenter)
+ .forEach(configCenter -> {
+ if (configManager.getConfigCenter(configCenter.getId()).isPresent()) {
+ return;
+ }
+ configManager.addConfigCenter(configCenter);
+ logger.info("use registry as config-center: " + configCenter);
- });
+ });
}
}
@@ -378,16 +372,16 @@ public class DefaultApplicationDeployer extends AbstractDeployer configOptional = configManager.getMetrics();
//If no specific metrics type is configured and there is no Prometheus dependency in the dependencies.
MetricsConfig metricsConfig = configOptional.orElse(new MetricsConfig(applicationModel));
if (StringUtils.isBlank(metricsConfig.getProtocol())) {
- metricsConfig.setProtocol(MetricsSupportUtil.isSupportPrometheus() ? PROTOCOL_PROMETHEUS : PROTOCOL_DEFAULT);
+ metricsConfig.setProtocol(isSupportPrometheus() ? PROTOCOL_PROMETHEUS : PROTOCOL_DEFAULT);
}
collector.setCollectEnabled(true);
collector.collectApplication();
@@ -415,35 +409,26 @@ public class DefaultApplicationDeployer extends AbstractDeployer 1.10.0");
- }
- return;
- }
- if (!ObservationSupportUtil.isSupportTracing()) {
- if (logger.isDebugEnabled()) {
- logger.debug("Not found micrometer-tracing dependency, skip init ObservationRegistry.");
- }
- return;
- }
- Optional configOptional = configManager.getTracing();
- if (!configOptional.isPresent() || !configOptional.get().getEnabled()) {
- return;
- }
+ public boolean isSupportMetrics() {
+ return isClassPresent("io.micrometer.core.instrument.MeterRegistry");
+ }
- DubboObservationRegistry dubboObservationRegistry = new DubboObservationRegistry(applicationModel, configOptional.get());
- dubboObservationRegistry.initObservationRegistry();
+ public static boolean isSupportPrometheus() {
+ return isClassPresent("io.micrometer.prometheus.PrometheusConfig")
+ && isClassPresent("io.prometheus.client.exporter.BasicAuthHttpConnectionFactory")
+ && isClassPresent("io.prometheus.client.exporter.HttpConnectionFactory")
+ && isClassPresent("io.prometheus.client.exporter.PushGateway");
+ }
+
+
+ private static boolean isClassPresent(String className) {
+ return ClassUtils.isPresent(className, DefaultApplicationDeployer.class.getClassLoader());
}
private boolean isUsedRegistryAsConfigCenter(RegistryConfig registryConfig) {
return isUsedRegistryAsCenter(registryConfig, registryConfig::getUseAsConfigCenter, "config",
- DynamicConfigurationFactory.class);
+ DynamicConfigurationFactory.class);
}
private ConfigCenterConfig registryAsConfigCenter(RegistryConfig registryConfig) {
@@ -485,9 +470,9 @@ public class DefaultApplicationDeployer extends AbstractDeployer metadataConfigsToOverride = originMetadataConfigs
- .stream()
- .filter(m -> Objects.isNull(m.getAddress()))
- .collect(Collectors.toList());
+ .stream()
+ .filter(m -> Objects.isNull(m.getAddress()))
+ .collect(Collectors.toList());
if (metadataConfigsToOverride.size() > 1) {
return;
@@ -498,12 +483,12 @@ public class DefaultApplicationDeployer extends AbstractDeployer defaultRegistries = configManager.getDefaultRegistries();
if (!defaultRegistries.isEmpty()) {
defaultRegistries
- .stream()
- .filter(this::isUsedRegistryAsMetadataCenter)
- .map(registryConfig -> registryAsMetadataCenter(registryConfig, metadataConfigToOverride))
- .forEach(metadataReportConfig -> {
- overrideMetadataReportConfig(metadataConfigToOverride, metadataReportConfig);
- });
+ .stream()
+ .filter(this::isUsedRegistryAsMetadataCenter)
+ .map(registryConfig -> registryAsMetadataCenter(registryConfig, metadataConfigToOverride))
+ .forEach(metadataReportConfig -> {
+ overrideMetadataReportConfig(metadataConfigToOverride, metadataReportConfig);
+ });
}
}
@@ -532,7 +517,7 @@ public class DefaultApplicationDeployer extends AbstractDeployer {
- ServiceInstanceMetadataUtils.registerMetadataAndInstance(applicationModel);
- return null;
- }
+ () -> {
+ ServiceInstanceMetadataUtils.registerMetadataAndInstance(applicationModel);
+ return null;
+ }
);
} catch (Exception e) {
logger.error(CONFIG_REGISTER_INSTANCE_ERROR, "configuration server disconnected", "", "Register instance error.", e);
@@ -1032,7 +1017,7 @@ public class DefaultApplicationDeployer extends AbstractDeployer impleme
asyncExportingFutures.add(future);
} else {
if (!sc.isExported()) {
- sc.export(false);
+ sc.export(RegisterTypeEnum.AUTO_REGISTER_BY_DEPLOYER);
exportedServices.add(sc);
}
}
@@ -441,7 +442,7 @@ public class DefaultModuleDeployer extends AbstractDeployer impleme
if (!sc.isExported()) {
return;
}
- sc.register();
+ sc.register(true);
}
private void unexportServices() {
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java
index 70380568ef..4e9c20d415 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java
@@ -670,8 +670,9 @@ public class ConfigValidationUtils {
if (isNotEmpty(value)) {
String[] values = value.split("\\s*[,]+\\s*");
for (String v : values) {
+ v = StringUtils.trim(v);
if (v.startsWith(REMOVE_VALUE_PREFIX)) {
- v = v.substring(1);
+ continue;
}
if (DEFAULT_KEY.equals(v)) {
continue;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
index 0a811bbae5..1a986a5884 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
@@ -207,8 +207,25 @@ class AbstractConfigTest {
@Test
void checkMultiExtension2() {
+ try {
+ ConfigValidationUtils.checkMultiExtension(ApplicationModel.defaultModel(), Greeting.class, "hello", "default,-world");
+ } catch (Throwable t) {
+ Assertions.fail(t);
+ }
+ }
+ @Test
+ void checkMultiExtension3() {
Assertions.assertThrows(IllegalStateException.class,
- () -> ConfigValidationUtils.checkMultiExtension(ApplicationModel.defaultModel(), Greeting.class, "hello", "default,-world"));
+ () -> ConfigValidationUtils.checkMultiExtension(ApplicationModel.defaultModel(), Greeting.class, "hello", "default , world"));
+ }
+
+ @Test
+ void checkMultiExtension4() {
+ try {
+ ConfigValidationUtils.checkMultiExtension(ApplicationModel.defaultModel(), Greeting.class, "hello", "default , -world ");
+ } catch (Throwable t) {
+ Assertions.fail(t);
+ }
}
@Test
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
index 99f94ebe49..434fb55f17 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
@@ -18,7 +18,7 @@
package org.apache.dubbo.config.deploy;
import org.apache.dubbo.common.utils.Assert;
-import org.apache.dubbo.metrics.utils.MetricsSupportUtil;
+import org.apache.dubbo.rpc.model.ApplicationModel;
import org.junit.jupiter.api.Test;
@@ -26,7 +26,7 @@ class DefaultApplicationDeployerTest {
@Test
void isSupportPrometheus() {
- boolean supportPrometheus = MetricsSupportUtil.isSupportPrometheus();
- Assert.assertTrue(supportPrometheus, "MetricsSupportUtil.isSupportPrometheus() should return true");
+ boolean supportPrometheus = new DefaultApplicationDeployer(ApplicationModel.defaultModel()).isSupportPrometheus();
+ Assert.assertTrue(supportPrometheus,"DefaultApplicationDeployer.isSupportPrometheus() should return true");
}
}
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java
index 445ddb6dfc..d2f9b7ee2d 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java
@@ -188,7 +188,7 @@ class MultipleRegistryCenterExportProviderIntegrationTest implements Integration
// 1. InjvmExporter
// 2. DubboExporter with service-discovery-registry protocol
// 3. DubboExporter with registry protocol
- Assertions.assertEquals(exporterListener.getExportedExporters().size(), 7);
+ Assertions.assertEquals(exporterListener.getExportedExporters().size(), 4);
// The exported exporter contains MultipleRegistryCenterExportProviderFilter
Assertions.assertTrue(exporterListener.getFilters().contains(filter));
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java
index 3ab4bf7b53..41de19efcb 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java
@@ -195,7 +195,7 @@ class SingleRegistryCenterExportProviderIntegrationTest implements IntegrationTe
// 1. InjvmExporter
// 2. DubboExporter with service-discovery-registry protocol
// 3. DubboExporter with registry protocol
- Assertions.assertEquals(exporterListener.getExportedExporters().size(), 5);
+ Assertions.assertEquals(exporterListener.getExportedExporters().size(), 4);
// The exported exporter contains SingleRegistryCenterExportProviderFilter
Assertions.assertTrue(exporterListener.getFilters().contains(filter));
// The consumer can be notified and get provider's metadata through metadata mapping info.
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml
index e86b1e5e49..ef128333bd 100644
--- a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml
@@ -224,7 +224,7 @@
org.graalvm.buildtools
native-maven-plugin
- 0.9.22
+ 0.9.23
${project.build.outputDirectory}
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml
index 3649d381e2..1f2fc06b5b 100644
--- a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml
@@ -222,7 +222,7 @@
org.graalvm.buildtools
native-maven-plugin
- 0.9.22
+ 0.9.23
${project.build.outputDirectory}
diff --git a/dubbo-demo/dubbo-demo-spring-boot/pom.xml b/dubbo-demo/dubbo-demo-spring-boot/pom.xml
index 230e3fc196..6a5f84e772 100644
--- a/dubbo-demo/dubbo-demo-spring-boot/pom.xml
+++ b/dubbo-demo/dubbo-demo-spring-boot/pom.xml
@@ -38,7 +38,7 @@
true
2.7.12
2.7.12
- 1.11.0
+ 1.11.1
diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml
index b90a248027..9c41b68dae 100644
--- a/dubbo-dependencies-bom/pom.xml
+++ b/dubbo-dependencies-bom/pom.xml
@@ -114,7 +114,7 @@
3.5.5
0.18.1
4.0.66
- 3.23.2
+ 3.23.3
1.3.2
3.1.0
9.4.51.v20230217
@@ -133,14 +133,13 @@
3.12.0
1.8.0
0.1.35
- 1.11.0
- 1.26.0
- 2.16.4
- 1.1.1
+ 1.11.1
+
+ 1.1.2
3.3
0.16.0
1.0.4
- 3.5.6
+ 3.5.7
2.2.21
3.14.9
@@ -150,7 +149,7 @@
8.5.87
0.7.5
2.2.3
- 1.55.1
+ 1.56.0
0.8.1
1.2.2
@@ -232,20 +231,6 @@
pom
import
-
- io.opentelemetry
- opentelemetry-bom
- ${opentelemetry.version}
- pom
- import
-
-
- io.zipkin.reporter2
- zipkin-reporter-bom
- ${zipkin-reporter.version}
- pom
- import
-
io.netty
netty-all
diff --git a/dubbo-distribution/dubbo-all/pom.xml b/dubbo-distribution/dubbo-all/pom.xml
index 76fc002d1c..3951a9fd9d 100644
--- a/dubbo-distribution/dubbo-all/pom.xml
+++ b/dubbo-distribution/dubbo-all/pom.xml
@@ -219,15 +219,6 @@
true
-
-
- org.apache.dubbo
- dubbo-tracing
- ${project.version}
- compile
- true
-
-
org.apache.dubbo
@@ -539,7 +530,6 @@
org.apache.dubbo:dubbo-metrics-metadata
org.apache.dubbo:dubbo-metrics-config-center
org.apache.dubbo:dubbo-metrics-prometheus
- org.apache.dubbo:dubbo-tracing
org.apache.dubbo:dubbo-monitor-api
org.apache.dubbo:dubbo-monitor-default
org.apache.dubbo:dubbo-qos
diff --git a/dubbo-distribution/dubbo-bom/pom.xml b/dubbo-distribution/dubbo-bom/pom.xml
index dac1366414..2d163f10e8 100644
--- a/dubbo-distribution/dubbo-bom/pom.xml
+++ b/dubbo-distribution/dubbo-bom/pom.xml
@@ -256,13 +256,6 @@
${project.version}
-
-
- org.apache.dubbo
- dubbo-tracing
- ${project.version}
-
-
org.apache.dubbo
diff --git a/dubbo-distribution/dubbo-core-spi/pom.xml b/dubbo-distribution/dubbo-core-spi/pom.xml
index 2a441485f8..88939753e9 100644
--- a/dubbo-distribution/dubbo-core-spi/pom.xml
+++ b/dubbo-distribution/dubbo-core-spi/pom.xml
@@ -134,7 +134,6 @@
org.apache.dubbo:dubbo-metadata-api
org.apache.dubbo:dubbo-metrics-api
org.apache.dubbo:dubbo-metrics-default
- org.apache.dubbo:dubbo-tracing
org.apache.dubbo:dubbo-monitor-api
org.apache.dubbo:dubbo-registry-api
org.apache.dubbo:dubbo-remoting-api
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java
index b035a4fcea..9ce637f2ad 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java
@@ -97,4 +97,8 @@ public class MetadataIdentifier extends BaseServiceMetadataIdentifier implements
this.application = application;
}
+ public String getUniqueServiceName() {
+ return serviceInterface != null ? URL.buildKey(serviceInterface, getGroup(), getVersion()) : null;
+ }
+
}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
index dbfd78dc55..1c26581a95 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
@@ -279,7 +279,7 @@ public abstract class AbstractMetadataReport implements MetadataReport {
private void storeProviderMetadataTask(MetadataIdentifier providerMetadataIdentifier, ServiceDefinition serviceDefinition) {
- MetadataEvent metadataEvent = MetadataEvent.toServiceSubscribeEvent(applicationModel, serviceDefinition.getCanonicalName());
+ MetadataEvent metadataEvent = MetadataEvent.toServiceSubscribeEvent(applicationModel, providerMetadataIdentifier.getUniqueServiceName());
MetricsEventBus.post(metadataEvent, () ->
{
boolean result = true;
diff --git a/dubbo-metrics/dubbo-metrics-api/pom.xml b/dubbo-metrics/dubbo-metrics-api/pom.xml
index 3c31ae389c..a35c238395 100644
--- a/dubbo-metrics/dubbo-metrics-api/pom.xml
+++ b/dubbo-metrics/dubbo-metrics-api/pom.xml
@@ -49,5 +49,10 @@
com.tdunning
t-digest
+
+ io.micrometer
+ micrometer-tracing-integration-test
+ test
+
diff --git a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/Pane.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/Pane.java
old mode 100644
new mode 100755
diff --git a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/SlidingWindow.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/SlidingWindow.java
old mode 100644
new mode 100755
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/AbstractDefaultDubboObservationConvention.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/AbstractDefaultDubboObservationConvention.java
similarity index 87%
rename from dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/AbstractDefaultDubboObservationConvention.java
rename to dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/AbstractDefaultDubboObservationConvention.java
index a688a4c826..410af9d674 100644
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/AbstractDefaultDubboObservationConvention.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/AbstractDefaultDubboObservationConvention.java
@@ -14,20 +14,20 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing;
-
-import io.micrometer.common.KeyValues;
-import io.micrometer.common.docs.KeyName;
-import io.micrometer.common.lang.Nullable;
+package org.apache.dubbo.metrics.observation;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.support.RpcUtils;
-import static org.apache.dubbo.tracing.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_METHOD;
-import static org.apache.dubbo.tracing.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_SERVICE;
-import static org.apache.dubbo.tracing.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_SYSTEM;
+import io.micrometer.common.KeyValues;
+import io.micrometer.common.docs.KeyName;
+import io.micrometer.common.lang.Nullable;
+
+import static org.apache.dubbo.metrics.observation.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_METHOD;
+import static org.apache.dubbo.metrics.observation.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_SERVICE;
+import static org.apache.dubbo.metrics.observation.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_SYSTEM;
class AbstractDefaultDubboObservationConvention {
KeyValues getLowCardinalityKeyValues(Invocation invocation) {
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConvention.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConvention.java
similarity index 92%
rename from dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConvention.java
rename to dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConvention.java
index 481861d1f9..91e88da2a3 100644
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConvention.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConvention.java
@@ -14,20 +14,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing;
+package org.apache.dubbo.metrics.observation;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcContext;
import org.apache.dubbo.rpc.RpcContextAttachment;
-import org.apache.dubbo.tracing.context.DubboClientContext;
import io.micrometer.common.KeyValues;
import java.util.List;
-import static org.apache.dubbo.tracing.DubboObservationDocumentation.LowCardinalityKeyNames.NET_PEER_NAME;
-import static org.apache.dubbo.tracing.DubboObservationDocumentation.LowCardinalityKeyNames.NET_PEER_PORT;
+import static org.apache.dubbo.metrics.observation.DubboObservationDocumentation.LowCardinalityKeyNames.NET_PEER_NAME;
+import static org.apache.dubbo.metrics.observation.DubboObservationDocumentation.LowCardinalityKeyNames.NET_PEER_PORT;
/**
* Default implementation of the {@link DubboClientObservationConvention}.
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConvention.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConvention.java
similarity index 94%
rename from dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConvention.java
rename to dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConvention.java
index c78be59806..adcebdbdac 100644
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConvention.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConvention.java
@@ -14,9 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing;
-
-import org.apache.dubbo.tracing.context.DubboServerContext;
+package org.apache.dubbo.metrics.observation;
import io.micrometer.common.KeyValues;
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboClientContext.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientContext.java
similarity index 97%
rename from dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboClientContext.java
rename to dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientContext.java
index f1998bc91a..910d6f74c0 100644
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboClientContext.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientContext.java
@@ -14,14 +14,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing.context;
+package org.apache.dubbo.metrics.observation;
-import java.util.Objects;
-
-import io.micrometer.observation.transport.SenderContext;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
+import io.micrometer.observation.transport.SenderContext;
+
+import java.util.Objects;
+
/**
* Provider context for RPC.
*/
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboClientObservationConvention.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientObservationConvention.java
similarity index 92%
rename from dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboClientObservationConvention.java
rename to dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientObservationConvention.java
index 5bd74dec50..d33164294d 100644
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboClientObservationConvention.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientObservationConvention.java
@@ -14,9 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing;
-
-import org.apache.dubbo.tracing.context.DubboClientContext;
+package org.apache.dubbo.metrics.observation;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationConvention;
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationDocumentation.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboObservationDocumentation.java
similarity index 98%
rename from dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationDocumentation.java
rename to dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboObservationDocumentation.java
index cd0dfe3d61..855a2e01e1 100644
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationDocumentation.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboObservationDocumentation.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing;
+package org.apache.dubbo.metrics.observation;
import io.micrometer.common.docs.KeyName;
import io.micrometer.common.lang.NonNullApi;
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboServerContext.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerContext.java
similarity index 97%
rename from dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboServerContext.java
rename to dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerContext.java
index 3e5bd13fae..bb1d7005d7 100644
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboServerContext.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerContext.java
@@ -14,12 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing.context;
+package org.apache.dubbo.metrics.observation;
-import io.micrometer.observation.transport.ReceiverContext;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
+import io.micrometer.observation.transport.ReceiverContext;
+
/**
* Consumer context for RPC.
*/
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboServerObservationConvention.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerObservationConvention.java
similarity index 92%
rename from dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboServerObservationConvention.java
rename to dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerObservationConvention.java
index 0f7917aded..678226ee7f 100644
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboServerObservationConvention.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerObservationConvention.java
@@ -14,9 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing;
-
-import org.apache.dubbo.tracing.context.DubboServerContext;
+package org.apache.dubbo.metrics.observation;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationConvention;
diff --git a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/utils/MetricsSupportUtil.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/utils/MetricsSupportUtil.java
deleted file mode 100644
index e0a02f5f04..0000000000
--- a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/utils/MetricsSupportUtil.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.metrics.utils;
-
-import org.apache.dubbo.common.utils.ClassUtils;
-
-public class MetricsSupportUtil {
-
- public static boolean isSupportMetrics() {
- return isClassPresent("io.micrometer.core.instrument.MeterRegistry");
- }
-
- public static boolean isSupportPrometheus() {
- return isClassPresent("io.micrometer.prometheus.PrometheusConfig")
- && isClassPresent("io.prometheus.client.exporter.BasicAuthHttpConnectionFactory")
- && isClassPresent("io.prometheus.client.exporter.HttpConnectionFactory")
- && isClassPresent("io.prometheus.client.exporter.PushGateway");
- }
-
- private static boolean isClassPresent(String className) {
- return ClassUtils.isPresent(className, MetricsSupportUtil.class.getClassLoader());
- }
-}
diff --git a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/aggregate/TimeWindowAggregatorTest.java b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/aggregate/TimeWindowAggregatorTest.java
index 2a660a5dd4..e0db96730f 100644
--- a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/aggregate/TimeWindowAggregatorTest.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/aggregate/TimeWindowAggregatorTest.java
@@ -17,9 +17,8 @@
package org.apache.dubbo.metrics.aggregate;
-
+import org.junit.Test;
import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
import java.util.concurrent.TimeUnit;
diff --git a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConventionTest.java b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConventionTest.java
similarity index 94%
rename from dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConventionTest.java
rename to dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConventionTest.java
index 0f1e641c4a..ce83f9e886 100644
--- a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConventionTest.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConventionTest.java
@@ -14,12 +14,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing;
+package org.apache.dubbo.metrics.observation;
+import org.apache.dubbo.metrics.observation.utils.ObservationConventionUtils;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcInvocation;
-import org.apache.dubbo.tracing.context.DubboClientContext;
-import org.apache.dubbo.tracing.utils.ObservationConventionUtils;
import io.micrometer.common.KeyValues;
import org.junit.jupiter.api.Assertions;
diff --git a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConventionTest.java b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConventionTest.java
similarity index 93%
rename from dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConventionTest.java
rename to dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConventionTest.java
index 95a755cd98..7ca6398c9e 100644
--- a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConventionTest.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConventionTest.java
@@ -14,13 +14,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing;
+package org.apache.dubbo.metrics.observation;
+import org.apache.dubbo.metrics.observation.utils.ObservationConventionUtils;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcInvocation;
-import org.apache.dubbo.tracing.context.DubboClientContext;
-import org.apache.dubbo.tracing.context.DubboServerContext;
-import org.apache.dubbo.tracing.utils.ObservationConventionUtils;
import io.micrometer.common.KeyValues;
import org.junit.jupiter.api.Assertions;
diff --git a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationConventionUtils.java b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/utils/ObservationConventionUtils.java
similarity index 97%
rename from dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationConventionUtils.java
rename to dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/utils/ObservationConventionUtils.java
index f0b75c8c2c..e6de96f069 100644
--- a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationConventionUtils.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/utils/ObservationConventionUtils.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing.utils;
+package org.apache.dubbo.metrics.observation.utils;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.Invoker;
diff --git a/dubbo-metrics/dubbo-metrics-default/pom.xml b/dubbo-metrics/dubbo-metrics-default/pom.xml
index 0d2fd8a6bf..71be413c6a 100644
--- a/dubbo-metrics/dubbo-metrics-default/pom.xml
+++ b/dubbo-metrics/dubbo-metrics-default/pom.xml
@@ -41,5 +41,10 @@
micrometer-test
test
+
+ io.micrometer
+ micrometer-tracing-integration-test
+ test
+
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilter.java b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilter.java
similarity index 80%
rename from dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilter.java
rename to dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilter.java
index 25b7008c67..5a33ced437 100644
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilter.java
+++ b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilter.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing.filter;
+package org.apache.dubbo.metrics.observation;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.BaseFilter;
@@ -25,10 +25,6 @@ import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.ScopeModelAware;
-import org.apache.dubbo.tracing.DefaultDubboServerObservationConvention;
-import org.apache.dubbo.tracing.DubboObservationDocumentation;
-import org.apache.dubbo.tracing.DubboServerObservationConvention;
-import org.apache.dubbo.tracing.context.DubboServerContext;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
@@ -38,7 +34,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER;
/**
* A {@link Filter} that creates an {@link Observation} around the incoming message.
*/
-@Activate(group = PROVIDER, order = Integer.MIN_VALUE + 50, onClass = "io.micrometer.observation.NoopObservationRegistry")
+@Activate(group = PROVIDER, order = -1, onClass = "io.micrometer.observation.NoopObservationRegistry")
public class ObservationReceiverFilter implements Filter, BaseFilter.Listener, ScopeModelAware {
private ObservationRegistry observationRegistry;
@@ -46,8 +42,12 @@ public class ObservationReceiverFilter implements Filter, BaseFilter.Listener, S
private DubboServerObservationConvention serverObservationConvention;
public ObservationReceiverFilter(ApplicationModel applicationModel) {
- observationRegistry = applicationModel.getBeanFactory().getBean(ObservationRegistry.class);
- serverObservationConvention = applicationModel.getBeanFactory().getBean(DubboServerObservationConvention.class);
+ applicationModel.getApplicationConfigManager().getTracing().ifPresent(cfg -> {
+ if (Boolean.TRUE.equals(cfg.getEnabled())) {
+ observationRegistry = applicationModel.getBeanFactory().getBean(ObservationRegistry.class);
+ serverObservationConvention = applicationModel.getBeanFactory().getBean(DubboServerObservationConvention.class);
+ }
+ });
}
@Override
@@ -70,9 +70,6 @@ public class ObservationReceiverFilter implements Filter, BaseFilter.Listener, S
if (observation == null) {
return;
}
- if (appResponse != null && appResponse.hasException()) {
- observation.error(appResponse.getException());
- }
observation.stop();
}
diff --git a/dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter b/dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
new file mode 100644
index 0000000000..5ee6c1d455
--- /dev/null
+++ b/dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
@@ -0,0 +1,2 @@
+metrics-beta=org.apache.dubbo.metrics.filter.MetricsFilter
+observationreceiver=org.apache.dubbo.metrics.observation.ObservationReceiverFilter
\ No newline at end of file
diff --git a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/AbstractObservationFilterTest.java b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/AbstractObservationFilterTest.java
similarity index 94%
rename from dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/AbstractObservationFilterTest.java
rename to dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/AbstractObservationFilterTest.java
index 046a0f1f95..31715ca94b 100644
--- a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/AbstractObservationFilterTest.java
+++ b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/AbstractObservationFilterTest.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.dubbo.tracing.filter;
+package org.apache.dubbo.metrics.observation;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.TracingConfig;
@@ -24,7 +24,6 @@ import org.apache.dubbo.rpc.BaseFilter;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcInvocation;
import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.tracing.MockInvocation;
import io.micrometer.tracing.test.SampleTestRunner;
import org.junit.jupiter.api.AfterEach;
@@ -80,7 +79,7 @@ abstract class AbstractObservationFilterTest extends SampleTestRunner {
private void initParam() {
invocation.setTargetServiceUniqueName(GROUP + "/" + INTERFACE_NAME + ":" + VERSION);
invocation.setMethodName(METHOD_NAME);
- invocation.setParameterTypes(new Class[]{String.class});
+ invocation.setParameterTypes(new Class[] {String.class});
}
}
diff --git a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/MockInvocation.java b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/MockInvocation.java
similarity index 97%
rename from dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/MockInvocation.java
rename to dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/MockInvocation.java
index cd9c0335dd..8cb43471d8 100644
--- a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/MockInvocation.java
+++ b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/MockInvocation.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.tracing;
+package org.apache.dubbo.metrics.observation;
import org.apache.dubbo.rpc.AttachmentsAdapter;
import org.apache.dubbo.rpc.Invoker;
@@ -68,11 +68,11 @@ public class MockInvocation extends RpcInvocation {
}
public Class>[] getParameterTypes() {
- return new Class[]{String.class};
+ return new Class[] {String.class};
}
public Object[] getArguments() {
- return new Object[]{"aa"};
+ return new Object[] {"aa"};
}
public Map getAttachments() {
diff --git a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilterTest.java b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilterTest.java
similarity index 99%
rename from dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilterTest.java
rename to dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilterTest.java
index 4cb0282430..91101e1aa0 100644
--- a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilterTest.java
+++ b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilterTest.java
@@ -15,13 +15,8 @@
* limitations under the License.
*/
-package org.apache.dubbo.tracing.filter;
+package org.apache.dubbo.metrics.observation;
-import io.micrometer.common.KeyValues;
-import io.micrometer.core.tck.MeterRegistryAssert;
-import io.micrometer.tracing.Span;
-import io.micrometer.tracing.Tracer;
-import io.micrometer.tracing.test.simple.SpansAssert;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.AppResponse;
import org.apache.dubbo.rpc.Filter;
@@ -32,6 +27,11 @@ import org.apache.dubbo.rpc.RpcContext;
import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.model.ApplicationModel;
+import io.micrometer.common.KeyValues;
+import io.micrometer.core.tck.MeterRegistryAssert;
+import io.micrometer.tracing.Span;
+import io.micrometer.tracing.Tracer;
+import io.micrometer.tracing.test.simple.SpansAssert;
import org.assertj.core.api.BDDAssertions;
class ObservationReceiverFilterTest extends AbstractObservationFilterTest {
diff --git a/dubbo-metrics/dubbo-tracing/pom.xml b/dubbo-metrics/dubbo-tracing/pom.xml
deleted file mode 100644
index e50dae23bd..0000000000
--- a/dubbo-metrics/dubbo-tracing/pom.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-
-
- 4.0.0
-
- org.apache.dubbo
- dubbo-metrics
- ${revision}
- ../pom.xml
-
-
- dubbo-tracing
- jar
- ${project.artifactId}
- The tracing module of dubbo project
-
-
- 11
- 11
- UTF-8
- false
-
-
-
-
- org.apache.dubbo
- dubbo-common
- ${project.parent.version}
-
-
- org.apache.dubbo
- dubbo-cluster
- ${project.parent.version}
-
-
- org.apache.dubbo
- dubbo-rpc-api
- ${project.parent.version}
-
-
- org.apache.dubbo
- dubbo-metrics-default
- ${project.parent.version}
-
-
-
-
- io.micrometer
- micrometer-core
-
-
- io.micrometer
- micrometer-tracing
-
-
- io.micrometer
- micrometer-test
- test
-
-
- io.micrometer
- micrometer-tracing-integration-test
- test
-
-
-
-
- io.micrometer
- micrometer-tracing-bridge-otel
- true
-
-
- io.micrometer
- micrometer-tracing-bridge-brave
- true
-
-
-
-
- io.opentelemetry
- opentelemetry-exporter-zipkin
- true
-
-
- io.opentelemetry
- opentelemetry-exporter-otlp
- true
-
-
- io.zipkin.reporter2
- zipkin-reporter-brave
- true
-
-
-
\ No newline at end of file
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationRegistry.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationRegistry.java
deleted file mode 100644
index a8497d998b..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationRegistry.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.tracing;
-
-import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
-import org.apache.dubbo.common.logger.LoggerFactory;
-import org.apache.dubbo.common.utils.JsonUtils;
-import org.apache.dubbo.config.TracingConfig;
-import org.apache.dubbo.metrics.MetricsGlobalRegistry;
-import org.apache.dubbo.metrics.utils.MetricsSupportUtil;
-import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.tracing.tracer.PropagatorProvider;
-import org.apache.dubbo.tracing.tracer.PropagatorProviderFactory;
-import org.apache.dubbo.tracing.tracer.TracerProvider;
-import org.apache.dubbo.tracing.tracer.TracerProviderFactory;
-
-import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_NOT_FOUND_TRACER_DEPENDENCY;
-
-public class DubboObservationRegistry {
-
- private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(DubboObservationRegistry.class);
-
- private final ApplicationModel applicationModel;
-
- private final TracingConfig tracingConfig;
-
- public DubboObservationRegistry(ApplicationModel applicationModel, TracingConfig tracingConfig) {
- this.applicationModel = applicationModel;
- this.tracingConfig = tracingConfig;
- }
-
- public void initObservationRegistry() {
- // If get ObservationRegistry.class from external(eg Spring.), use external.
- io.micrometer.observation.ObservationRegistry externalObservationRegistry = applicationModel.getBeanFactory().getBean(io.micrometer.observation.ObservationRegistry.class);
- if (externalObservationRegistry != null) {
- if (logger.isDebugEnabled()) {
- logger.debug("ObservationRegistry.class from external is existed.");
- }
- return;
- }
-
- if (logger.isDebugEnabled()) {
- logger.debug("Tracing config is: " + JsonUtils.toJson(tracingConfig));
- }
-
- TracerProvider tracerProvider = TracerProviderFactory.getProvider(applicationModel, tracingConfig);
- if (tracerProvider == null) {
- logger.warn(COMMON_NOT_FOUND_TRACER_DEPENDENCY, "", "", "Can not found OpenTelemetry/Brave tracer dependencies, skip init ObservationRegistry.");
- return;
- }
- // The real tracer will come from tracer implementation (OTel / Brave)
- io.micrometer.tracing.Tracer tracer = tracerProvider.getTracer();
-
- // The real propagator will come from tracer implementation (OTel / Brave)
- PropagatorProvider propagatorProvider = PropagatorProviderFactory.getPropagatorProvider();
- io.micrometer.tracing.propagation.Propagator propagator = propagatorProvider != null ? propagatorProvider.getPropagator() : io.micrometer.tracing.propagation.Propagator.NOOP;
-
- io.micrometer.observation.ObservationRegistry registry = io.micrometer.observation.ObservationRegistry.create();
- registry.observationConfig()
- // set up a first matching handler that creates spans - it comes from Micrometer Tracing.
- // set up spans for sending and receiving data over the wire and a default one.
- .observationHandler(new io.micrometer.observation.ObservationHandler.FirstMatchingCompositeObservationHandler(
- new io.micrometer.tracing.handler.PropagatingSenderTracingObservationHandler<>(tracer, propagator),
- new io.micrometer.tracing.handler.PropagatingReceiverTracingObservationHandler<>(tracer, propagator),
- new io.micrometer.tracing.handler.DefaultTracingObservationHandler(tracer)));
-
- if (MetricsSupportUtil.isSupportMetrics()) {
- io.micrometer.core.instrument.MeterRegistry meterRegistry = MetricsGlobalRegistry.getCompositeRegistry(applicationModel);
- registry.observationConfig().observationHandler(new io.micrometer.core.instrument.observation.DefaultMeterObservationHandler(meterRegistry));
- }
-
- applicationModel.getBeanFactory().registerBean(registry);
- applicationModel.getBeanFactory().registerBean(tracer);
- applicationModel.getBeanFactory().registerBean(propagator);
- }
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporterFactory.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporterFactory.java
deleted file mode 100644
index 7327cf038e..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporterFactory.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.tracing.exporter;
-
-import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
-import org.apache.dubbo.common.logger.LoggerFactory;
-import org.apache.dubbo.common.utils.StringUtils;
-import org.apache.dubbo.config.nested.ExporterConfig;
-import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.tracing.exporter.otlp.OTlpExporter;
-import org.apache.dubbo.tracing.exporter.zipkin.ZipkinExporter;
-
-import brave.handler.SpanHandler;
-import io.opentelemetry.sdk.trace.export.SpanExporter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class TraceExporterFactory {
-
- private final static ErrorTypeAwareLogger LOGGER = LoggerFactory.getErrorTypeAwareLogger(TraceExporterFactory.class);
-
- /**
- * for OTel
- */
- public static List getSpanExporters(ApplicationModel applicationModel, ExporterConfig exporterConfig) {
- ExporterConfig.ZipkinConfig zipkinConfig = exporterConfig.getZipkinConfig();
- ExporterConfig.OtlpConfig otlpConfig = exporterConfig.getOtlpConfig();
- List res = new ArrayList<>();
- if (zipkinConfig != null && StringUtils.isNotEmpty(zipkinConfig.getEndpoint())) {
- ZipkinExporter zipkinExporter = new ZipkinExporter(applicationModel, zipkinConfig);
- LOGGER.info("Create zipkin span exporter.");
- res.add(zipkinExporter.getSpanExporter());
- }
- if (otlpConfig != null && StringUtils.isNotEmpty(otlpConfig.getEndpoint())) {
- OTlpExporter otlpExporter = new OTlpExporter(applicationModel, otlpConfig);
- LOGGER.info("Create OTlp span exporter.");
- res.add(otlpExporter.getSpanExporter());
- }
-
- return res;
- }
-
- /**
- * for Brave
- */
- public static List getSpanHandlers(ApplicationModel applicationModel, ExporterConfig exporterConfig) {
- List res = new ArrayList<>();
- // TODO brave SpanHandler impl
- return res;
- }
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/otlp/OTlpExporter.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/otlp/OTlpExporter.java
deleted file mode 100644
index 72da78a795..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/otlp/OTlpExporter.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.tracing.exporter.otlp;
-
-import org.apache.dubbo.config.nested.ExporterConfig;
-import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.tracing.exporter.TraceExporter;
-
-import brave.handler.SpanHandler;
-import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
-import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
-import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder;
-import io.opentelemetry.sdk.trace.export.SpanExporter;
-
-import java.util.Map;
-
-public class OTlpExporter implements TraceExporter {
-
- private final ApplicationModel applicationModel;
- private final ExporterConfig.OtlpConfig otlpConfig;
-
- public OTlpExporter(ApplicationModel applicationModel, ExporterConfig.OtlpConfig otlpConfig) {
- this.applicationModel = applicationModel;
- this.otlpConfig = otlpConfig;
- }
-
- @Override
- public SpanExporter getSpanExporter() {
- OtlpGrpcSpanExporter externalOTlpGrpcSpanExporter = applicationModel.getBeanFactory().getBean(OtlpGrpcSpanExporter.class);
- if (externalOTlpGrpcSpanExporter != null) {
- return externalOTlpGrpcSpanExporter;
- }
- OtlpHttpSpanExporter externalOtlpHttpSpanExporter = applicationModel.getBeanFactory().getBean(OtlpHttpSpanExporter.class);
- if (externalOtlpHttpSpanExporter != null) {
- return externalOtlpHttpSpanExporter;
- }
- OtlpGrpcSpanExporterBuilder builder = OtlpGrpcSpanExporter.builder()
- .setEndpoint(otlpConfig.getEndpoint())
- .setTimeout(otlpConfig.getTimeout())
- .setCompression(otlpConfig.getCompressionMethod());
- for (Map.Entry entry : otlpConfig.getHeaders().entrySet()) {
- builder.addHeader(entry.getKey(), entry.getValue());
- }
- return builder.build();
- }
-
- @Override
- public SpanHandler getSpanHandler() {
- // OTlp is only belong to OTel.
- return null;
- }
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinExporter.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinExporter.java
deleted file mode 100644
index c0c00c6fa8..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinExporter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.tracing.exporter.zipkin;
-
-import org.apache.dubbo.config.nested.ExporterConfig;
-import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.tracing.exporter.TraceExporter;
-
-import brave.handler.SpanHandler;
-import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter;
-import io.opentelemetry.sdk.trace.export.SpanExporter;
-import zipkin2.Span;
-import zipkin2.codec.BytesEncoder;
-import zipkin2.codec.SpanBytesEncoder;
-
-public class ZipkinExporter implements TraceExporter {
-
- private final ApplicationModel applicationModel;
- private final ExporterConfig.ZipkinConfig zipkinConfig;
-
- public ZipkinExporter(ApplicationModel applicationModel, ExporterConfig.ZipkinConfig zipkinConfig) {
- this.applicationModel = applicationModel;
- this.zipkinConfig = zipkinConfig;
- }
-
- @Override
- public SpanExporter getSpanExporter() {
- BytesEncoder encoder = getSpanBytesEncoder();
- return ZipkinSpanExporter.builder()
- .setEncoder(encoder)
- .setEndpoint(zipkinConfig.getEndpoint())
- .setReadTimeout(zipkinConfig.getReadTimeout())
- .build();
- }
-
- @Override
- public SpanHandler getSpanHandler() {
- // TODO SpanHandler of Brave impl
- return null;
- }
-
- private BytesEncoder getSpanBytesEncoder() {
- BytesEncoder encoder = applicationModel.getBeanFactory().getBean(BytesEncoder.class);
- return encoder == null ? SpanBytesEncoder.JSON_V2 : encoder;
- }
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProvider.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProvider.java
deleted file mode 100644
index dc9b58f4e0..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProvider.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.tracing.tracer;
-
-import io.micrometer.tracing.propagation.Propagator;
-
-public interface PropagatorProvider {
-
- /**
- * The real propagator will come from tracer implementation (OTel / Brave)
- *
- * @return Propagator
- */
- Propagator getPropagator();
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactory.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactory.java
deleted file mode 100644
index 066cb7ad63..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.tracing.tracer;
-
-import org.apache.dubbo.tracing.tracer.brave.BravePropagatorProvider;
-import org.apache.dubbo.tracing.tracer.otel.OTelPropagatorProvider;
-import org.apache.dubbo.tracing.utils.ObservationSupportUtil;
-
-public class PropagatorProviderFactory {
-
- public static PropagatorProvider getPropagatorProvider() {
- // If support OTel firstly, return OTel, then Brave.
- if (ObservationSupportUtil.isSupportOTelTracer()) {
- return new OTelPropagatorProvider();
- }
-
- if (ObservationSupportUtil.isSupportBraveTracer()) {
- return new BravePropagatorProvider();
- }
-
- return null;
- }
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProvider.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProvider.java
deleted file mode 100644
index 05305ada67..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProvider.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.tracing.tracer;
-
-import io.micrometer.tracing.Tracer;
-
-public interface TracerProvider {
-
- /**
- * Tracer of Micrometer. The real tracer will come from tracer implementation (OTel / Brave)
- *
- * @return Tracer
- */
- Tracer getTracer();
-
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProviderFactory.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProviderFactory.java
deleted file mode 100644
index 7e325809cb..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProviderFactory.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.tracing.tracer;
-
-import org.apache.dubbo.config.TracingConfig;
-import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.tracing.tracer.brave.BraveProvider;
-import org.apache.dubbo.tracing.tracer.otel.OpenTelemetryProvider;
-import org.apache.dubbo.tracing.utils.ObservationSupportUtil;
-
-public class TracerProviderFactory {
-
- public static TracerProvider getProvider(ApplicationModel applicationModel, TracingConfig tracingConfig) {
- // If support OTel firstly, return OTel, then Brave.
- if (ObservationSupportUtil.isSupportOTelTracer()) {
- return new OpenTelemetryProvider(applicationModel, tracingConfig);
- }
-
- if (ObservationSupportUtil.isSupportBraveTracer()) {
- return new BraveProvider(applicationModel, tracingConfig);
- }
-
- return null;
- }
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
deleted file mode 100644
index 8560a5b149..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.tracing.tracer.brave;
-
-import org.apache.dubbo.tracing.tracer.PropagatorProvider;
-
-import io.micrometer.tracing.propagation.Propagator;
-
-
-public class BravePropagatorProvider implements PropagatorProvider {
-
- @Override
- public Propagator getPropagator() {
- // TODO impl
- return null;
- }
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BraveProvider.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BraveProvider.java
deleted file mode 100644
index 9ab8172b02..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BraveProvider.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.tracing.tracer.brave;
-
-import org.apache.dubbo.config.TracingConfig;
-import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.tracing.tracer.TracerProvider;
-
-import io.micrometer.tracing.Tracer;
-
-
-public class BraveProvider implements TracerProvider {
-
- private final ApplicationModel applicationModel;
- private final TracingConfig tracingConfig;
-
- public BraveProvider(ApplicationModel applicationModel, TracingConfig tracingConfig) {
- this.applicationModel = applicationModel;
- this.tracingConfig = tracingConfig;
- }
-
- @Override
- public Tracer getTracer() {
- // TODO impl
- return null;
- }
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProvider.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProvider.java
deleted file mode 100644
index 9f537f1e4d..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.tracing.tracer.otel;
-
-import org.apache.dubbo.tracing.tracer.PropagatorProvider;
-
-import io.micrometer.tracing.otel.bridge.OtelPropagator;
-import io.micrometer.tracing.propagation.Propagator;
-import io.opentelemetry.api.trace.Tracer;
-import io.opentelemetry.context.propagation.ContextPropagators;
-
-public class OTelPropagatorProvider implements PropagatorProvider {
-
- private static Propagator propagator;
-
- @Override
- public Propagator getPropagator() {
- return propagator;
- }
-
- protected static void createMicrometerPropagator(ContextPropagators contextPropagators, Tracer tracer) {
- propagator = new OtelPropagator(contextPropagators, tracer);
- }
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProvider.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProvider.java
deleted file mode 100644
index 36b3c3f191..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProvider.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * 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.tracing.tracer.otel;
-
-import org.apache.dubbo.common.Version;
-import org.apache.dubbo.common.lang.Nullable;
-import org.apache.dubbo.config.ApplicationConfig;
-import org.apache.dubbo.config.TracingConfig;
-import org.apache.dubbo.config.nested.BaggageConfig;
-import org.apache.dubbo.config.nested.PropagationConfig;
-import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.tracing.exporter.TraceExporterFactory;
-import org.apache.dubbo.tracing.tracer.TracerProvider;
-
-import io.micrometer.tracing.Tracer;
-import io.micrometer.tracing.otel.bridge.CompositeSpanExporter;
-import io.micrometer.tracing.otel.bridge.EventListener;
-import io.micrometer.tracing.otel.bridge.EventPublishingContextWrapper;
-import io.micrometer.tracing.otel.bridge.OtelBaggageManager;
-import io.micrometer.tracing.otel.bridge.OtelCurrentTraceContext;
-import io.micrometer.tracing.otel.bridge.OtelTracer;
-import io.micrometer.tracing.otel.bridge.Slf4JBaggageEventListener;
-import io.micrometer.tracing.otel.bridge.Slf4JEventListener;
-import io.micrometer.tracing.otel.propagation.BaggageTextMapPropagator;
-import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
-import io.opentelemetry.api.common.Attributes;
-import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
-import io.opentelemetry.context.ContextStorage;
-import io.opentelemetry.context.propagation.ContextPropagators;
-import io.opentelemetry.context.propagation.TextMapPropagator;
-import io.opentelemetry.extension.trace.propagation.B3Propagator;
-import io.opentelemetry.sdk.OpenTelemetrySdk;
-import io.opentelemetry.sdk.resources.Resource;
-import io.opentelemetry.sdk.trace.SdkTracerProvider;
-import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
-import io.opentelemetry.sdk.trace.export.SpanExporter;
-import io.opentelemetry.sdk.trace.samplers.Sampler;
-import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-public class OpenTelemetryProvider implements TracerProvider {
-
- private static final String DEFAULT_APPLICATION_NAME = "dubbo-application";
- private final ApplicationModel applicationModel;
- private final TracingConfig tracingConfig;
-
- private OTelEventPublisher publisher;
- private OtelCurrentTraceContext otelCurrentTraceContext;
-
- public OpenTelemetryProvider(ApplicationModel applicationModel, TracingConfig tracingConfig) {
- this.applicationModel = applicationModel;
- this.tracingConfig = tracingConfig;
- }
-
- @Override
- public Tracer getTracer() {
- // [OTel component] SpanExporter is a component that gets called when a span is finished.
- List spanExporters = TraceExporterFactory.getSpanExporters(applicationModel, tracingConfig.getTracingExporter());
-
- String applicationName = applicationModel.getApplicationConfigManager().getApplication()
- .map(ApplicationConfig::getName)
- .orElse(DEFAULT_APPLICATION_NAME);
-
- this.publisher = new OTelEventPublisher(getEventListeners());
-
- // [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel
- this.otelCurrentTraceContext = createCurrentTraceContext();
-
- // [OTel component] SdkTracerProvider is an SDK implementation for TracerProvider
- SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
- .setSampler(getSampler())
- .setResource(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, applicationName)))
- .addSpanProcessor(BatchSpanProcessor
- .builder(new CompositeSpanExporter(spanExporters, null, null, null))
- .build())
- .build();
-
- ContextPropagators otelContextPropagators = createOtelContextPropagators();
-
- // [OTel component] The SDK implementation of OpenTelemetry
- OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
- .setTracerProvider(sdkTracerProvider)
- .setPropagators(otelContextPropagators)
- .build();
-
- // [OTel component] Tracer is a component that handles the life-cycle of a span
- io.opentelemetry.api.trace.Tracer otelTracer = openTelemetrySdk.getTracerProvider()
- .get("org.apache.dubbo", Version.getVersion());
-
- OTelPropagatorProvider.createMicrometerPropagator(otelContextPropagators, otelTracer);
-
- // [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel's Tracer.
- return new OtelTracer(otelTracer, otelCurrentTraceContext, publisher,
- new OtelBaggageManager(otelCurrentTraceContext,
- tracingConfig.getBaggage().getRemoteFields(),
- Collections.emptyList()));
- }
-
- /**
- * sampler with probability
- *
- * @return sampler
- */
- private Sampler getSampler() {
- Sampler rootSampler = Sampler.traceIdRatioBased(tracingConfig.getSampling().getProbability());
- return Sampler.parentBased(rootSampler);
- }
-
- private List getEventListeners() {
- List listeners = new ArrayList<>();
-
- // [Micrometer Tracing component] A Micrometer Tracing listener for setting up MDC.
- Slf4JEventListener slf4JEventListener = new Slf4JEventListener();
- listeners.add(slf4JEventListener);
-
- if (tracingConfig.getBaggage().getEnabled()) {
- // [Micrometer Tracing component] A Micrometer Tracing listener for setting Baggage in MDC.
- // Customizable with correlation fields.
- Slf4JBaggageEventListener slf4JBaggageEventListener = new Slf4JBaggageEventListener(tracingConfig.getBaggage().getCorrelation().getFields());
- listeners.add(slf4JBaggageEventListener);
- }
-
- return listeners;
- }
-
- private OtelCurrentTraceContext createCurrentTraceContext() {
- ContextStorage.addWrapper(new EventPublishingContextWrapper(publisher));
- return new OtelCurrentTraceContext();
- }
-
- private ContextPropagators createOtelContextPropagators() {
- return ContextPropagators.create(
- TextMapPropagator.composite(
- PropagatorFactory.getPropagator(tracingConfig.getPropagation(),
- tracingConfig.getBaggage(),
- otelCurrentTraceContext
- )));
- }
-
- static class OTelEventPublisher implements OtelTracer.EventPublisher {
-
- private final List listeners;
-
- OTelEventPublisher(List listeners) {
- this.listeners = listeners;
- }
-
- @Override
- public void publishEvent(Object event) {
- for (EventListener listener : this.listeners) {
- listener.onEvent(event);
- }
- }
- }
-
- static class PropagatorFactory {
-
- public static TextMapPropagator getPropagator(PropagationConfig propagationConfig,
- @Nullable BaggageConfig baggageConfig,
- @Nullable OtelCurrentTraceContext currentTraceContext) {
- if (baggageConfig == null || !baggageConfig.getEnabled()) {
- return getPropagatorWithoutBaggage(propagationConfig);
- }
- return getPropagatorWithBaggage(propagationConfig, baggageConfig, currentTraceContext);
- }
-
- private static TextMapPropagator getPropagatorWithoutBaggage(PropagationConfig propagationConfig) {
- String type = propagationConfig.getType();
- if ("B3".equals(type)) {
- return B3Propagator.injectingSingleHeader();
- } else if ("W3C".equals(type)) {
- return W3CTraceContextPropagator.getInstance();
- }
- return TextMapPropagator.noop();
- }
-
- private static TextMapPropagator getPropagatorWithBaggage(PropagationConfig propagationConfig,
- BaggageConfig baggageConfig,
- OtelCurrentTraceContext currentTraceContext) {
- String type = propagationConfig.getType();
- if ("B3".equals(type)) {
- List remoteFields = baggageConfig.getRemoteFields();
- return TextMapPropagator.composite(B3Propagator.injectingSingleHeader(),
- new BaggageTextMapPropagator(remoteFields,
- new OtelBaggageManager(currentTraceContext, remoteFields, Collections.emptyList())));
- } else if ("W3C".equals(type)) {
- List remoteFields = baggageConfig.getRemoteFields();
- return TextMapPropagator.composite(W3CTraceContextPropagator.getInstance(),
- W3CBaggagePropagator.getInstance(), new BaggageTextMapPropagator(remoteFields,
- new OtelBaggageManager(currentTraceContext, remoteFields, Collections.emptyList())));
- }
- return TextMapPropagator.noop();
- }
- }
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/ObservationSupportUtil.java b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/ObservationSupportUtil.java
deleted file mode 100644
index 4cf8e05edf..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/ObservationSupportUtil.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.tracing.utils;
-
-import org.apache.dubbo.common.utils.ClassUtils;
-
-public class ObservationSupportUtil {
-
- public static boolean isSupportObservation() {
- return isClassPresent("io.micrometer.observation.Observation")
- && isClassPresent("io.micrometer.observation.ObservationRegistry")
- && isClassPresent("io.micrometer.observation.ObservationHandler");
- }
-
- public static boolean isSupportTracing() {
- return isClassPresent("io.micrometer.tracing.Tracer")
- && isClassPresent("io.micrometer.tracing.propagation.Propagator");
- }
-
- public static boolean isSupportOTelTracer() {
- return isClassPresent("io.micrometer.tracing.otel.bridge.OtelTracer")
- && isClassPresent("io.opentelemetry.sdk.trace.SdkTracerProvider")
- && isClassPresent("io.opentelemetry.api.OpenTelemetry");
- }
-
- public static boolean isSupportBraveTracer() {
- return isClassPresent("io.micrometer.tracing.Tracer")
- && isClassPresent("io.micrometer.tracing.brave.bridge.BraveTracer")
- && isClassPresent("brave.Tracing");
- }
-
- private static boolean isClassPresent(String className) {
- return ClassUtils.isPresent(className, ObservationSupportUtil.class.getClassLoader());
- }
-}
diff --git a/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter b/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
deleted file mode 100644
index a7efac7c5e..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
+++ /dev/null
@@ -1 +0,0 @@
-observationreceiver=org.apache.dubbo.tracing.filter.ObservationReceiverFilter
\ No newline at end of file
diff --git a/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter b/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
deleted file mode 100644
index f13199c666..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
+++ /dev/null
@@ -1 +0,0 @@
-observationsender=org.apache.dubbo.tracing.filter.ObservationSenderFilter
\ No newline at end of file
diff --git a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactoryTest.java b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactoryTest.java
deleted file mode 100644
index 18f1a74e0e..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactoryTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.tracing.tracer;
-
-import org.apache.dubbo.common.utils.Assert;
-import org.apache.dubbo.tracing.tracer.otel.OTelPropagatorProvider;
-
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-class PropagatorProviderFactoryTest {
-
- @Test
- void testPropagatorProviderFactory() {
- PropagatorProvider propagatorProvider = PropagatorProviderFactory.getPropagatorProvider();
- Assert.notNull(propagatorProvider, "PropagatorProvider should not be null");
- assertEquals(OTelPropagatorProvider.class, propagatorProvider.getClass());
- }
-}
\ No newline at end of file
diff --git a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
deleted file mode 100644
index 83f2cd2df0..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.tracing.tracer.otel;
-
-import org.apache.dubbo.common.utils.Assert;
-
-import io.micrometer.tracing.propagation.Propagator;
-import io.opentelemetry.api.trace.Tracer;
-import io.opentelemetry.context.propagation.ContextPropagators;
-import org.junit.jupiter.api.Test;
-
-import static org.mockito.Mockito.mock;
-
-class OTelPropagatorProviderTest {
-
- @Test
- void testOTelPropagatorProvider() {
- ContextPropagators contextPropagators = mock(ContextPropagators.class);
- Tracer tracer = mock(Tracer.class);
- OTelPropagatorProvider.createMicrometerPropagator(contextPropagators, tracer);
- OTelPropagatorProvider oTelPropagatorProvider = new OTelPropagatorProvider();
- Propagator propagator = oTelPropagatorProvider.getPropagator();
- Assert.notNull(propagator, "Propagator don't be null.");
- }
-}
\ No newline at end of file
diff --git a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProviderTest.java b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProviderTest.java
deleted file mode 100644
index 0374912c3a..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProviderTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.tracing.tracer.otel;
-
-import org.apache.dubbo.common.utils.Assert;
-import org.apache.dubbo.config.TracingConfig;
-import org.apache.dubbo.config.nested.BaggageConfig;
-import org.apache.dubbo.config.nested.ExporterConfig;
-import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.tracing.tracer.TracerProvider;
-import org.apache.dubbo.tracing.tracer.TracerProviderFactory;
-
-import io.micrometer.tracing.Tracer;
-import io.micrometer.tracing.otel.bridge.OtelTracer;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-class OpenTelemetryProviderTest {
-
- @Test
- void testGetTracer() {
- TracingConfig tracingConfig = new TracingConfig();
- tracingConfig.setEnabled(true);
- ExporterConfig exporterConfig = new ExporterConfig();
- exporterConfig.setZipkinConfig(new ExporterConfig.ZipkinConfig(""));
- tracingConfig.setTracingExporter(exporterConfig);
- TracerProvider tracerProvider1 = TracerProviderFactory.getProvider(ApplicationModel.defaultModel(), tracingConfig);
- Assert.notNull(tracerProvider1, "TracerProvider should not be null.");
- Tracer tracer1 = tracerProvider1.getTracer();
- assertEquals(OtelTracer.class, tracer1.getClass());
-
- tracingConfig.setBaggage(new BaggageConfig(false));
- TracerProvider tracerProvider2 = TracerProviderFactory.getProvider(ApplicationModel.defaultModel(), tracingConfig);
- Assert.notNull(tracerProvider2, "TracerProvider should not be null.");
- Tracer tracer2 = tracerProvider2.getTracer();
- assertEquals(OtelTracer.class, tracer2.getClass());
- }
-}
\ No newline at end of file
diff --git a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationSupportUtilTest.java b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationSupportUtilTest.java
deleted file mode 100644
index 3903053ca8..0000000000
--- a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationSupportUtilTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.tracing.utils;
-
-import org.apache.dubbo.common.utils.Assert;
-
-import org.junit.jupiter.api.Test;
-
-public class ObservationSupportUtilTest {
-
- @Test
- void testIsSupportObservation() {
- boolean supportObservation = ObservationSupportUtil.isSupportObservation();
- Assert.assertTrue(supportObservation, "ObservationSupportUtil.isSupportObservation() should return true");
- }
-
- @Test
- void testIsSupportTracing() {
- boolean supportTracing = ObservationSupportUtil.isSupportTracing();
- Assert.assertTrue(supportTracing, "ObservationSupportUtil.isSupportTracing() should return true");
- }
-
- @Test
- void testIsSupportOTelTracer() {
- boolean supportOTelTracer = ObservationSupportUtil.isSupportOTelTracer();
- Assert.assertTrue(supportOTelTracer, "ObservationSupportUtil.isSupportOTelTracer() should return true");
- }
-
- @Test
- void testIsSupportBraveTracer() {
- boolean supportBraveTracer = ObservationSupportUtil.isSupportBraveTracer();
- Assert.assertTrue(supportBraveTracer, "ObservationSupportUtil.isSupportOTelTracer() should return true");
- }
-}
diff --git a/dubbo-metrics/pom.xml b/dubbo-metrics/pom.xml
index c10defb8d6..04abd6e077 100644
--- a/dubbo-metrics/pom.xml
+++ b/dubbo-metrics/pom.xml
@@ -24,7 +24,6 @@
dubbo-metrics-metadata
dubbo-metrics-prometheus
dubbo-metrics-config-center
- dubbo-tracing
org.apache.dubbo
diff --git a/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/AuthenticationExceptionTranslatorFilter.java b/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/AuthenticationExceptionTranslatorFilter.java
index 7885250782..00dadabf59 100644
--- a/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/AuthenticationExceptionTranslatorFilter.java
+++ b/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/AuthenticationExceptionTranslatorFilter.java
@@ -24,12 +24,16 @@ import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcException;
+
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.core.AuthenticationException;
+
import static org.apache.dubbo.rpc.RpcException.AUTHORIZATION_EXCEPTION;
+import static org.apache.dubbo.spring.security.utils.SecurityNames.CORE_JACKSON_2_MODULE_CLASS_NAME;
+import static org.apache.dubbo.spring.security.utils.SecurityNames.OBJECT_MAPPER_CLASS_NAME;
import static org.apache.dubbo.spring.security.utils.SecurityNames.SECURITY_CONTEXT_HOLDER_CLASS_NAME;
-@Activate(group = CommonConstants.PROVIDER, order =Integer.MAX_VALUE,onClass = SECURITY_CONTEXT_HOLDER_CLASS_NAME)
+@Activate(group = CommonConstants.PROVIDER, order = Integer.MAX_VALUE, onClass = {SECURITY_CONTEXT_HOLDER_CLASS_NAME, CORE_JACKSON_2_MODULE_CLASS_NAME, OBJECT_MAPPER_CLASS_NAME})
public class AuthenticationExceptionTranslatorFilter implements Filter, Filter.Listener {
diff --git a/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/ContextHolderAuthenticationPrepareFilter.java b/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/ContextHolderAuthenticationPrepareFilter.java
index e2a8fe0bc6..6617f4be85 100644
--- a/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/ContextHolderAuthenticationPrepareFilter.java
+++ b/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/ContextHolderAuthenticationPrepareFilter.java
@@ -27,13 +27,17 @@ import org.apache.dubbo.rpc.cluster.filter.ClusterFilter;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.spring.security.jackson.ObjectMapperCodec;
import org.apache.dubbo.spring.security.utils.SecurityNames;
+
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
+
+import static org.apache.dubbo.spring.security.utils.SecurityNames.CORE_JACKSON_2_MODULE_CLASS_NAME;
+import static org.apache.dubbo.spring.security.utils.SecurityNames.OBJECT_MAPPER_CLASS_NAME;
import static org.apache.dubbo.spring.security.utils.SecurityNames.SECURITY_CONTEXT_HOLDER_CLASS_NAME;
-@Activate(group = CommonConstants.CONSUMER, order = -10000,onClass = SECURITY_CONTEXT_HOLDER_CLASS_NAME)
-public class ContextHolderAuthenticationPrepareFilter implements ClusterFilter{
+@Activate(group = CommonConstants.CONSUMER, order = -10000, onClass = {SECURITY_CONTEXT_HOLDER_CLASS_NAME, CORE_JACKSON_2_MODULE_CLASS_NAME, OBJECT_MAPPER_CLASS_NAME})
+public class ContextHolderAuthenticationPrepareFilter implements ClusterFilter {
private final ObjectMapperCodec mapper;
diff --git a/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/ContextHolderAuthenticationResolverFilter.java b/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/ContextHolderAuthenticationResolverFilter.java
index acd5026409..9f2567185a 100644
--- a/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/ContextHolderAuthenticationResolverFilter.java
+++ b/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/filter/ContextHolderAuthenticationResolverFilter.java
@@ -27,11 +27,15 @@ import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.spring.security.jackson.ObjectMapperCodec;
import org.apache.dubbo.spring.security.utils.SecurityNames;
+
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
+
+import static org.apache.dubbo.spring.security.utils.SecurityNames.CORE_JACKSON_2_MODULE_CLASS_NAME;
+import static org.apache.dubbo.spring.security.utils.SecurityNames.OBJECT_MAPPER_CLASS_NAME;
import static org.apache.dubbo.spring.security.utils.SecurityNames.SECURITY_CONTEXT_HOLDER_CLASS_NAME;
-@Activate(group = CommonConstants.PROVIDER, order = -10000,onClass = SECURITY_CONTEXT_HOLDER_CLASS_NAME)
+@Activate(group = CommonConstants.PROVIDER, order = -10000, onClass = {SECURITY_CONTEXT_HOLDER_CLASS_NAME, CORE_JACKSON_2_MODULE_CLASS_NAME, OBJECT_MAPPER_CLASS_NAME})
public class ContextHolderAuthenticationResolverFilter implements Filter {
private final ObjectMapperCodec mapper;
diff --git a/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/model/SecurityScopeModelInitializer.java b/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/model/SecurityScopeModelInitializer.java
index 9679334f6f..286adedb1d 100644
--- a/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/model/SecurityScopeModelInitializer.java
+++ b/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/model/SecurityScopeModelInitializer.java
@@ -25,10 +25,14 @@ import org.apache.dubbo.rpc.model.ModuleModel;
import org.apache.dubbo.rpc.model.ScopeModelInitializer;
import org.apache.dubbo.spring.security.jackson.ObjectMapperCodec;
import org.apache.dubbo.spring.security.jackson.ObjectMapperCodecCustomer;
+
import java.util.Set;
+
+import static org.apache.dubbo.spring.security.utils.SecurityNames.CORE_JACKSON_2_MODULE_CLASS_NAME;
+import static org.apache.dubbo.spring.security.utils.SecurityNames.OBJECT_MAPPER_CLASS_NAME;
import static org.apache.dubbo.spring.security.utils.SecurityNames.SECURITY_CONTEXT_HOLDER_CLASS_NAME;
-@Activate(onClass = SECURITY_CONTEXT_HOLDER_CLASS_NAME)
+@Activate(onClass = {SECURITY_CONTEXT_HOLDER_CLASS_NAME, CORE_JACKSON_2_MODULE_CLASS_NAME, OBJECT_MAPPER_CLASS_NAME})
public class SecurityScopeModelInitializer implements ScopeModelInitializer {
@Override
diff --git a/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/utils/SecurityNames.java b/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/utils/SecurityNames.java
index 010d8d4f17..97e167095b 100644
--- a/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/utils/SecurityNames.java
+++ b/dubbo-plugin/dubbo-spring-security/src/main/java/org/apache/dubbo/spring/security/utils/SecurityNames.java
@@ -22,6 +22,8 @@ final public class SecurityNames {
public static final String SECURITY_AUTHENTICATION_CONTEXT_KEY = "security_authentication_context";
public static final String SECURITY_CONTEXT_HOLDER_CLASS_NAME = "org.springframework.security.core.context.SecurityContextHolder";
+ public static final String CORE_JACKSON_2_MODULE_CLASS_NAME = "org.springframework.security.jackson2.CoreJackson2Module";
+ public static final String OBJECT_MAPPER_CLASS_NAME = "com.fasterxml.jackson.databind.ObjectMapper";
private SecurityNames() {}
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/RegistryScopeModelInitializer.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/RegistryScopeModelInitializer.java
index 6be4e29947..40c788985c 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/RegistryScopeModelInitializer.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/RegistryScopeModelInitializer.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.registry;
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
+import org.apache.dubbo.registry.integration.ExporterFactory;
import org.apache.dubbo.registry.support.RegistryManager;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.FrameworkModel;
@@ -26,7 +27,8 @@ import org.apache.dubbo.rpc.model.ScopeModelInitializer;
public class RegistryScopeModelInitializer implements ScopeModelInitializer {
@Override
public void initializeFrameworkModel(FrameworkModel frameworkModel) {
-
+ ScopeBeanFactory beanFactory = frameworkModel.getBeanFactory();
+ beanFactory.registerBean(ExporterFactory.class);
}
@Override
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceInstance.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceInstance.java
index f1546815f8..9f9aaaa860 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceInstance.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceInstance.java
@@ -103,6 +103,7 @@ public interface ServiceInstance extends Serializable {
void setApplicationModel(ApplicationModel applicationModel);
+ @Transient
ApplicationModel getApplicationModel();
@Transient
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/ExporterFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/ExporterFactory.java
new file mode 100644
index 0000000000..5eebc1bcaa
--- /dev/null
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/ExporterFactory.java
@@ -0,0 +1,42 @@
+/*
+ * 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.registry.integration;
+
+import org.apache.dubbo.rpc.Exporter;
+
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ExporterFactory {
+ private final Map> exporters = new ConcurrentHashMap<>();
+
+ protected ReferenceCountExporter> createExporter(String providerKey, Callable> exporterProducer) {
+ return exporters.computeIfAbsent(providerKey,
+ key -> {
+ try {
+ return new ReferenceCountExporter<>(exporterProducer.call(), key, this);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ });
+ }
+
+ protected void remove(String key, ReferenceCountExporter> exporter) {
+ exporters.remove(key, exporter);
+ }
+}
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/ReferenceCountExporter.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/ReferenceCountExporter.java
new file mode 100644
index 0000000000..bcdce7172f
--- /dev/null
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/ReferenceCountExporter.java
@@ -0,0 +1,62 @@
+/*
+ * 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.registry.integration;
+
+import org.apache.dubbo.rpc.Exporter;
+import org.apache.dubbo.rpc.Invoker;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class ReferenceCountExporter implements Exporter {
+ private final Exporter exporter;
+ private final String providerKey;
+ private final ExporterFactory exporterFactory;
+ private final AtomicInteger count = new AtomicInteger(0);
+
+ public ReferenceCountExporter(Exporter exporter, String providerKey, ExporterFactory exporterFactory) {
+ this.exporter = exporter;
+ this.providerKey = providerKey;
+ this.exporterFactory = exporterFactory;
+ }
+
+ @Override
+ public Invoker getInvoker() {
+ return exporter.getInvoker();
+ }
+
+ public void increaseCount() {
+ count.incrementAndGet();
+ }
+
+ @Override
+ public void unexport() {
+ if (count.decrementAndGet() == 0) {
+ exporter.unexport();
+ }
+ exporterFactory.remove(providerKey, this);
+ }
+
+ @Override
+ public void register() {
+
+ }
+
+ @Override
+ public void unregister() {
+
+ }
+}
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
index a9e3b908c7..b69376e784 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
@@ -171,6 +171,7 @@ public class RegistryProtocol implements Protocol, ScopeModelAware {
private ConcurrentMap reExportFailedTasks = new ConcurrentHashMap<>();
private HashedWheelTimer retryTimer = new HashedWheelTimer(new NamedThreadFactory("DubboReexportTimer", true), DEFAULT_REGISTRY_RETRY_PERIOD, TimeUnit.MILLISECONDS, 128);
private FrameworkModel frameworkModel;
+ private ExporterFactory exporterFactory;
//Filter the parameters that do not need to be output in url(Starting with .)
private static String[] getFilteredKeys(URL url) {
@@ -190,6 +191,7 @@ public class RegistryProtocol implements Protocol, ScopeModelAware {
@Override
public void setFrameworkModel(FrameworkModel frameworkModel) {
this.frameworkModel = frameworkModel;
+ this.exporterFactory = frameworkModel.getBeanFactory().getBean(ExporterFactory.class);
}
public void setProtocol(Protocol protocol) {
@@ -312,11 +314,13 @@ public class RegistryProtocol implements Protocol, ScopeModelAware {
private ExporterChangeableWrapper doLocalExport(final Invoker originInvoker, URL providerUrl) {
String providerUrlKey = getProviderUrlKey(originInvoker);
String registryUrlKey = getRegistryUrlKey(originInvoker);
+ Invoker> invokerDelegate = new InvokerDelegate<>(originInvoker, providerUrl);
+ ReferenceCountExporter> exporter = exporterFactory.createExporter(providerUrlKey, () -> protocol.export(invokerDelegate));
return (ExporterChangeableWrapper) bounds.computeIfAbsent(providerUrlKey, _k -> new ConcurrentHashMap<>())
- .computeIfAbsent(registryUrlKey, s ->{
- Invoker> invokerDelegate = new InvokerDelegate<>(originInvoker, providerUrl);
- return new ExporterChangeableWrapper<>((Exporter) protocol.export(invokerDelegate), originInvoker);
+ .computeIfAbsent(registryUrlKey, s -> {
+ return new ExporterChangeableWrapper<>(
+ (ReferenceCountExporter) exporter, originInvoker);
});
}
@@ -953,8 +957,9 @@ public class RegistryProtocol implements Protocol, ScopeModelAware {
private NotifyListener notifyListener;
private final AtomicBoolean registered = new AtomicBoolean(false);
- public ExporterChangeableWrapper(Exporter exporter, Invoker originInvoker) {
+ public ExporterChangeableWrapper(ReferenceCountExporter exporter, Invoker originInvoker) {
this.exporter = exporter;
+ exporter.increaseCount();
this.originInvoker = originInvoker;
FrameworkExecutorRepository frameworkExecutorRepository = originInvoker.getUrl().getOrDefaultFrameworkModel().getBeanFactory()
.getBean(FrameworkExecutorRepository.class);
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistry.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistry.java
index 3a68a26433..1ba9b330b8 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistry.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistry.java
@@ -61,12 +61,12 @@ import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;
import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
import static org.apache.dubbo.common.constants.CommonConstants.FILE_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_LOCAL_FILE_CACHE_ENABLED;
-import static org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_EMPTY_ADDRESS;
-import static org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_FAILED_NOTIFY_EVENT;
-import static org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_FAILED_DESTROY_UNREGISTER_URL;
-import static org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_FAILED_READ_WRITE_CACHE_FILE;
-import static org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_FAILED_DELETE_LOCKFILE;
import static org.apache.dubbo.common.constants.LoggerCodeConstants.INTERNAL_ERROR;
+import static org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_EMPTY_ADDRESS;
+import static org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_FAILED_DELETE_LOCKFILE;
+import static org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_FAILED_DESTROY_UNREGISTER_URL;
+import static org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_FAILED_NOTIFY_EVENT;
+import static org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_FAILED_READ_WRITE_CACHE_FILE;
import static org.apache.dubbo.common.constants.RegistryConstants.ACCEPTS_KEY;
import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_CATEGORY;
import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_KEY;
diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/RpcException.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/RpcException.java
similarity index 95%
rename from dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/RpcException.java
rename to dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/RpcException.java
index 07923c6ee5..1e994019ac 100644
--- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/RpcException.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/RpcException.java
@@ -19,7 +19,7 @@ package com.alibaba.dubbo.rpc;
@Deprecated
public class RpcException extends org.apache.dubbo.rpc.RpcException {
-
+
public RpcException() {
super();
}
@@ -51,4 +51,8 @@ public class RpcException extends org.apache.dubbo.rpc.RpcException {
public RpcException(int code, Throwable cause) {
super(code, cause);
}
+
+ public boolean isForbidded() {
+ return isForbidden();
+ }
}
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AppResponse.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AppResponse.java
index 700d49b2f7..8a2089ed20 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AppResponse.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AppResponse.java
@@ -85,6 +85,13 @@ public class AppResponse implements Result {
} catch (Exception e) {
// ignore
}
+ if ((exception instanceof RpcException) && !(exception instanceof com.alibaba.dubbo.rpc.RpcException)) {
+ com.alibaba.dubbo.rpc.RpcException recreated =
+ new com.alibaba.dubbo.rpc.RpcException(((RpcException) exception).getCode(),
+ exception.getMessage(), exception.getCause());
+ recreated.setStackTrace(exception.getStackTrace());
+ throw recreated;
+ }
throw exception;
}
return result;
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invocation.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invocation.java
index 1cb4177a90..b40fa05e8a 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invocation.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invocation.java
@@ -16,16 +16,17 @@
*/
package org.apache.dubbo.rpc;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Consumer;
-import java.util.stream.Stream;
-
import org.apache.dubbo.common.Experimental;
import org.apache.dubbo.rpc.model.ModuleModel;
import org.apache.dubbo.rpc.model.ScopeModelUtil;
import org.apache.dubbo.rpc.model.ServiceModel;
+import java.beans.Transient;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+
/**
* Invocation. (API, Prototype, NonThreadSafe)
*
@@ -148,6 +149,7 @@ public interface Invocation {
* @return invoker.
* @transient
*/
+ @Transient
Invoker> getInvoker();
void setServiceModel(ServiceModel serviceModel);
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/PathResolver.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/PathResolver.java
index c3e910a56d..83c5979cb8 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/PathResolver.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/PathResolver.java
@@ -27,7 +27,9 @@ import org.apache.dubbo.common.extension.SPI;
@SPI(value = CommonConstants.TRIPLE, scope = ExtensionScope.FRAMEWORK)
public interface PathResolver {
- void add(String path, Invoker> invoker);
+ Invoker> add(String path, Invoker> invoker);
+
+ Invoker> addIfAbsent(String path, Invoker> invoker);
Invoker> resolve(String path);
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericFilter.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericFilter.java
index 00f23815cd..8375298508 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericFilter.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericFilter.java
@@ -235,7 +235,9 @@ public class GenericFilter implements Filter, Filter.Listener, ScopeModelAware {
Throwable appException = appResponse.getException();
if (appException instanceof GenericException) {
GenericException tmp = (GenericException) appException;
- appException = new com.alibaba.dubbo.rpc.service.GenericException(tmp.getExceptionClass(), tmp.getExceptionMessage());
+ appException = new com.alibaba.dubbo.rpc.service.GenericException(tmp.getMessage(), tmp.getCause(),
+ tmp.getExceptionClass(), tmp.getExceptionMessage());
+ appException.setStackTrace(tmp.getStackTrace());
}
if (!(appException instanceof com.alibaba.dubbo.rpc.service.GenericException)) {
appException = new com.alibaba.dubbo.rpc.service.GenericException(appException);
diff --git a/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java b/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java
index 971b4f7402..70cf0b3534 100644
--- a/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java
+++ b/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java
@@ -94,7 +94,6 @@ public class InjvmInvoker extends AbstractInvoker {
if (exporter == null) {
throw new RpcException("Service [" + key + "] not found.");
}
- RpcContext.getServiceContext().setRemoteAddress(LOCALHOST_VALUE, 0);
// Solve local exposure, the server opens the token, and the client call fails.
Invoker> invoker = exporter.getInvoker();
URL serverURL = invoker.getUrl();
@@ -122,16 +121,24 @@ public class InjvmInvoker extends AbstractInvoker {
// use consumer executor
ExecutorService executor = executorRepository.createExecutorIfAbsent(ExecutorUtil.setThreadName(getUrl(), SERVER_THREAD_POOL_NAME));
CompletableFuture appResponseFuture = CompletableFuture.supplyAsync(() -> {
- Result result = invoker.invoke(copiedInvocation);
- if (result.hasException()) {
- AppResponse appResponse = new AppResponse(result.getException());
- appResponse.setObjectAttachments(new HashMap<>(result.getObjectAttachments()));
- return appResponse;
- } else {
- rebuildValue(invocation, desc, result);
- AppResponse appResponse = new AppResponse(result.getValue());
- appResponse.setObjectAttachments(new HashMap<>(result.getObjectAttachments()));
- return appResponse;
+ // clear thread local before child invocation, prevent context pollution
+ InternalThreadLocalMap originTL = InternalThreadLocalMap.getAndRemove();
+ try {
+ RpcContext.getServiceContext().setRemoteAddress(LOCALHOST_VALUE, 0);
+ RpcContext.getServiceContext().setRemoteApplicationName(getUrl().getApplication());
+ Result result = invoker.invoke(copiedInvocation);
+ if (result.hasException()) {
+ AppResponse appResponse = new AppResponse(result.getException());
+ appResponse.setObjectAttachments(new HashMap<>(result.getObjectAttachments()));
+ return appResponse;
+ } else {
+ rebuildValue(invocation, desc, result);
+ AppResponse appResponse = new AppResponse(result.getValue());
+ appResponse.setObjectAttachments(new HashMap<>(result.getObjectAttachments()));
+ return appResponse;
+ }
+ } finally {
+ InternalThreadLocalMap.set(originTL);
}
}, executor);
// save for 2.6.x compatibility, for example, TraceFilter in Zipkin uses com.alibaba.xxx.FutureAdapter
@@ -144,6 +151,8 @@ public class InjvmInvoker extends AbstractInvoker {
// clear thread local before child invocation, prevent context pollution
InternalThreadLocalMap originTL = InternalThreadLocalMap.getAndRemove();
try {
+ RpcContext.getServiceContext().setRemoteAddress(LOCALHOST_VALUE, 0);
+ RpcContext.getServiceContext().setRemoteApplicationName(getUrl().getApplication());
result = invoker.invoke(copiedInvocation);
} finally {
InternalThreadLocalMap.set(originTL);
diff --git a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/DemoService.java b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/DemoService.java
index c9d2e63d49..9a09ed9617 100644
--- a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/DemoService.java
+++ b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/DemoService.java
@@ -40,4 +40,8 @@ public interface DemoService {
Type enumlength(Type... types);
String getAsyncResult();
+
+ String getApplication();
+
+ String getRemoteAddress();
}
diff --git a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/DemoServiceImpl.java b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/DemoServiceImpl.java
index c59847b298..b4d2314a6d 100644
--- a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/DemoServiceImpl.java
+++ b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/DemoServiceImpl.java
@@ -80,4 +80,13 @@ public class DemoServiceImpl implements DemoService {
return "DONE";
}
+ @Override
+ public String getApplication() {
+ return RpcContext.getServiceContext().getRemoteApplicationName();
+ }
+
+ @Override
+ public String getRemoteAddress() {
+ return RpcContext.getServiceContext().getRemoteAddressString();
+ }
}
diff --git a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmProtocolTest.java b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmProtocolTest.java
index 5d4103a840..3ef342e8ea 100644
--- a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmProtocolTest.java
+++ b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmProtocolTest.java
@@ -19,10 +19,13 @@ package org.apache.dubbo.rpc.protocol.injvm;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.rpc.Exporter;
+import org.apache.dubbo.rpc.FutureContext;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Protocol;
import org.apache.dubbo.rpc.ProxyFactory;
+import org.apache.dubbo.rpc.RpcContext;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.FrameworkModel;
@@ -32,7 +35,9 @@ import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.concurrent.ExecutionException;
+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
@@ -129,7 +134,7 @@ class InjvmProtocolTest {
}
@Test
- void testLocalProtocolAsync() {
+ void testLocalProtocolAsync() throws ExecutionException, InterruptedException {
DemoService service = new DemoServiceImpl();
URL url = URL.valueOf("injvm://127.0.0.1/TestService")
.addParameter(ASYNC_KEY, true)
@@ -141,6 +146,39 @@ class InjvmProtocolTest {
exporters.add(exporter);
service = proxy.getProxy(protocol.refer(DemoService.class, url));
assertNull(service.getAsyncResult());
+ assertEquals("DONE", FutureContext.getContext().getCompletableFuture().get());
+ }
+
+ @Test
+ void testApplication() {
+ DemoService service = new DemoServiceImpl();
+ URL url = URL.valueOf("injvm://127.0.0.1/TestService")
+ .addParameter(INTERFACE_KEY, DemoService.class.getName()).addParameter("application", "consumer")
+ .addParameter(APPLICATION_KEY, "test-app")
+ .setScopeModel(ApplicationModel.defaultModel().getDefaultModule());
+ Invoker> invoker = proxy.getInvoker(service, DemoService.class, url);
+ assertTrue(invoker.isAvailable());
+ Exporter> exporter = protocol.export(invoker);
+ exporters.add(exporter);
+ service = proxy.getProxy(protocol.refer(DemoService.class, url));
+ assertEquals("test-app", service.getApplication());
+ assertTrue(StringUtils.isEmpty(RpcContext.getServiceContext().getRemoteApplicationName()));
+ }
+
+ @Test
+ void testRemoteAddress() {
+ DemoService service = new DemoServiceImpl();
+ URL url = URL.valueOf("injvm://127.0.0.1/TestService")
+ .addParameter(INTERFACE_KEY, DemoService.class.getName()).addParameter("application", "consumer")
+ .addParameter(APPLICATION_KEY, "test-app")
+ .setScopeModel(ApplicationModel.defaultModel().getDefaultModule());
+ Invoker> invoker = proxy.getInvoker(service, DemoService.class, url);
+ assertTrue(invoker.isAvailable());
+ Exporter> exporter = protocol.export(invoker);
+ exporters.add(exporter);
+ service = proxy.getProxy(protocol.refer(DemoService.class, url));
+ assertEquals("127.0.0.1:0", service.getRemoteAddress());
+ assertNull(RpcContext.getServiceContext().getRemoteAddress());
}
}
diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TriplePathResolver.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TriplePathResolver.java
index a508e936cf..f3f9ebbc68 100644
--- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TriplePathResolver.java
+++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TriplePathResolver.java
@@ -28,8 +28,13 @@ public class TriplePathResolver implements PathResolver {
private final ConcurrentHashMap nativeStub = new ConcurrentHashMap<>();
@Override
- public void add(String path, Invoker> invoker) {
- path2Invoker.put(path, invoker);
+ public Invoker> add(String path, Invoker> invoker) {
+ return path2Invoker.put(path, invoker);
+ }
+
+ @Override
+ public Invoker> addIfAbsent(String path, Invoker> invoker) {
+ return path2Invoker.putIfAbsent(path, invoker);
}
@Override
diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocol.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocol.java
index 49650083be..4ec09e4a56 100644
--- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocol.java
+++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocol.java
@@ -44,9 +44,9 @@ import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ExecutorService;
+import static org.apache.dubbo.config.Constants.SERVER_THREAD_POOL_NAME;
import static org.apache.dubbo.rpc.Constants.H2_IGNORE_1_0_0_KEY;
import static org.apache.dubbo.rpc.Constants.H2_RESOLVE_FALLBACK_TO_DEFAULT_KEY;
-import static org.apache.dubbo.config.Constants.SERVER_THREAD_POOL_NAME;
import static org.apache.dubbo.rpc.Constants.H2_SUPPORT_NO_LOWER_HEADER_KEY;
public class TripleProtocol extends AbstractProtocol {
@@ -65,7 +65,7 @@ public class TripleProtocol extends AbstractProtocol {
public static boolean IGNORE_1_0_0_VERSION = false;
- public static boolean RESOLVE_FALLBACK_TO_DEFAULT = false;
+ public static boolean RESOLVE_FALLBACK_TO_DEFAULT = true;
public TripleProtocol(FrameworkModel frameworkModel) {
this.frameworkModel = frameworkModel;
@@ -77,7 +77,7 @@ public class TripleProtocol extends AbstractProtocol {
IGNORE_1_0_0_VERSION = ConfigurationUtils.getEnvConfiguration(ApplicationModel.defaultModel())
.getBoolean(H2_IGNORE_1_0_0_KEY, false);
RESOLVE_FALLBACK_TO_DEFAULT = ConfigurationUtils.getEnvConfiguration(ApplicationModel.defaultModel())
- .getBoolean(H2_RESOLVE_FALLBACK_TO_DEFAULT_KEY, false);
+ .getBoolean(H2_RESOLVE_FALLBACK_TO_DEFAULT_KEY, true);
Set supported = frameworkModel.getExtensionLoader(DeCompressor.class)
.getSupportedExtensions();
this.acceptEncodings = String.join(",", supported);
@@ -113,9 +113,27 @@ public class TripleProtocol extends AbstractProtocol {
invokers.add(invoker);
- pathResolver.add(url.getServiceKey(), invoker);
+ Invoker> previous = pathResolver.add(url.getServiceKey(), invoker);
+ if (previous != null) {
+ if (url.getServiceKey().equals(url.getServiceModel().getServiceModel().getInterfaceName())) {
+ logger.info("Already exists an invoker[" + previous.getUrl() + "] on path[" + url.getServiceKey()
+ + "], dubbo will override with invoker[" + url + "]");
+ } else {
+ throw new IllegalStateException("Already exists an invoker[" + previous.getUrl() + "] on path[" +
+ url.getServiceKey() + "], failed to add invoker[" + url +
+ "] , please use unique serviceKey.");
+ }
+ }
if (RESOLVE_FALLBACK_TO_DEFAULT) {
- pathResolver.add(url.getServiceModel().getServiceModel().getInterfaceName(), invoker);
+ previous = pathResolver.addIfAbsent(url.getServiceModel().getServiceModel().getInterfaceName(), invoker);
+ if (previous != null) {
+ logger.info("Already exists an invoker[" + previous.getUrl() + "] on path[" +
+ url.getServiceModel().getServiceModel().getInterfaceName() +
+ "], dubbo will skip override with invoker[" + url + "]");
+ } else {
+ logger.info("Add fallback triple invoker[" + url + "] to path[" +
+ url.getServiceModel().getServiceModel().getInterfaceName() + "] with invoker[" + url + "]");
+ }
}
// set service status
diff --git a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/pom.xml
index e8d997bda9..b9e1369556 100644
--- a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/pom.xml
+++ b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/pom.xml
@@ -137,12 +137,6 @@
${project.version}
true
-
- org.apache.dubbo
- dubbo-config-spring
- ${project.version}
- true
-
diff --git a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/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
index 10ffaa9be1..37f552fadf 100644
--- a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/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
@@ -18,7 +18,6 @@ package org.apache.dubbo.spring.boot.observability.autoconfigure;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
-import org.apache.dubbo.config.spring.context.event.DubboConfigInitEvent;
import org.apache.dubbo.qos.protocol.QosProtocolWrapper;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.spring.boot.observability.autoconfigure.annotation.ConditionalOnDubboTracingEnable;
@@ -29,15 +28,14 @@ import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
-import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.core.Ordered;
import java.util.Arrays;
@@ -48,7 +46,7 @@ import java.util.Arrays;
@AutoConfiguration(after = DubboMicrometerTracingAutoConfiguration.class, afterName = "org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration")
@ConditionalOnDubboTracingEnable
@ConditionalOnClass(name = {"io.micrometer.observation.Observation", "io.micrometer.tracing.Tracer"})
-public class DubboObservationAutoConfiguration implements BeanFactoryAware, ApplicationListener, Ordered {
+public class DubboObservationAutoConfiguration implements BeanFactoryAware, SmartInitializingSingleton {
private final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(QosProtocolWrapper.class);
@@ -81,21 +79,16 @@ public class DubboObservationAutoConfiguration implements BeanFactoryAware, Appl
}
@Override
- public void onApplicationEvent(DubboConfigInitEvent event) {
+ public void afterSingletonsInstantiated() {
try {
applicationModel.getBeanFactory().registerBean(beanFactory.getBean(io.micrometer.observation.ObservationRegistry.class));
- applicationModel.getBeanFactory().registerBean(beanFactory.getBean(io.micrometer.tracing.Tracer.class));
- applicationModel.getBeanFactory().registerBean(beanFactory.getBean(io.micrometer.tracing.propagation.Propagator.class));
+ io.micrometer.tracing.Tracer bean = beanFactory.getBean(io.micrometer.tracing.Tracer.class);
+ applicationModel.getBeanFactory().registerBean(bean);
} catch (NoSuchBeanDefinitionException e) {
- logger.info("Please use a version of micrometer higher than 1.10.0: " + e.getMessage());
+ logger.info("Please use a version of micrometer higher than 1.10.0 :{}" + e.getMessage());
}
}
- @Override
- public int getOrder() {
- return HIGHEST_PRECEDENCE;
- }
-
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(MeterRegistry.class)
@ConditionalOnMissingClass("io.micrometer.tracing.Tracer")
diff --git a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/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
index 8894b890cb..24be95c4ec 100644
--- a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/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
@@ -16,7 +16,8 @@
*/
package org.apache.dubbo.spring.boot.observability.autoconfigure.brave;
-import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.rpc.model.ModuleModel;
import org.apache.dubbo.spring.boot.autoconfigure.DubboConfigurationProperties;
import org.apache.dubbo.spring.boot.observability.autoconfigure.DubboMicrometerTracingAutoConfiguration;
import org.apache.dubbo.spring.boot.observability.autoconfigure.ObservabilityUtils;
@@ -52,12 +53,12 @@ public class BraveAutoConfiguration {
/**
* Default value for application name if {@code spring.application.name} is not set.
*/
- private static final String DEFAULT_APPLICATION_NAME = "dubbo-application";
+ private static final String DEFAULT_APPLICATION_NAME = "application";
- private final DubboConfigurationProperties dubboConfigProperties;
+ private final ModuleModel moduleModel;
- public BraveAutoConfiguration(DubboConfigurationProperties dubboConfigProperties) {
- this.dubboConfigProperties = dubboConfigProperties;
+ public BraveAutoConfiguration(ModuleModel moduleModel) {
+ this.moduleModel = moduleModel;
}
@Bean
@@ -75,10 +76,9 @@ public class BraveAutoConfiguration {
public brave.Tracing braveTracing(List spanHandlers,
List tracingCustomizers, brave.propagation.CurrentTraceContext currentTraceContext,
brave.propagation.Propagation.Factory propagationFactory, brave.sampler.Sampler sampler) {
- String applicationName = dubboConfigProperties.getApplication().getName();
- if (StringUtils.isEmpty(applicationName)) {
- applicationName = DEFAULT_APPLICATION_NAME;
- }
+ String applicationName = moduleModel.getApplicationModel().getApplicationConfigManager().getApplication()
+ .map(ApplicationConfig::getName)
+ .orElse(DEFAULT_APPLICATION_NAME);
brave.Tracing.Builder builder = brave.Tracing.newBuilder().currentTraceContext(currentTraceContext).traceId128Bit(true)
.supportsJoin(false).propagationFactory(propagationFactory).sampler(sampler)
.localServiceName(applicationName);
diff --git a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/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
index 6b4e38f7c9..85babb77f8 100644
--- a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/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
@@ -18,7 +18,8 @@ package org.apache.dubbo.spring.boot.observability.autoconfigure.otel;
import org.apache.dubbo.common.Version;
-import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.rpc.model.ModuleModel;
import org.apache.dubbo.spring.boot.autoconfigure.DubboConfigurationProperties;
import org.apache.dubbo.spring.boot.observability.autoconfigure.DubboMicrometerTracingAutoConfiguration;
import org.apache.dubbo.spring.boot.observability.autoconfigure.ObservabilityUtils;
@@ -51,12 +52,15 @@ public class OpenTelemetryAutoConfiguration {
/**
* Default value for application name if {@code spring.application.name} is not set.
*/
- private static final String DEFAULT_APPLICATION_NAME = "dubbo-application";
+ private static final String DEFAULT_APPLICATION_NAME = "application";
private final DubboConfigurationProperties dubboConfigProperties;
- OpenTelemetryAutoConfiguration(DubboConfigurationProperties dubboConfigProperties) {
+ private final ModuleModel moduleModel;
+
+ OpenTelemetryAutoConfiguration(DubboConfigurationProperties dubboConfigProperties, ModuleModel moduleModel) {
this.dubboConfigProperties = dubboConfigProperties;
+ this.moduleModel = moduleModel;
}
@Bean
@@ -70,10 +74,9 @@ public class OpenTelemetryAutoConfiguration {
@ConditionalOnMissingBean
io.opentelemetry.sdk.trace.SdkTracerProvider otelSdkTracerProvider(ObjectProvider spanProcessors,
io.opentelemetry.sdk.trace.samplers.Sampler sampler) {
- String applicationName = dubboConfigProperties.getApplication().getName();
- if (StringUtils.isEmpty(applicationName)) {
- applicationName = DEFAULT_APPLICATION_NAME;
- }
+ String applicationName = moduleModel.getApplicationModel().getApplicationConfigManager().getApplication()
+ .map(ApplicationConfig::getName)
+ .orElse(DEFAULT_APPLICATION_NAME);
io.opentelemetry.sdk.trace.SdkTracerProviderBuilder builder = io.opentelemetry.sdk.trace.SdkTracerProvider.builder().setSampler(sampler)
.setResource(io.opentelemetry.sdk.resources.Resource.create(io.opentelemetry.api.common.Attributes.of(io.opentelemetry.semconv.resource.attributes.ResourceAttributes.SERVICE_NAME, applicationName)));
spanProcessors.orderedStream().forEach(builder::addSpanProcessor);
diff --git a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/pom.xml b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/pom.xml
index 17343de508..77065023c9 100644
--- a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/pom.xml
+++ b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/pom.xml
@@ -38,8 +38,8 @@
- 1.11.0
- 1.1.1
+ 1.11.1
+ 1.1.2
1.27.0
2.16.4
0.16.0
diff --git a/dubbo-test/dubbo-dependencies-all/pom.xml b/dubbo-test/dubbo-dependencies-all/pom.xml
index 991154acbb..526743f360 100644
--- a/dubbo-test/dubbo-dependencies-all/pom.xml
+++ b/dubbo-test/dubbo-dependencies-all/pom.xml
@@ -193,11 +193,6 @@
dubbo-metrics-prometheus
${project.version}
-
- org.apache.dubbo
- dubbo-tracing
- ${project.version}
-
@@ -210,6 +205,7 @@
dubbo-monitor-default
${project.version}
+
org.apache.dubbo