自定义springboot actuator endpoint及原理解析

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的源码分析。

 

你可能感兴趣的:(java,spring,boot,java,spring)