Spring Boot的Endpoint主要是用来监控应用服务的运行状况,并集成在MVC中提供查看接口。内置的Endpoint比如HealthEndpoint会监控dist和db的状况
Endpoint是在包org.springframework.boot.actuate.endpoint下,其中invoke()是最主要的方法,用于返回监控的内容,isSensitive()用于权限控制。核心代码如下:
public interface Endpoint<T> { String getId(); boolean isEnabled(); boolean isSensitive(); T invoke(); }
Endpoint的加载还是要依靠spring.factories实现的。Spring-boot-actutor包下的META-IN/spring.factories配置了EndpointAutoConfiguration,以下是截取默认配置的一部分配置信息:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.actuate.autoconfigure.AuditAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.CacheStatisticsAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration,\
EndpointAutoConfiguration(org.springframework.boot.actuate.autoconfigure包下)就会注入必要的Endoint。有些Endpoint需要外部的收集类,比如TraceEndpoint,如下代码:
@Bean @ConditionalOnMissingBean public TraceEndpoint traceEndpoint() { return new TraceEndpoint(this.traceRepository); }
TraceEndpoint会记录每次请求的Request和Response的状态,需要嵌入到Request的流程中,这里就主要用到了3个类。
(1)TraceRepository用于保存和获取Request和Response的状态。
public interface TraceRepository{ List<Trace> findAll(); void add(Map<String, Object> traceInfo); }
(2)WebRequestTraceFilter用于嵌入web request,收集请求的状态并保存在TraceRepository中。
(3)TraceEndpoint,invoke()方法直接调用TraceRepository保存的数据。
public class TraceEndpoint extends AbstractEndpoint<List<Trace>> { private final TraceRepository repository; public TraceEndpoint(TraceRepository repository) { super("trace"); Assert.notNull(repository, "Repository must not be null"); this.repository = repository; } public List<Trace> invoke() { return this.repository.findAll(); } }
讲了这么多,关键是我们如何自定义Endpoint呢?期待下篇博客。
视频&交流平台:
http://study.163.com/course/introduction.htm?courseId=1004329008
http://412887952-qq-com.iteye.com/blog/2321532