springboot actuator是springboot官方提供的系统信息探测器,用于获取系统状态和业务监控等信息。springboot admin封装了springboot actuator,常用于业务系统的可视化监控管理及报警。
springboot actuator endpoint是使用spring mvc通过http方式对外提供服务的web端点,官方提供了有HealthEndpoint、InfoEndpoint等web端点,来提供系统的健康状态或其他系统信息。当需要自己的endpoint时,该如何设计呢。
- 自定义springboot actuator endpoint
主要需要@Endpoint、@Component、@ReadOperation、@Selector四个注解即可搞定,代码示例如下:
@Endpoint(id = "customPoint")
@Component
public class CustomEndPoint {
@ReadOperation
public String getCustom(@Selector String name) {
return "MyName is ." + name;
}
}
自定义endpoint如此简单,那它是如何被springboot识别,并转换成spring mvc的web接口的呢。
- 原理解析
springboot最强大的功能即自动装配,它可以主动去发现endpoint,首先看下HealthEndpoint的自动装配及解析过程,spring-boot-starter-actuator是官方提供的starter,包含spring-boot-actuator-autoconfigure和actuator本身逻辑两部分,其中autoconfigure中spring.factories中配置了诸多自动配置类,这些类在springboot启动时,都会因为starter机制,而被实例化,这里也正是actuator被启动的开端,其中就包括HealthEndpointAutoConfiguration,该类在被实例化前会因@Import注解先实例化HealthEndpointConfiguration,接着即创建HealthEndpoint,并将该实例加入spring容器,源码如下:
@Configuration
@EnableConfigurationProperties({ HealthEndpointProperties.class, HealthIndicatorProperties.class })
@AutoConfigureAfter(HealthIndicatorAutoConfiguration.class)
@Import({ HealthEndpointConfiguration.class, HealthEndpointWebExtensionConfiguration.class })
public class HealthEndpointAutoConfiguration {
}
@Configuration
class HealthEndpointConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint
public HealthEndpoint healthEndpoint(ApplicationContext applicationContext) {
return new HealthEndpoint(HealthIndicatorBeansComposite.get(applicationContext));
}
}
到此,相关endpoint即被实例化和加入spring容器中了,那么自定义的endpoint并没有自动装配机制,它是如何被加入spring容器中的呢,自定义自动装配也行,@Component也能搞定,接下即为转换为web端点的过程:
WebEndpointAutoConfiguration自动配置类会创建bean:WebEndpointDiscoverer、PathMappedEndpoints,其中pathMappedEndpoint会调用WebEndpointDiscoverer中的getEndpoints来初始化WebEndpointDiscoverer中的endpoint集合,核心代码即为从spring容器中获取包含@Endpoint注解的类,代码如下:
String[] beanNames = BeanFactoryUtils.beanNamesForAnnotationIncludingAncestors(this.applicationContext, Endpoint.class);
这样WebEndpointDiscoverer即找到了所有的endpoint,WebMvcEndpointManagementContextConfiguration自动装配类会创建WebMvcEndpointHandlerMapping实例,从该类的类图可以看到其最终实现了InitializingBean接口,该接口为springboot的功能扩展点,即在类的属性设置之后,会回调afterPropertiesSet方法,该方法的逻辑即为转换为web接口的过程,具体逻辑可参考spring web的源码分析。