Skip to content

Commit 63e714a

Browse files
authored
dubbo-spring-boot-actuator compatible with Spring Boot Actuator 2.6.x (#9394) (#9437)
1 parent daeeeb7 commit 63e714a

3 files changed

Lines changed: 33 additions & 27 deletions

File tree

dubbo-spring-boot/dubbo-spring-boot-actuator/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ Actuator endpoint `dubbo` supports Actuator Endpoints :
150150
| ------------------- | ----------- | ----------------------------------- | ------------------ | ------------------ | ------------------ |
151151
| `dubbo` | `true` | `/actuator/dubbo` | `GET` | Exposes Dubbo's meta data | `application/json` |
152152
| `dubboproperties` | `true` | `/actuator/dubbo/properties` | `GET` | Exposes all Dubbo's Properties | `application/json` |
153-
| `dubboservices` | `false` | `/dubbo/services` | `GET` | Exposes all Dubbo's `ServiceBean` | `application/json` |
153+
| `dubboservices` | `false` | `/actuator/dubbo/services` | `GET` | Exposes all Dubbo's `ServiceBean` | `application/json` |
154154
| `dubboreferences` | `false` | `/actuator/dubbo/references` | `GET` | Exposes all Dubbo's `ReferenceBean` | `application/json` |
155155
| `dubboconfigs` | `true` | `/actuator/dubbo/configs` | `GET` | Exposes all Dubbo's `*Config` | `application/json` |
156156
| `dubboshutdown` | `false` | `/actuator/dubbo/shutdown` | `POST` | Shutdown Dubbo services | `application/json` |

dubbo-spring-boot/dubbo-spring-boot-actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/autoconfigure/DubboEndpointAnnotationAutoConfiguration.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.apache.dubbo.spring.boot.actuate.endpoint.DubboShutdownEndpoint;
2525
import org.apache.dubbo.spring.boot.actuate.endpoint.condition.CompatibleConditionalOnEnabledEndpoint;
2626

27+
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
2728
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
2829
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2930
import org.springframework.context.annotation.Bean;
@@ -45,41 +46,47 @@ public class DubboEndpointAnnotationAutoConfiguration {
4546

4647
@Bean
4748
@ConditionalOnMissingBean
49+
@ConditionalOnAvailableEndpoint
4850
@CompatibleConditionalOnEnabledEndpoint
4951
public DubboMetadataEndpoint dubboEndpoint() {
5052
return new DubboMetadataEndpoint();
5153
}
5254

5355
@Bean
5456
@ConditionalOnMissingBean
57+
@ConditionalOnAvailableEndpoint
5558
@CompatibleConditionalOnEnabledEndpoint
5659
public DubboConfigsMetadataEndpoint dubboConfigsMetadataEndpoint() {
5760
return new DubboConfigsMetadataEndpoint();
5861
}
5962

6063
@Bean
6164
@ConditionalOnMissingBean
65+
@ConditionalOnAvailableEndpoint
6266
@CompatibleConditionalOnEnabledEndpoint
6367
public DubboPropertiesMetadataEndpoint dubboPropertiesEndpoint() {
6468
return new DubboPropertiesMetadataEndpoint();
6569
}
6670

6771
@Bean
6872
@ConditionalOnMissingBean
73+
@ConditionalOnAvailableEndpoint
6974
@CompatibleConditionalOnEnabledEndpoint
7075
public DubboReferencesMetadataEndpoint dubboReferencesMetadataEndpoint() {
7176
return new DubboReferencesMetadataEndpoint();
7277
}
7378

7479
@Bean
7580
@ConditionalOnMissingBean
81+
@ConditionalOnAvailableEndpoint
7682
@CompatibleConditionalOnEnabledEndpoint
7783
public DubboServicesMetadataEndpoint dubboServicesMetadataEndpoint() {
7884
return new DubboServicesMetadataEndpoint();
7985
}
8086

8187
@Bean
8288
@ConditionalOnMissingBean
89+
@ConditionalOnAvailableEndpoint
8390
@CompatibleConditionalOnEnabledEndpoint
8491
public DubboShutdownEndpoint dubboShutdownEndpoint() {
8592
return new DubboShutdownEndpoint();

dubbo-spring-boot/dubbo-spring-boot-actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/endpoint/condition/CompatibleOnEnabledEndpointCondition.java

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@
1616
*/
1717
package org.apache.dubbo.spring.boot.actuate.endpoint.condition;
1818

19+
import org.apache.dubbo.common.logger.Logger;
20+
import org.apache.dubbo.common.logger.LoggerFactory;
21+
1922
import org.springframework.beans.BeanUtils;
2023
import org.springframework.context.annotation.Condition;
2124
import org.springframework.context.annotation.ConditionContext;
2225
import org.springframework.context.annotation.Conditional;
2326
import org.springframework.core.type.AnnotatedTypeMetadata;
2427
import org.springframework.util.ClassUtils;
2528

26-
import java.util.stream.Stream;
27-
2829
/**
2930
* {@link Conditional} that checks whether or not an endpoint is enabled, which is compatible with
3031
* org.springframework.boot.actuate.autoconfigure.endpoint.condition.OnEnabledEndpointCondition
@@ -35,35 +36,33 @@
3536
*/
3637
class CompatibleOnEnabledEndpointCondition implements Condition {
3738

38-
static String[] CONDITION_CLASS_NAMES = {
39-
"org.springframework.boot.actuate.autoconfigure.endpoint.condition.OnAvailableEndpointCondition", // 2.2.0+
40-
"org.springframework.boot.actuate.autoconfigure.endpoint.condition.OnEnabledEndpointCondition" // [2.0.0 , 2.2.x]
41-
};
39+
private static final Logger LOGGER = LoggerFactory.getLogger(CompatibleOnEnabledEndpointCondition.class);
40+
41+
// Spring Boot [2.0.0 , 2.2.x]
42+
static String CONDITION_CLASS_NAME_OLD =
43+
"org.springframework.boot.actuate.autoconfigure.endpoint.condition.OnEnabledEndpointCondition";
44+
45+
// Spring Boot 2.2.0 +
46+
static String CONDITION_CLASS_NAME_NEW =
47+
"org.springframework.boot.actuate.autoconfigure.endpoint.condition.OnAvailableEndpointCondition";
4248

4349

4450
@Override
4551
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
4652
ClassLoader classLoader = context.getClassLoader();
47-
48-
Condition condition = Stream.of(CONDITION_CLASS_NAMES) // Iterate class names
49-
.filter(className -> ClassUtils.isPresent(className, classLoader)) // Search class existing or not by name
50-
.findFirst() // Find the first candidate
51-
.map(className -> ClassUtils.resolveClassName(className, classLoader)) // Resolve class name to Class
52-
.filter(Condition.class::isAssignableFrom) // Accept the Condition implementation
53-
.map(BeanUtils::instantiateClass) // Instantiate Class to be instance
54-
.map(Condition.class::cast) // Cast the instance to be Condition one
55-
.orElse(NegativeCondition.INSTANCE); // Or else get a negative condition
56-
57-
return condition.matches(context, metadata);
58-
}
59-
60-
private static class NegativeCondition implements Condition {
61-
62-
static final NegativeCondition INSTANCE = new NegativeCondition();
63-
64-
@Override
65-
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
66-
return false;
53+
if (ClassUtils.isPresent(CONDITION_CLASS_NAME_OLD, classLoader)) {
54+
Class<?> cls = ClassUtils.resolveClassName(CONDITION_CLASS_NAME_OLD, classLoader);
55+
if (Condition.class.isAssignableFrom(cls)) {
56+
Condition condition = Condition.class.cast(BeanUtils.instantiateClass(cls));
57+
return condition.matches(context, metadata);
58+
}
59+
}
60+
// Check by org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint
61+
if (ClassUtils.isPresent(CONDITION_CLASS_NAME_NEW, classLoader)) {
62+
return true;
6763
}
64+
// No condition class found
65+
LOGGER.warn(String.format("No condition class found, Dubbo Health Endpoint [%s] will not expose", metadata));
66+
return false;
6867
}
6968
}

0 commit comments

Comments
 (0)