Springboot之Actuator服務監控


最近在項目當中,啓動了多個微服務項目,想着如何監控啓動的項目,然後就找到了Actuator這個東西!!!總結下自己學習到的知識點!!!

什麼是Actuator

Spring Boot Actuator 官方文檔

Spring Boot includes a number of additional features to help you monitor and manage your application when you push it to production. You can choose to manage and monitor your application by using HTTP endpoints or with JMX. Auditing, health, and metrics gathering can also be automatically applied to your application.

翻譯成中文就是:Spring Boot包含許多其他功能,可幫助您在將應用程序投入生產時監控和管理您的應用程序。您可以選擇使用HTTP端點或JMX管理和監視您的應用程序。審覈,運行狀況和指標收集也可以自動應用於您的應用程序。

簡單來說就是:Spring Boot Actuator可以實現對應用的監控以及管理!!!

項目當中如何使用

非常簡單,只需要引入相關JAR即可!!!

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

然後啓動項目,在瀏覽器當中輸入: http://127.0.0.1:8080/actuator/ 即可!!!
但是這個時候返回的信息是很少的,只有默認的幾個數據!!!如下所示:

{"_links":{
"self":{"href":"http://127.0.0.1:8080/actuator","templated":false},
"health":{"href":"http://127.0.0.1:8080/actuator/health","templated":false},
"health-path":{"href":"http://127.0.0.1:8080/actuator/health/{*path}","templated":true},
"info":{"href":"http://127.0.0.1:8080/actuator/info","templated":false}
}}

然後在瀏覽器輸入對應的地址就可以看到相關的詳細信息了!!!

Actuator 端口

在上面actuator路徑後面的health,info都可以稱爲端口,表示actuator針對springboot應用監控的一些信息。根據官方文檔默認情況下是隻有這兩個接口可以訪問的!!!。但是可以自己進行配置要暴露的端口!!!

actuator默認是有很多端口的,如下所示:

端口 描述
auditevents 公開當前應用程序的審覈事件信息。需要一個AuditEventRepository bean。
beans 顯示應用程序中所有Spring Bean的完整列表。
caches 公開可用的緩存。
conditions 顯示在配置和自動配置類上評估的條件以及它們匹配或不匹配的原因。
configprops 顯示應用加載的所有的ConfigurationProperties配置信息。
env 顯示應用當前運行環境
health 顯示應用當前的運行狀態
httptrace 顯示HTTP跟蹤信息(默認情況下,最近100個HTTP請求-響應交換)。需要配置一個HttpTraceRepository bean。
info 顯示應用程序基礎信息
loggers 顯示和修改應用程序中日誌記錄的配置。
metrics 顯示當前應用程序的“指標”信息
scheduledtasks 顯示應用程序中的計劃任務。
mappings 顯示所有@RequestMapping路徑的整理列表。
shutdown 使應用程序正常關閉。默認禁用。
threaddump 執行線程轉儲文件
heapdump 堆轉儲文件。
logfile 返回日誌文件的內容(如果已設置logging.file.name或logging.file.path屬性)。支持使用HTTP Range標頭來檢索部分日誌文件的內容。
其它詳見官方文檔

開啓和暴露端口

默認情況下上面的端口除了shutdown 以外,都是開啓了的。但是由於端口信息裏面包含了敏感信息,所以默認是通過HTTP訪問的話,只暴露了health,info兩個基本端口。其它的端口都是沒有暴露的。

在配置文件當中開啓端口:management.endpoint.{端口名}.enabled=true 這樣就開啓了。false表示不開啓。如下所示!!!

management.endpoint.shutdown.enabled=true
management.endpoint.info.enabled=true

由於默認是開啓shutdown 以外所有端口,如果需要只開啓某寫端口的話,可以快速關閉所有端口進行,然後開啓某個單獨的端口

management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true

開啓了端口之後,並不能夠直接通過HTTP請求訪問到,還需要暴露出來 include 表示暴露的端口,exclude表示排除的端口

# 暴露所有的端口,除了env,beans
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans

注意事項:在yml當中 * 具有特殊意義,需要雙引號包裹起來!!!
注意事項:端口信息會存在緩存,可以通過設置端口的cache.time-to-live屬性來設置緩存

#將health端點的緩存的生存時間設置爲10秒
management.endpoint.health.cache.time-to-live=10s

端口加密訪問

由於端口返回的信息或多或少會有一些敏感的信息,所以要求嚴格的話,是需要對端口訪問進行加密處理!!!官方推薦是配合Spring Security很容易實現,個人覺得隨便加上一個路由攔截器攔截一下就完事了,畢竟測試環境沒必要,生產環境早都已經層層加密了,估計端口都只會內部訪問,本地訪問等等一系列的限制。

端口的操作基本都是查詢,但是還是有一些是比較特別或者有意思的端口

health端口

默認情況下health端口返回的信息是很簡單的,可以通過配置返回詳細的信息

#向所有用戶展示詳細信息
management.endpoint.health.show-details=always

health端口主要返回應用的一些情況,比如:應用狀態,數據庫狀態,磁盤空間信息等等,具體指標見官方文檔
health端口也支持自定義檢查項:

/**
 * @author 海加爾金鷹
 */
