SpringBoot | 第二十七章:監控管理之Actuator使用
前言
隨著我們服務越來越多,部署的環境也越來越繁多時,由於各服務都部署在不同的機器上,每當出現問題或者異常時,想快速進行問題的定位就變的麻煩了。所以,本章節開始,開始講解 SpringBoot
的監控相關知識點。本章節就先來說一說,其自帶的 Actuator
功能。
一點知識
Spring Boot Actuator
是 spring boot
專案一個監控模組,提供了很多原生的端點,包含了對應用系統的自省和監控的整合功能,可以檢視應用配置的詳細資訊,比如 應用程式上下文裡全部的Bean 、 健康指標 、 環境變數 及 各類重要度量指標 等等,這些都是使用可 HTTP
進行請求訪問。通過這些監控資訊,我們就能隨時瞭解應用的執行情況了。
Actuator實踐
特別說明:
最近在編寫 SpringCloud
的教程,使用的是 SpringBoot2.x
的版本,其和 1.x
版本是有區別的,需要額外開啟端點,預設只開啟了 info、health
兩個端點,其他的需要額外去配置的。本教程還是沿用 Spring Boot 1.5.15
版本來示例。關於 2.x
的後續再來更新吧,不然會亂了。。
原生端點
原生端點是在應用程式裡提供眾多 Web 介面,通過它們瞭解應用程式執行時的內部狀況。原生端點又可以分成三類:
- 應用配置類:可以檢視應用在執行期的靜態資訊:例如自動配置資訊、載入的springbean資訊、yml檔案配置資訊、環境資訊、請求對映資訊;
- 度量指標類:主要是執行期的動態資訊,例如堆疊、請求連、一些健康指標、metrics資訊等;
- 操作控制類:主要是指shutdown,使用者可以傳送一個請求將應用的監控功能關閉。
官網可以看出,原生的端點很多
以下列舉內建的端點相關說明:
ID | 描述 | 是否需要鑑權 |
---|---|---|
actuator |
為其他端點提供“發現頁面”。要求Spring HATEOAS在classpath路徑上。 | 需要 |
auditevents |
陳列當前應用程式的審計事件資訊。 | 需要 |
autoconfig |
展示自動配置資訊並且顯示所有自動配置候選人以及他們“被不被”應用的原因。 | 需要 |
beans |
顯示應用程式中所有Spring bean的完整列表。 | 需要 |
configprops |
顯示所有配置資訊。 | 需要 |
dump |
dump所有執行緒。 | 需要 |
env |
陳列所有的環境變數。 | 需要 |
flyway |
Shows any Flyway database migrations that have been applied. | 需要 |
health |
顯示應用程式執行狀況資訊 | 不需要 |
info |
顯示應用資訊。 | 不需要 |
loggers |
顯示和修改應用程式中的loggers配置。 | 需要 |
liquibase |
顯示已經應用的任何Liquibase資料庫遷移。 | 需要 |
metrics |
顯示當前應用程式的“指標”資訊。 | 需要 |
mappings |
顯示所有 @RequestMapping 的url整理列表。 |
需要 |
shutdown |
關閉應用(預設情況下不啟用)。 | 需要 |
trace |
顯示跟蹤資訊(預設最後100個HTTP請求)。 | 需要 |
從官網文件也可以看出,可通過配置檔案,修改某端點是否開啟,是否需要鑑權訪問等
如:
# 這裡的id 是指訪問的url路徑 endpoints.beans.id=springbeans # 關閉鑑權 endpoints.beans.sensitive=false # 開啟shutdown endpoints.shutdown.enabled=true
至於以上每個端點實際輸出的資訊,大家可以看看大佬們的文章或者訪問 /docs
端點裡面也有的,常用的命令輸出都有示例,這裡就不貼了。不然文章看起來就冗長了,哈哈~
命令詳解: ofollow,noindex" target="_blank">http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html
訪問 /docs
端點(如何使用下文有說明):
上手實踐
0.加入POM依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 加入doc文件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-actuator-docs</artifactId> </dependency> <!-- 開啟安全認證 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
加入 spring-boot-actuator-docs
可檢視相關文件,如
1.配置檔案(可無),具體的可根據實際業務來配置。
# actuator的訪問路徑 management.context-path=/monitor # 管理的埠調整成1234 management.port=1234 # 有些需要身份認證才能訪問,可直接關閉鑑權 #management.security.enabled=true # 開啟關閉應用端點 endpoints.shutdown.enabled=true # 安全驗證的賬號密碼 security.user.name=oKong security.user.password=123456
2.編寫啟動類(普通的啟動類),啟動後,訪問:http://127.0.0.1:1234/monitor/ (因為我們重新指定了訪問埠的上下文為monitor了)
訪問 /monitor/beans
,是需要授權的,可以看見需要輸入使用者名稱和密碼了:
輸入配置檔案裡面配置的使用者名稱和密碼,就可以正常訪問了:

