javascript
大牛带你深入SpringBoot:自定义Endpoint 及实现原理
https://www.jianshu.com/p/fd93d941bf3b
Endpoint
SpringBoot的Endpoint主要是用來監(jiān)控應(yīng)用服務(wù)的運行狀況,并集成在Mvc中提供查看接口。內(nèi)置的Endpoint比如HealthEndpoint會監(jiān)控dist和db的狀況,MetricsEndpoint則會監(jiān)控內(nèi)存和gc的狀況。 Endpoint的接口如下,其中*invoke()*是主要的方法,用于返回監(jiān)控的內(nèi)容,*isSensitive()*用于權(quán)限控制。
public interface Endpoint {
String getId();
boolean isEnabled();
boolean isSensitive();
T invoke();
}
Endpoint的加載還是依靠spring.factories實現(xiàn)的。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的狀態(tài),需要嵌入到Request的流程中,這里就主要用到了3個類。
1.TraceRepository用于保存和獲取Request和Response的狀態(tài)。
public interface TraceRepository {
List findAll();
void add(Map traceInfo);
}
2.WebRequestTraceFilter用于嵌入web request,收集請求的狀態(tài)并保存在TraceRepository中。
3.TraceEndpoint,invoke()方法直接調(diào)用TraceRepository保存的數(shù)據(jù)。
Endpoint的Mvc接口主要是通過EndpointWebMvcManagementContextConfiguration實現(xiàn)的,這個類的配置也放在spring.factories中。
...
org.springframework.boot.actuate.autoconfigure.ManagementContextConfiguration=\
org.springframework.boot.actuate.autoconfigure.EndpointWebMvcManagementContextConfiguration,\
org.springframework.boot.actuate.autoconfigure.EndpointWebMvcHypermediaManagementContextConfiguration
EndpointWebMvcManagementContextConfiguration注入EndpointHandlerMapping來實現(xiàn)Endpoint的Mvc接口。
自定義Endpoint
自定義Endpoint也是類似的原理。這里自定義Endpoint實現(xiàn)應(yīng)用內(nèi)存的定時收集。完整的代碼放在Github上了。
收集內(nèi)存,MemStatus是內(nèi)存的存儲結(jié)構(gòu),MemCollector是內(nèi)存的收集類,使用Spring內(nèi)置的定時功能,每5秒收集當前內(nèi)存。
2.自定義Endpoint,getId是EndPoint的唯一標識,也是Mvc接口對外暴露的路徑。invoke方法,取出maxMemory和totalMemory和對應(yīng)的時間。
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);
}
}
結(jié)語
Endpoint也是通過spring.factories實現(xiàn)擴展功能,注入了對應(yīng)的Bean來實現(xiàn)應(yīng)用監(jiān)控的功能。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/10268127.html
總結(jié)
以上是生活随笔為你收集整理的大牛带你深入SpringBoot:自定义Endpoint 及实现原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 中15种锁的介绍:公平锁,可重
- 下一篇: Spring Boot Actuator