前言
隨着我們服務越來越多,部署的環境也越來越繁多時,由於各服務都部署在不同的機器上,每當出現問題或者異常時,想快速進行問題的定位就變的麻煩了。所以,本章節開始,開始講解
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
端點里面也有的,常用的命令輸出都有示例,這里就不貼了。不然文章看起來就冗長了,哈哈~
命令詳解: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
系列教程,如有雷同,請多多包涵了。原創不易,碼字不易,還希望大家多多支持。若文中有所錯誤之處,還望提出,謝謝。
老生常談
- 個人QQ:
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/