不學無數——SpringBoot入門Ⅷ
SpringBoot--Actuator
1. 初識Actuator
在開發過程中,專案被放置到生產伺服器上執行時,有可能需要我們全方位的監控應用服務的執行情況。此時SpringBoot提供了Actuator模組進行監控和管理
2. 使用方法
在gradle中新增依賴
compile("org.springframework.boot:spring-boot-starter-actuator")
然後啟動專案後會發現在啟動中發現如下的輸出資訊
這些端點資訊是暴露在外面的原生資訊,例如此時訪問http://localhost:8080/health
會發現在網站中輸出如下資訊
在
SpringBoot2.0
中對映的地址是/actuator/health
{
"status": "UP",
"diskSpace": {
"status": "UP",
"total": 250685575168,
"free": 172327690240,
"threshold": 10485760
},
"db": {
"status": "UP",
"database": "MySQL",
"hello": 1
}
}
3. 端點介紹
Actuator的端點能夠進行監控和管理應用。SpringBoot有許多的內嵌的端點,如果還需要其他的也可以自己新增。例如health端點提供了基本的應用健康資訊。
每一個獨立的端點都可以進行選擇暴露或者不暴露,預設情況下有些端點是開啟的,如果不想暴露的話,那麼可以在配置檔案中進行配置endpoints + . + name
,舉例如下:
endpoints.env.enabled=false
下面給出幾個端點的簡單介紹
端點名 | 描述 | 是否預設暴露 |
---|---|---|
autoconfig | 展示出所有自動配置的報告,展示自動配置的先決條件,並且分段展示出配置成功的和配置失敗的,並且展示出原因,其中positiveMatches 是自動化配置成功的,negativeMatches |
true |
beans | 該端點用來獲取應用上下文中建立的所有Bean | true |
configprops | 展示出來所有@ConfigurationProperties 的屬性資訊 |
true |
dump | 暴露出程式執行中的執行緒資訊 | true |
env | 它用來獲取應用所有可用的環境屬性報告。包括:環境變數、JVM屬性、應用的配置配置、命令列中的引數 | true |
health | 用來獲取應用的各類健康指標資訊 | true |
info | 該端點用來返回一些應用自定義的資訊。預設情況下,該端點只會返回一個空的json內容。我們可以在application.properties 配置檔案中通過info字首來設定一些屬性 |
true |
metrics | 該端點用來返回當前應用的各類重要度量指標,比如:記憶體資訊、執行緒資訊、垃圾回收資訊等 | true |
mappings | 展示出所有的@RequestMapping 路徑 |
true |
trace | 該端點用來返回基本的HTTP跟蹤資訊。預設情況下,跟蹤資訊的儲存採用 | true |
3.1 自定義info端點資訊
在添加了Actuator進行訪問info端點的時候,我們會發現頁面中顯示了一個空的json資訊。如果想要顯示資訊的話,那麼可以在配置檔案中通過設定info.*
進行賦值,例如:
info.app.encoding=UTF-8
info.app.java.source=1.8
info.app.java.target=1.8
這是訪問localhost:8080/info
可以發現如下資訊
{
"app": {
"java": {
"target": "1.8",
"source": "1.8"
},
"encoding": "UTF-8"
},
"name": "BuXueWuShu"
}
4. 自定義端點
有時候自帶的端點資訊不符合我們的需求,需要我們自定義一些端點資訊。在自定義端點資訊之前我們需要看一下Endpoint
這個SpringBoot中的類。
public interface Endpoint<T> {
//暴露在外的Id值,例如health、env
String getId();
//控制Id資訊是否暴露
boolean isEnabled();
//用於許可權的控制
boolean isSensitive();
//訪問Id值返回的資訊
T invoke();
}
發現暴露出來的端點都是實現了Endpoint
這個類,例如trace
這個端點。
@ConfigurationProperties(prefix = "endpoints.trace")
public class TraceEndpoint extends AbstractEndpoint<List<Trace>> {
private final TraceRepository repository;
/**
* Create a new {@link TraceEndpoint} instance.
* @param repository the trace repository
*/
public TraceEndpoint(TraceRepository repository) {
super("trace");
Assert.notNull(repository, "Repository must not be null");
this.repository = repository;
}
@Override
public List<Trace> invoke() {
return this.repository.findAll();
}
}
然後發現在spring.factories
檔案中自動配置了
org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration,\
點進去以後發現在其中已經自動將預設的端點注入進Spring容器中了
@Bean
@ConditionalOnMissingBean -- 表示在容器中沒有此實體Bean時建立
public TraceEndpoint traceEndpoint() {
return new TraceEndpoint(this.traceRepository == null
? new InMemoryTraceRepository() : this.traceRepository);
}
因此自定義端點也是類似的原理,我們做個簡單的如下:
public class MyEndPoint implements Endpoint {
@Override
public String getId() {
return "buxuewushu";
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public boolean isSensitive() {
return true;
}
@Override
public Object invoke() {
User user=new User();
user.setName("不學無數");
user.setAddress("HeNan");
return user;
}
}
將其放入spring.factories
自動注入進容器中
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.FirstSpringBoot.EndPoint.MyEndPoint
然後啟動專案輸入localhost:8080/buxuewushu
出現以下的資訊
{
"name": "不學無數",
"address": "HeNan"
}