You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by ky...@apache.org on 2021/12/17 06:32:41 UTC
[dubbo] branch 3.0 updated: dubbo-spring-boot-actuator compatible with Spring Boot Actuator 2.6.x (#9394) (#9426)
This is an automated email from the ASF dual-hosted git repository.
kylixs pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.0 by this push:
new 9492880 dubbo-spring-boot-actuator compatible with Spring Boot Actuator 2.6.x (#9394) (#9426)
9492880 is described below
commit 9492880d2687b1005fad40a3da53c15a608265ff
Author: gitchenjh <84...@qq.com>
AuthorDate: Fri Dec 17 14:32:24 2021 +0800
dubbo-spring-boot-actuator compatible with Spring Boot Actuator 2.6.x (#9394) (#9426)
---
.../dubbo-spring-boot-actuator/README.md | 2 +-
.../DubboEndpointAnnotationAutoConfiguration.java | 7 +++
.../CompatibleOnEnabledEndpointCondition.java | 51 +++++++++++-----------
3 files changed, 33 insertions(+), 27 deletions(-)
diff --git a/dubbo-spring-boot/dubbo-spring-boot-actuator/README.md b/dubbo-spring-boot/dubbo-spring-boot-actuator/README.md
index b501b9c..8b2f080 100644
--- a/dubbo-spring-boot/dubbo-spring-boot-actuator/README.md
+++ b/dubbo-spring-boot/dubbo-spring-boot-actuator/README.md
@@ -150,7 +150,7 @@ Actuator endpoint `dubbo` supports Actuator Endpoints :
| ------------------- | ----------- | ----------------------------------- | ------------------ | ------------------ | ------------------ |
| `dubbo` | `true` | `/actuator/dubbo` | `GET` | Exposes Dubbo's meta data | `application/json` |
| `dubboproperties` | `true` | `/actuator/dubbo/properties` | `GET` | Exposes all Dubbo's Properties | `application/json` |
-| `dubboservices` | `false` | `/dubbo/services` | `GET` | Exposes all Dubbo's `ServiceBean` | `application/json` |
+| `dubboservices` | `false` | `/actuator/dubbo/services` | `GET` | Exposes all Dubbo's `ServiceBean` | `application/json` |
| `dubboreferences` | `false` | `/actuator/dubbo/references` | `GET` | Exposes all Dubbo's `ReferenceBean` | `application/json` |
| `dubboconfigs` | `true` | `/actuator/dubbo/configs` | `GET` | Exposes all Dubbo's `*Config` | `application/json` |
| `dubboshutdown` | `false` | `/actuator/dubbo/shutdown` | `POST` | Shutdown Dubbo services | `application/json` |
diff --git a/dubbo-spring-boot/dubbo-spring-boot-actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/autoconfigure/DubboEndpointAnnotationAutoConfiguration.java b/dubbo-spring-boot/dubbo-spring-boot-actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/autoconfigure/DubboEndpointAnnotationAutoConfiguration.java
index 6db22db..c1e66cd 100644
--- a/dubbo-spring-boot/dubbo-spring-boot-actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/autoconfigure/DubboEndpointAnnotationAutoConfiguration.java
+++ b/dubbo-spring-boot/dubbo-spring-boot-actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/autoconfigure/DubboEndpointAnnotationAutoConfiguration.java
@@ -24,6 +24,7 @@ import org.apache.dubbo.spring.boot.actuate.endpoint.DubboServicesMetadataEndpoi
import org.apache.dubbo.spring.boot.actuate.endpoint.DubboShutdownEndpoint;
import org.apache.dubbo.spring.boot.actuate.endpoint.condition.CompatibleConditionalOnEnabledEndpoint;
+import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
@@ -45,6 +46,7 @@ public class DubboEndpointAnnotationAutoConfiguration {
@Bean
@ConditionalOnMissingBean
+ @ConditionalOnAvailableEndpoint
@CompatibleConditionalOnEnabledEndpoint
public DubboMetadataEndpoint dubboEndpoint() {
return new DubboMetadataEndpoint();
@@ -52,6 +54,7 @@ public class DubboEndpointAnnotationAutoConfiguration {
@Bean
@ConditionalOnMissingBean
+ @ConditionalOnAvailableEndpoint
@CompatibleConditionalOnEnabledEndpoint
public DubboConfigsMetadataEndpoint dubboConfigsMetadataEndpoint() {
return new DubboConfigsMetadataEndpoint();
@@ -59,6 +62,7 @@ public class DubboEndpointAnnotationAutoConfiguration {
@Bean
@ConditionalOnMissingBean
+ @ConditionalOnAvailableEndpoint
@CompatibleConditionalOnEnabledEndpoint
public DubboPropertiesMetadataEndpoint dubboPropertiesEndpoint() {
return new DubboPropertiesMetadataEndpoint();
@@ -66,6 +70,7 @@ public class DubboEndpointAnnotationAutoConfiguration {
@Bean
@ConditionalOnMissingBean
+ @ConditionalOnAvailableEndpoint
@CompatibleConditionalOnEnabledEndpoint
public DubboReferencesMetadataEndpoint dubboReferencesMetadataEndpoint() {
return new DubboReferencesMetadataEndpoint();
@@ -73,6 +78,7 @@ public class DubboEndpointAnnotationAutoConfiguration {
@Bean
@ConditionalOnMissingBean
+ @ConditionalOnAvailableEndpoint
@CompatibleConditionalOnEnabledEndpoint
public DubboServicesMetadataEndpoint dubboServicesMetadataEndpoint() {
return new DubboServicesMetadataEndpoint();
@@ -80,6 +86,7 @@ public class DubboEndpointAnnotationAutoConfiguration {
@Bean
@ConditionalOnMissingBean
+ @ConditionalOnAvailableEndpoint
@CompatibleConditionalOnEnabledEndpoint
public DubboShutdownEndpoint dubboShutdownEndpoint() {
return new DubboShutdownEndpoint();
diff --git a/dubbo-spring-boot/dubbo-spring-boot-actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/endpoint/condition/CompatibleOnEnabledEndpointCondition.java b/dubbo-spring-boot/dubbo-spring-boot-actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/endpoint/condition/CompatibleOnEnabledEndpointCondition.java
index ebac25e..15caada 100644
--- a/dubbo-spring-boot/dubbo-spring-boot-actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/endpoint/condition/CompatibleOnEnabledEndpointCondition.java
+++ b/dubbo-spring-boot/dubbo-spring-boot-actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/endpoint/condition/CompatibleOnEnabledEndpointCondition.java
@@ -16,6 +16,9 @@
*/
package org.apache.dubbo.spring.boot.actuate.endpoint.condition;
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
@@ -23,8 +26,6 @@ import org.springframework.context.annotation.Conditional;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.ClassUtils;
-import java.util.stream.Stream;
-
/**
* {@link Conditional} that checks whether or not an endpoint is enabled, which is compatible with
* org.springframework.boot.actuate.autoconfigure.endpoint.condition.OnEnabledEndpointCondition
@@ -35,35 +36,33 @@ import java.util.stream.Stream;
*/
class CompatibleOnEnabledEndpointCondition implements Condition {
- static String[] CONDITION_CLASS_NAMES = {
- "org.springframework.boot.actuate.autoconfigure.endpoint.condition.OnAvailableEndpointCondition", // 2.2.0+
- "org.springframework.boot.actuate.autoconfigure.endpoint.condition.OnEnabledEndpointCondition" // [2.0.0 , 2.2.x]
- };
+ private static final Logger LOGGER = LoggerFactory.getLogger(CompatibleOnEnabledEndpointCondition.class);
+
+ // Spring Boot [2.0.0 , 2.2.x]
+ static String CONDITION_CLASS_NAME_OLD =
+ "org.springframework.boot.actuate.autoconfigure.endpoint.condition.OnEnabledEndpointCondition";
+
+ // Spring Boot 2.2.0 +
+ static String CONDITION_CLASS_NAME_NEW =
+ "org.springframework.boot.actuate.autoconfigure.endpoint.condition.OnAvailableEndpointCondition";
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
ClassLoader classLoader = context.getClassLoader();
-
- Condition condition = Stream.of(CONDITION_CLASS_NAMES) // Iterate class names
- .filter(className -> ClassUtils.isPresent(className, classLoader)) // Search class existing or not by name
- .findFirst() // Find the first candidate
- .map(className -> ClassUtils.resolveClassName(className, classLoader)) // Resolve class name to Class
- .filter(Condition.class::isAssignableFrom) // Accept the Condition implementation
- .map(BeanUtils::instantiateClass) // Instantiate Class to be instance
- .map(Condition.class::cast) // Cast the instance to be Condition one
- .orElse(NegativeCondition.INSTANCE); // Or else get a negative condition
-
- return condition.matches(context, metadata);
- }
-
- private static class NegativeCondition implements Condition {
-
- static final NegativeCondition INSTANCE = new NegativeCondition();
-
- @Override
- public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
- return false;
+ if (ClassUtils.isPresent(CONDITION_CLASS_NAME_OLD, classLoader)) {
+ Class<?> cls = ClassUtils.resolveClassName(CONDITION_CLASS_NAME_OLD, classLoader);
+ if (Condition.class.isAssignableFrom(cls)) {
+ Condition condition = Condition.class.cast(BeanUtils.instantiateClass(cls));
+ return condition.matches(context, metadata);
+ }
+ }
+ // Check by org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint
+ if (ClassUtils.isPresent(CONDITION_CLASS_NAME_NEW, classLoader)) {
+ return true;
}
+ // No condition class found
+ LOGGER.warn(String.format("No condition class found, Dubbo Health Endpoint [%s] will not expose", metadata));
+ return false;
}
}