Endpoint
SpringBoot的Endpoint主要是用來監控應用服務的運行狀況,並集成在Mvc中提供查看接口。內置的Endpoint比如HealthEndpoint會監控dist和db的狀況,MetricsEndpoint則會監控內存和gc的狀況。 Endpoint的接口如下,其中*invoke()*是主要的方法,用於返回監控的內容,*isSensitive()*用於權限控制。
public interface Endpoint {
String getId();
boolean isEnabled();
boolean isSensitive();
T invoke();
}
Endpoint的加載還是依靠spring.factories實現的。spring-boot-actuator包下的META-INF/spring.factories配置了EndpointAutoConfiguration。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
...
org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration,\\
...
EndpointAutoConfiguration就會注入必要的Endpoint。有些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 findAll();
void add(Map traceInfo);
}
2.WebRequestTraceFilter用於嵌入web request,收集請求的狀態並保存在TraceRepository中。
3.TraceEndpoint,invoke()方法直接調用TraceRepository保存的數據。
![大牛帶你深入SpringBoot:自定義Endpoint 及實現原理「轉」](http://p2.ttnews.xyz/loading.gif)
Endpoint的Mvc接口主要是通過EndpointWebMvcManagementContextConfiguration實現的,這個類的配置也放在spring.factories中。
...
org.springframework.boot.actuate.autoconfigure.ManagementContextConfiguration=\\
org.springframework.boot.actuate.autoconfigure.EndpointWebMvcManagementContextConfiguration,\\
org.springframework.boot.actuate.autoconfigure.EndpointWebMvcHypermediaManagementContextConfiguration
EndpointWebMvcManagementContextConfiguration注入EndpointHandlerMapping來實現Endpoint的Mvc接口。
![大牛帶你深入SpringBoot:自定義Endpoint 及實現原理「轉」](http://p2.ttnews.xyz/loading.gif)
自定義Endpoint
自定義Endpoint也是類似的原理。這裡自定義Endpoint實現應用內存的定時收集。完整的代碼放在Github上了。
收集內存,MemStatus是內存的存儲結構,MemCollector是內存的收集類,使用Spring內置的定時功能,每5秒收集當前內存。
2.自定義Endpoint,getId是EndPoint的唯一標識,也是Mvc接口對外暴露的路徑。invoke方法,取出maxMemory和totalMemory和對應的時間。
3.AutoConfig,注入了MyEndPoint,和MemCollector。
public static class EndPointAutoConfig {
private List status = new ArrayList();
@Bean
public MyEndPoint myEndPoint() {
return new MyEndPoint(status);
}
@Bean
public MemCollector memCollector() {
return new MemCollector(status);
}
}
4.程序入口,運行後訪問http://localhost:8080/my 就可以看到了。
@Configuration
@EnableAutoConfiguration
public class CustomizeEndPoint {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(CustomizeEndPoint.class);
application.run(args);
}
}
結語
Endpoint也是通過spring.factories實現擴展功能,注入了對應的Bean來實現應用監控的功能。
原文地址:https://www.jianshu.com/p/fd93d941bf3b
閱讀更多 架構師筆記 的文章