自定義端點
雖然本身 SpringBoot
已經自帶了很多端點,大部分情況下是夠用了。但對於某些特殊需要時,還是需要自定義端點來滿足的。接下來就簡單講解下自定義端點的建立。
自定義健康端點
健康資訊可以用來檢查應用的執行狀態。所以經常被監控軟體用來提醒生產系統是否停止,資料庫是否正常,或者redis是否啟動等等,而且一般上健康端點的資訊都是比較敏感的,應加入身份鑑權。
自動配置的健康端點有:
簡單說明下:
名稱 | 描述 |
---|---|
CassandraHealthIndicator |
檢查 Cassandra 資料庫是否啟動。 |
DiskSpaceHealthIndicator |
檢查磁碟空間不足。 |
DataSourceHealthIndicator |
檢查是否可以獲得連線 DataSource 。 |
ElasticsearchHealthIndicator |
檢查 Elasticsearch 叢集是否啟動。 |
InfluxDbHealthIndicator |
檢查 InfluxDB 伺服器是否啟動。 |
JmsHealthIndicator |
檢查 JMS 代理是否啟動。 |
MailHealthIndicator |
檢查郵件伺服器是否啟動。 |
MongoHealthIndicator |
檢查 Mongo 資料庫是否啟動。 |
Neo4jHealthIndicator |
檢查 Neo4j 伺服器是否啟動。 |
RabbitHealthIndicator |
檢查 Rabbit 伺服器是否啟動。 |
RedisHealthIndicator |
檢查 Redis 伺服器是否啟動。 |
SolrHealthIndicator |
檢查 Solr 伺服器是否已啟動。 |
這些端點,在 spring-boot-starter-xxx
包被依賴匯入後,利用 @Conditional
等註解進行自動載入的,具體可以看看 org.springframework.boot.actuate.autoconfigure
包下的自動載入類。
比如,上圖中的,當我們加入 spring-boot-starter-data-redis
依賴後, RedisHealthIndicator
就會自動被裝載了,這個時候我們訪問下:http://127.0.0.1:1234/monitor/health ,可以看見 redis
節點有顯示了,狀態是關閉
其他的都是類似的,具體可以看看原始碼。接下來,我們通過繼承 AbstractHealthIndicator
來自定義一個監控端點(當然也可以實現 HealthIndicator
介面的)
CustomHealthIndicator.java
/** * 自定義健康端點 繼承AbstractHealthIndicator類 也可以實現 HealthIndicator介面的 * @author oKong * */ //這裡也可以使用 類似@ConditionalOnMissingBean寫法自動載入的 //這裡的name 就是預設健康節點的名稱了 @Component("oKong") public class CustomHealthIndicator extends AbstractHealthIndicator{ @Override protected void doHealthCheck(Builder builder) throws Exception { //設定健康資訊 builder.withDetail("code", "0123") .withDetail("version", "v0.1") //有其他資訊可繼續新增的 .up().build(); } }
最後效果:
{ "status": "DOWN", "oKong": { "status": "UP", "code": "0123", "version": "v0.1" }, "diskSpace": { "status": "UP", "total": 120032587776, "free": 8374538240, "threshold": 10485760 }, "redis": { "status": "DOWN", "error": "org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool" } }
這方面用的不多,至於其他詳細資訊,可以檢視官網: Security with HealthIndicators
自定義端點
出來在原來內建的端點進行新增,訪問的路徑還是內建的路徑,我們還能通過完全自定義一個端點來實現我們的業務需求的。
首先,我們來看看 健康端點
對應的類 org.springframework.boot.actuate.endpoint.HealthEndpoint
,其是繼承了 AbstractEndpoint<T>
來實現的。通過IDE我們也能看到,大部分的端點都是繼承此抽象類來完成的。
所以,我們也通過繼承此類來實現自定義端點。
CustomEndPoint.java
/** * 自定義端點 * @author oKong * */ @Component @ConfigurationProperties(prefix = "endpoints.oKong") public class CustomEndPoint extends AbstractEndpoint<Map<String,Object>>{ public CustomEndPoint() { //設定ID 即訪問路徑 :/oKong super("oKong"); } /** * 返回資訊 */ @Override public Map<String, Object> invoke() { Map<String, Object> result = new HashMap<>(); result.put("author", "oKong"); result.put("chapter", "chapter27"); result.put("mp", "lqdevOps"); return result; } }
加入了 @ConfigurationProperties
後可在配置檔案中,設定是否開啟等等。當然也可以加入自定義的引數了,這裡就默認了,沒有新增額外的引數。
參考資料
總結
本註解主要介紹了一些原生端點和自定義端點的相關實踐。對於一般的資訊,使用使用這些原生的端點就能基本滿足了,但由於返回的是json串,不夠明瞭。下一章節就介紹下,利用 Spring Boot Admin
進行視覺化的監控,比如有圖表資訊、檢視日誌輸出等等,通過介面來進行展現。
最後
目前網際網路上很多大佬都有 SpringBoot
系列教程,如有雷同,請多多包涵了。 原創不易,碼字不易 ,還希望大家多多支援。若文中有所錯誤之處,還望提出,謝謝。
老生常談
499452441 lqdevOps
個人部落格: http://blog.lqdev.cn
完整示例: https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-27
原文地址: http://blog.lqdev.cn/2018/09/11/springboot/chapter-twenty-seven/