Spring Boot(八):Spring Boot的監控法寶:Actuator


在日常項目中,除了開發過程比較重要以外,實際上運維過程也尤為重要。而Spring Boot 也為我們考慮到了這一點,它為我們提供了Actuator這一組件,幫助我們

監控、管理應用程序

正如官網中所說的那樣,它可以通過很小的動作產生巨大的變化


一起來探索一下~


一 原理


01. 什麼是Actuator


Spring Boot Actuator,可在您將應用程序投入生產時幫助您監控和管理應用程序。分別支持HTTPJMX兩類端點。


02. 支持哪些監控項


總得來說,分為三類:

1)應用配置類:獲取應用程序中加載的應用配置、環境變量、自動化配置報告等與Spring Boot應用密切相關的配置類信息


2)度量指標類:獲取應用程序運行過程中用於監控的度量指標,比如:內存信息、線程池信息、HTTP請求統計等


3)操作控制類:提供了對應用的關閉等操作類功能


常用端點如下:


<code>1)auditevents 公開當前應用程序的審核事件信息

2) beans 該端點用來獲取應用上下文中創建的所有Bean


3) caches 展示可用的緩存

4)conditions 顯示在配置和自動配置類上評估的條件以及它們匹配或不匹配的原因

5)configprops 所有@ConfigurationProperties的配置列表

6)flyway 顯示已應用的所有Flyway數據庫遷移。

7)env 返回當前的環境變量

8)health 健康狀況

9)httptrace 查看HTTP請求響應明細(默認100條)

10)info 展示服務應用信息

11)loggers 查看日誌配置,支持動態修改日誌級別

12)liquibase 顯示已應用的所有Liquibase數據庫遷移

13)metrics 顯示當前應用程序的“指標”信息

14)mappings 顯示所有@RequestMapping請求列表

15)scheduledtasks 顯示服務中的所有定時任務

16)sessions 允許從Spring Session支持的會話存儲中檢索和刪除用戶會話

17)shutdown 可以使服務優雅的關閉,默認沒有開啟


18)threaddump 執行線程轉儲
/<code>

參考:Spring Boot官網之Actuator部分


注意:Spring Boot Actuator也支持prometheus、jolokia和integrationgraph,但若要使用它們,分別需要引入對應的依賴,才能正常使用


03. 如何實現


1)引入依賴


簡單的使用呢,只需要引入以下依賴,啟動服務即可


<code><dependencies>    
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-actuator/<artifactid>
/<dependency>
/<dependencies>/<code>


2)重啟服務,訪問頁面


訪問地址http://localhost:8888/actuator,便可以看到各個監控url,訪問對應的url,就可以看到對應的監控參數
需要注意的是,為了安全起見,http默認只暴露health和info兩個節點


Spring Boot(八):Spring Boot的監控法寶:Actuator

04. 常用配置項


我們可以根據需要,通過配置項進行節點的開啟與關閉設置


1)開啟單個endPoint端點

<code>management.endpoints.jmx.exposure.exclude=
management.endpoints.jmx.exposure.include=*

management.endpoints.web.exposure.exclude=
management.endpoints.web.exposure.include=info, health/<code>


示例:

<code>#1、只開啟info端點的配置
#關閉所有端點
management.endpoints.enabled-by-default=false
#開啟info端點
management.endpoint.info.enabled=true/<code>


這兩個配置項的結合,表示只開啟了info端點


2)暴露、關閉endpoint端點

<code>management.endpoints.jmx.exposure.exclude=
management.endpoints.jmx.exposure.include=*

management.endpoints.web.exposure.exclude=
management.endpoints.web.exposure.include=info, health/<code>


如上所示,前兩個配置項表示對jmx端點的關閉與開啟的整體配置,後兩項配置則是對http端點的關閉與開啟的整體配置。


3)對於監控訪問地址特定配置


從第3小節中,我們可以看到,監控默認的HTTP訪問地址為


<code>服務ip:服務端口/actuator//<code>


在實際生產中,我們也可以通過配置,將監控地址配置為與原服務不同的某個特定地址


這樣的話,我們就可以只給外部提供我們的服務地址,而不需要擔心他們也監控我們的服務的作用了。


經常使用到的配置項如下所示:


<code>management.server.address=監控服務ip
management.server.port=監控服務端口
management.endpoints.web.base-path=訪問的baseUrl
management.endpoints.web.path-mapping.=訪問路徑/<code>


我們在項目中添加如下配置


<code>#監控服務ip
management.server.address=127.0.0.1
#監控服務端口
management.server.port=8008
#訪問的baseUrl(默認為/actuator)
management.endpoints.web.base-path=/myActuator
#對某個特定端點的路徑配置

