平台网站建设教程,怎么在网上卖东西,南京企业网站建设,设计素材网站千图网文章目录 一、认识Actuator1、回顾Actuator2、Actuator重要端点 二、源码分析1、Endpoint自动装配#xff08;1#xff09;自动配置入口#xff08;2#xff09;普通Endpoint自动装配#xff08;3#xff09;配置Web - Endpoint#xff08;4#xff09;注册Endpoint为M… 文章目录 一、认识Actuator1、回顾Actuator2、Actuator重要端点 二、源码分析1、Endpoint自动装配1自动配置入口2普通Endpoint自动装配3配置Web - Endpoint4注册Endpoint为Mvc映射 2、BeansEndpoint自动装配原理1自动装配类2BeansEndpoint3执行结果 3、MappingsEndpoint自动装配原理1自动装配类2MappingsEndpoint3执行结果 4、ShutdownEndpoint自动装配原理1自动装配类2ShutdownEndpoint 一、认识Actuator
1、回顾Actuator
Actuator是Springboot提供运行时数据交互的规范。 它覆盖应用内心戏、环境配置、度量指标、敏感操作。 交互方式为Http Web或者JMX。
Spring Boot Actuator ——健康检查神器
2、Actuator重要端点 二、源码分析
1、Endpoint自动装配
1自动配置入口 2普通Endpoint自动装配
AutoConfiguration
ConditionalOnAvailableEndpoint(endpoint EnvironmentEndpoint.class) // EnvironmentEndpoint可用
EnableConfigurationProperties(EnvironmentEndpointProperties.class)// 构建属性配置文件
public class EnvironmentEndpointAutoConfiguration {BeanConditionalOnMissingBeanpublic EnvironmentEndpoint environmentEndpoint(Environment environment, EnvironmentEndpointProperties properties,ObjectProviderSanitizingFunction sanitizingFunctions) {EnvironmentEndpoint endpoint new EnvironmentEndpoint(environment,sanitizingFunctions.orderedStream().collect(Collectors.toList()));String[] keysToSanitize properties.getKeysToSanitize();if (keysToSanitize ! null) {endpoint.setKeysToSanitize(keysToSanitize);}String[] additionalKeysToSanitize properties.getAdditionalKeysToSanitize();if (additionalKeysToSanitize ! null) {endpoint.keysToSanitize(additionalKeysToSanitize);}return endpoint;}BeanConditionalOnMissingBeanConditionalOnBean(EnvironmentEndpoint.class)ConditionalOnAvailableEndpoint(exposure { EndpointExposure.WEB, EndpointExposure.CLOUD_FOUNDRY })public EnvironmentEndpointWebExtension environmentEndpointWebExtension(EnvironmentEndpoint environmentEndpoint) {return new EnvironmentEndpointWebExtension(environmentEndpoint);}}3配置Web - Endpoint
通过自动配置类WebEndpointAutoConfiguration进行自动装配。 // org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration#webEndpointDiscoverer
Bean
ConditionalOnMissingBean(WebEndpointsSupplier.class)
public WebEndpointDiscoverer webEndpointDiscoverer(ParameterValueMapper parameterValueMapper,EndpointMediaTypes endpointMediaTypes, ObjectProviderPathMapper endpointPathMappers,ObjectProviderOperationInvokerAdvisor invokerAdvisors,ObjectProviderEndpointFilterExposableWebEndpoint filters) {// 把所有的Web - Endpoint都搜集到return new WebEndpointDiscoverer(this.applicationContext, parameterValueMapper, endpointMediaTypes,endpointPathMappers.orderedStream().collect(Collectors.toList()),invokerAdvisors.orderedStream().collect(Collectors.toList()),filters.orderedStream().collect(Collectors.toList()));
}4注册Endpoint为Mvc映射
通过自动配置类WebMvcEndpointManagementContextConfiguration注册Endpoint为Mvc映射。
通过各种方式定义的Endpoint创建为WebMvcEndpointHandlerMapping进行Web映射。
// org.springframework.boot.actuate.autoconfigure.endpoint.web.servlet.WebMvcEndpointManagementContextConfiguration#webEndpointServletHandlerMapping
Bean
ConditionalOnMissingBean
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier,EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,WebEndpointProperties webEndpointProperties, Environment environment) {ListExposableEndpoint? allEndpoints new ArrayList();CollectionExposableWebEndpoint webEndpoints webEndpointsSupplier.getEndpoints();allEndpoints.addAll(webEndpoints);allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());String basePath webEndpointProperties.getBasePath();EndpointMapping endpointMapping new EndpointMapping(basePath);boolean shouldRegisterLinksMapping shouldRegisterLinksMapping(webEndpointProperties, environment, basePath);return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes,corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath),shouldRegisterLinksMapping, WebMvcAutoConfiguration.pathPatternParser);
}2、BeansEndpoint自动装配原理
1自动装配类
AutoConfiguration
ConditionalOnAvailableEndpoint(endpoint BeansEndpoint.class)
public class BeansEndpointAutoConfiguration {BeanConditionalOnMissingBeanpublic BeansEndpoint beansEndpoint(ConfigurableApplicationContext applicationContext) {// 创建一个BeansEndpointreturn new BeansEndpoint(applicationContext);}}2BeansEndpoint
// id就是可以访问的web路径
Endpoint(id beans)
public class BeansEndpoint {// 读操作
ReadOperation
public ApplicationBeans beans() {MapString, ContextBeans contexts new HashMap();// 将所有容器都拿出来ConfigurableApplicationContext context this.context;while (context ! null) {// 将Bean都拿出来封装成一个ContextBeanscontexts.put(context.getId(), ContextBeans.describing(context));context getConfigurableParent(context);}// 创建一个ApplicationBeans// 返回的信息就会json格式化到响应return new ApplicationBeans(contexts);
}// 返回的对象
public static final class ApplicationBeans {private final MapString, ContextBeans contexts;private ApplicationBeans(MapString, ContextBeans contexts) {this.contexts contexts;}public MapString, ContextBeans getContexts() {return this.contexts;}}3执行结果 3、MappingsEndpoint自动装配原理
1自动装配类
AutoConfiguration
ConditionalOnAvailableEndpoint(endpoint MappingsEndpoint.class)
public class MappingsEndpointAutoConfiguration {// 配置MappingBeanpublic MappingsEndpoint mappingsEndpoint(ApplicationContext applicationContext,ObjectProviderMappingDescriptionProvider descriptionProviders) {return new MappingsEndpoint(descriptionProviders.orderedStream().collect(Collectors.toList()),applicationContext);}// 后面还有关于Servlet的相关配置此处就先不看2MappingsEndpoint
// web访问路径
Endpoint(id mappings)
public class MappingsEndpoint {// org.springframework.boot.actuate.web.mappings.MappingsEndpoint#mappings
ReadOperation
public ApplicationMappings mappings() {ApplicationContext target this.context;MapString, ContextMappings contextMappings new HashMap();while (target ! null) {// 查找所有的MappingcontextMappings.put(target.getId(), mappingsForContext(target));target target.getParent();}return new ApplicationMappings(contextMappings);// 返回的信息就会json格式化到响应
}// org.springframework.boot.actuate.web.mappings.MappingsEndpoint#mappingsForContext
private ContextMappings mappingsForContext(ApplicationContext applicationContext) {MapString, Object mappings new HashMap();this.descriptionProviders.forEach((provider) - mappings.put(provider.getMappingName(), provider.describeMappings(applicationContext)));return new ContextMappings(mappings,(applicationContext.getParent() ! null) ? applicationContext.getId() : null);
} 3执行结果 4、ShutdownEndpoint自动装配原理
1自动装配类
AutoConfiguration
ConditionalOnAvailableEndpoint(endpoint ShutdownEndpoint.class)
public class ShutdownEndpointAutoConfiguration {Bean(destroyMethod )ConditionalOnMissingBeanpublic ShutdownEndpoint shutdownEndpoint() {return new ShutdownEndpoint();}}2ShutdownEndpoint
// 默认是不开启的因为安全性要求极高
Endpoint(id shutdown, enableByDefault false)
public class ShutdownEndpoint implements ApplicationContextAware {private static final MapString, String NO_CONTEXT_MESSAGE Collections.unmodifiableMap(Collections.singletonMap(message, No context to shutdown.));private static final MapString, String SHUTDOWN_MESSAGE Collections.unmodifiableMap(Collections.singletonMap(message, Shutting down, bye...));private ConfigurableApplicationContext context;// 写操作WriteOperationpublic MapString, String shutdown() {if (this.context null) {return NO_CONTEXT_MESSAGE; // 返回的信息就会json格式化到响应}try {return SHUTDOWN_MESSAGE;}finally {// 另起一个线程进行shutdown操作目的是优雅关机。Thread thread new Thread(this::performShutdown);thread.setContextClassLoader(getClass().getClassLoader());thread.start();}}private void performShutdown() {try {// 暂停500毫秒Thread.sleep(500L);}catch (InterruptedException ex) {Thread.currentThread().interrupt();}// 执行Spring容器关闭操作this.context.close();}Overridepublic void setApplicationContext(ApplicationContext context) throws BeansException {if (context instanceof ConfigurableApplicationContext) {this.context (ConfigurableApplicationContext) context;}}}