@Component
public class MyHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        Boolean success = check();
        if (success) {
            return Health.down().withDetail("Error Code", "自定義健康檢查失敗").build();
        }
        return Health.up().withDetail("Error Code", "自定義健康檢查成功").build();
    }

    private Boolean check() {
        //這裏處理自定義的健康檢查詳情
        double random = Math.random();
        if(random*1000<500){
            System.out.println(random*1000);
            return true;
        }
        return false;
    }
}

這樣在瀏覽器輸入:http://127.0.0.1:8080/actuator/health 就可以看到自定義檢查項是否成功,並且每次都會重新檢查!!!

備註信息:返回的自定義檢查項是在my裏面,這是因爲MyHealthIndicator 是my開頭的原因。

info端口

info端口主要展示我們在配置文件當中自己配置的信息:例如在properties當中配置,在url當中就會返回這些數據

info.name=hjljy
info.version=v1.0.0
info.des=this is a demo

shutdown端口

這個端口,個人覺得算是比較雞肋的端口,比較主要作用是關閉應用,誰會去關閉線上的應用啊?就算要發版也不會這麼關閉
首先需要先開啓端口,然後暴露出來

management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=*

接下來通過POST請求就可以關閉應用了。

POST http://localhost:8080/actuator/shutdown

HTTP/1.1 200 
Content-Type: application/vnd.spring-boot.actuator.v3+json
Transfer-Encoding: chunked
Date: Mon, 01 Jun 2020 14:16:29 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{
  "message": "Shutting down, bye..."
}

loggers端口

loggers端口可以顯示和修改應用程序中日誌記錄的配置,如果線上環境只記錄了error級別的錯誤,在進行排查的時候可以將級別設置爲info,debug級別等等!!!
也是通過POST請求進行的設置:(如果是get請求,表示查看日誌級別)

POST http://localhost:8080/actuator/loggers/root
Content-Type: application/json

{
   "configuredLevel": "info"
}

httptrace端口

這個端口需要額外進行配置才能返回信息,如果沒有配置是不會有這個端口的。端口主要作用是返回最近的100個請求信息?不過沒有記錄請求和響應參數,只有請求地址,響應結果。只需要將下面的代碼放到配置類裏面注入即可,或者直接放在springboot啓動類裏面

    @Bean
    public HttpTraceRepository httpTraceRepository() {
        return new InMemoryHttpTraceRepository();
    }

其它端口

其餘端口基本都是查詢,直接在瀏覽器輸入地址,就可以看到返回的信息。非常的方便!!!,缺點是返回的數據是JSON格式,需要自己處理下!!!

自定義屬性配置

主要是針對Actuator默認的配置,是可以自定義進行處理設置的。

自定義管理路徑

如果覺得Actuator默認的actuator路徑不喜歡,可以通過配置將actuator換成其它的路徑

management.endpoints.web.base-path=/show

這時所有的端口路徑就從 actuator/{name} 變成了show/{name},例如:actuator/info---->show/info

如果覺得某個端口路徑名字過長,不好記,也可以自定義某個端口的路徑

management.endpoints.web.path-mapping.scheduledtasks=/task

這時scheduledtasks端口路徑就從 actuator/scheduledtasks---->actuator/task
如果上面兩個一起用,就變成了show/task

自定義管理port和限制

默認情況下,應用的port就是actuator的端口,但是也可以自己設置

# 這裏就將actuator的端口修改爲了8090,訪問時的端口就變成了8090了。
management.server.port=8090
# 如果設置爲-1就表示不暴露端口,所有的請求都會變成404
management.server.port=-1
# 如果設置爲127.0.0.1就表示只能通過本地訪問,無法通過IP訪問了。
management.server.address=127.0.0.1

自定義管理端口

如果覺得上面的端口信息還不夠充分,可以自定義需要獲取,統計的信息端口。

/**
 * @author 海加爾金鷹
 */
@Endpoint(id = "hjljy") //指定端口爲hjljy 
@Component
public class HjljyEndpoint {

    private static String NAME = "這是測試數據";
	
	//表示通過GET請求獲取  
    @ReadOperation
    public String getName() {
        return NAME;
    }
	//表示通過POST請求獲取 
    @WriteOperation
    public String setName(String name) {
        NAME = name;
        return NAME;
    }
	//表示通過DETELE請求獲取 
    @DeleteOperation
    public String initName() {
        NAME = "刪除數據";
        return NAME;
    }
}

測試結果如下:
1 發送GET請求 :

GET http://localhost:8090/actuator/hjljy

返回數據:這是測試數據

2 發送POS請求:

POST http://localhost:8090/actuator/hjljy
Content-Type: application/json

{
  "name": "碎銀幾兩"
}

返回數據:碎銀幾兩

3 發送DETELE請求

DELETE http://localhost:8090/actuator/hjljy

返回數據:刪除數據

總結

1 感覺很驚豔,當然也可能是因爲我沒怎麼接觸線上環境,或者沒怎麼關注運維技巧,反正目前覺得這個東西對於開發來說非常友好吧,利於BUG的分析,線上的監控啊什麼的。
2 就是全部返回JSON有點難受。不過據說有個Springboot Admin可以進行可視化分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章