management.endpoints.web.path-mapping.health=/monitor/health/<code>


頁面訪問,原來的請求地址已無法訪問,而我們配置的地址已經生效


Spring Boot(八):Spring Boot的監控法寶:Actuator


04. 源碼分析


總得來說,Spring Boot Actuator是通過定製不同的endPoint,進行各個監控項進行監控的
具體點的話,我們跟著源碼走一波~


如下所示,會通過EndpointDiscoverer.discoverEndpoints()方法進行各個監控項的加載

Spring Boot(八):Spring Boot的監控法寶:Actuator


1)加載endPointBean


通過調用createEndpointBeans()方法,加載所有帶有@EndPoint註解的bean

Spring Boot(八):Spring Boot的監控法寶:Actuator


我們可以看到,該方法時是從上下文中獲取帶有@EndPoint註解的bean,檢查是否有重複id的endPointBean,若未出現,則將結果返回


2)加載EndPointExtensionBean

通過調用addExtensionBeans()方法,加載所有帶有@EndPointExtension註解的bean,同樣檢查是否出現重複id的EndPointExtensionBean,若未出現,則將結果返回

Spring Boot(八):Spring Boot的監控法寶:Actuator


需要說明的是,該 EndpointExtension類是對對應的Endpoint 類的擴展。

Spring Boot(八):Spring Boot的監控法寶:Actuator


目前有三個這樣的Bean:


CachesEndpointWebExtension

HealthEndpointWebExtension

EnvironmentEndpointWebExtension


其中,HealthEndpointWebExtension的定義如下

Spring Boot(八):Spring Boot的監控法寶:Actuator

我們可以看到,HealthEndpointWebExtension通過標籤endpint指向HealthEndPoint類


接著上一步,進入addExtensionBean()方法,我們看到,該方法會分別對EndpointExtension和extensionBean進行判斷


Spring Boot(八):Spring Boot的監控法寶:Actuator

a 判斷endpointExtension


進入擴展bean判斷,只有該擴展類對應的filter與對應的endpointBean保持一致,並且對應的endpointBean並沒有被關閉掉,才能將其加入到endpointBean中


Spring Boot(八):Spring Boot的監控法寶:Actuator

b 判斷 endpointbean


是否匹配對應的 filter,此 bean 是否被 exclude 了!(配置文件配置),同時判斷 bean 上的註解是否匹配當前 supplier


Spring Boot(八):Spring Boot的監控法寶:Actuator


3)處理獲取到的endPointBeans


這個過程通過調用convertToEndPoints()方法,分別加載各個endPoint類的操作方法,並將各個endPoint的id以/actuator為前綴的形式映射為URL(若有特定配置,前綴為配置項的值)


例如,默認情況下,health端點映射為

<code>/actuator/health/<code>


4)特定端點特定處理


當收到某個端點的請求時,再分別進行各個監控點的判斷,並展示結果。
如,當請求health節點,即調用url:http://localhost:8888/actuator/health時,會按照以下步驟執行

a 首先會調用invoke()方法,獲取到對應的url映射地址

Spring Boot(八):Spring Boot的監控法寶:Actuator

b 然後通過反射機制獲取到對應節點的操作類與方法

Spring Boot(八):Spring Boot的監控法寶:Actuator

通過上圖,我們發現,獲取到的需要檢查健康狀況的分別為磁盤空間、數據庫連接狀態以及redis連接狀態


c 分別執行各個操作方法,返回結果


那麼接下來,就會分別進入各個指示器,調用對應的doHealthCheck()方法進行相應檢查處理
舉個例子,以下是磁盤的健康檢查類的doHealthCheck()方法,它主要獲取磁盤可用空間等信息,並返回結果

Spring Boot(八):Spring Boot的監控法寶:Actuator


好了,以上就是我們對於Spring Boot Actuator的監控原理進行了跟蹤梳理。其他的端點,也基本類似,大家不妨也跟蹤源碼,瞭解一下他們的具體處理機制


當然,對於一些監控項,也支持響應式,就是說,只要某個監控項的值發生了變化,就會實時更新數據。本節作為了解監控特性的第一篇,就先不介紹了,以後有機會可以專門再來一篇


二 實戰環節


01. 快速實現


很簡單,請參照第一節中 03如何實現的操作步驟快速實現一個具有監控功能的應用程序,分為以下三步:

1)引入依賴

2)添加配置

3)運行服務,查看節點


02. 功能擴展


Spring Boot Actuator為我們提供的諸多節點,已可以支持我們的大部分的監控功能了,但若是我們還想要擴展的話,我們可以分別通過添加自定義endpoint自定義健康狀況檢查項以及自定義健康狀態進行監控項等進行擴展


1)自定義endpoint


如果需要自定義節點,只需要定義一個帶有註解@Endpoint的類,然後結分別合@ReadOperation, @WriteOperation, or @DeleteOperation定義具體的方法即可
如下所示

<code>@Endpoint(id = "hello")
@Component
public class MyEndPoint {
@ReadOperation
public String getHello(){
return "Hello~ World";
}
/**
* 定義帶有參數的
* @param name
* @return
*/
@ReadOperation

public String getHelloWithName(@Selector String name){
return "Hello~"+name;
}
@WriteOperation
public String postHello(){
return "post Hello";
}
@DeleteOperation
public String deleteHello(){
return "delete Hello";
}
}/<code>


頁面訪問,你會發現,便多了我們新增的兩個節點


Spring Boot(八):Spring Boot的監控法寶:Actuator


2)自定義健康狀況檢查項

Spring Boot Actuator默認支持以下各項的健康檢查


Spring Boot(八):Spring Boot的監控法寶:Actuator


它們均通過直接或間接實現HealthIndicator接口來處理各個服務項進行健康狀況檢查請求


那麼,我們若要自定義自己健康狀況檢查項的話,同樣只需要實現HealthIndicator接口,並重寫對應的health()方法即可


比如我們現在需要增加一個監控庫存中是否還有足夠的蘋果的時候,我們就可以定義如下所示的監控類

<code>/**
* 監控庫存中是否還有足夠的蘋果
*/
@Component
public class MyIndicator implements HealthIndicator {
private long count = 50; //實際中生產中,可以從數據庫中獲取蘋果的數量
@Override
public Health health() {
Health health;
if (count<=5){
health = Health.up()
.withDetail("count",count)
.withDetail("message","糟糕,蘋果庫存不足啦~需要備貨啦~")
.build();
}else {
health = Health.down()
.withDetail("count",count)
.withDetail("message","我們還有足夠的蘋果喲~")
.build();
}
return health;
}
}/<code>


重啟服務,頁面請求health的url


Spring Boot(八):Spring Boot的監控法寶:Actuator


健康檢查項中就多了我們自定義的監控項


3)自定義健康狀況類型


關於健康狀態類型,actuator內置以下幾種HTTP狀態碼:


<code>StatusMappingDOWN 503
OUT_OF_SERVICE 503
UP 200
UNKNOWN 200/<code>


我們也可以通過如下配置添加自定義狀態:


<code>#添加狀態FATAL
management.health.status.order=FATAL, DOWN, OUT_OF_SERVICE, UNKNOWN, UP
#映射狀態的狀態碼(即FATAL對應的狀態碼綁定為503)
management.health.status.http-mapping.FATAL=503/<code>


如果你需要更多的控制,也可以通過定義自己的 HealthStatusHttpMapper bean進行實現


三 總結 總而言之


今天主要聊了聊作為Spring Boot的四大法寶之一的 監控特性

主要分別從認識Spring Boot Actuator如何使用使用它實現監控功能,進而跟蹤源碼探索底層原理,最後通過自定義節點或者監控項等方式進行功能擴展


spring-boot-starter-actuator模塊的實現對於實施微服務的中小團隊來說,可以有效地減少監控系統在採集應用指標時的開發量。通常我們會使用它所提供的http的API進行監控端或者管理端的功能集成開發,從而實現服務各項指標的監控,尤其方便

當然,我們也可以通過它的各個端點的實現機制,定義我們自己的endPoint或者對於已有的endPoint功能進行進行相應的擴展,實現我們自身系統個性化的監控需求

因為監控項中暴露了很多服務參數,實際過程中,我們通常是藉助Spring Boot Security來進行安全配置。留給大家進行探索咯~


看完文章,我想你肯定掌握了以下幾點:


1、Spring Boot Actuator的監控項


2、如何使用Spring Boot Actuator進行應用程序的監控


3、Spring Boot Actuator的監控原理


4、如何擴展監控項,實現定製化監控功能


嗯,就這樣。每天學習一點,時間會見證你的強大~


下期預告:
Spring Boot(九):Spring Boot 安全法寶-Spring Security


本期項目代碼已上傳到github~有需要的可以參考

<code>https://github.com/wangjie0919/Spring-Boot-Notes/<code>


往期精彩回顧



您的關注 是我們持續更新的動力~


分享到:


相關文章: