spring boot 框架是spring framework發(fā)展史上一次質(zhì)的飛躍,用過都說好猜惋。它不僅僅是簡化了繁瑣的配置文件,提高了開發(fā)效率培愁,整合了開發(fā)中常用的各種組件著摔,優(yōu)雅地處理了它們之間的版本兼容性問題,等等定续。除了以上這些優(yōu)點還有本文將重點介紹的監(jiān)控谍咆,Spring boot框架自帶全方位的監(jiān)控禾锤,這樣,做spring boot應(yīng)用的監(jiān)控簡直是太方便了卧波。
00 前言
在當下流行的Service Mesh架構(gòu)中时肿,由于Spring boot框架的種種優(yōu)點,它特別適合作為其中的應(yīng)用開發(fā)框架港粱。
說到Service Mesh的微服務(wù)架構(gòu)螃成,主要特點是將服務(wù)開發(fā)和服務(wù)治理分離開來,然后再結(jié)合容器化的Paas平臺查坪,將它們?nèi)诤掀饋泶绾辏@依賴的都是互相之間默契的配合。也就是說各自都暴露出標準的接口偿曙,可以通過這些接口互相交織在一起氮凝。
Service Mesh的架構(gòu)設(shè)計中的要點之一,就是全方位的監(jiān)控望忆,因此一般我們選用的服務(wù)開發(fā)框架都需要有方便又強大的監(jiān)控功能支持罩阵。在Spring boot應(yīng)用中開啟監(jiān)控特別方便,監(jiān)控面也很廣启摄,還支持靈活定制稿壁。
01 Actuator的使用方法
在Spring boot應(yīng)用中,要實現(xiàn)可監(jiān)控的功能歉备,依賴的是 spring-boot-starter-actuator
這個組件傅是。它提供了很多監(jiān)控和管理你的spring boot應(yīng)用的HTTP或者JMX端點,并且你可以有選擇地開啟和關(guān)閉部分功能蕾羊。當你的spring boot應(yīng)用中引入下面的依賴之后喧笔,將自動的擁有審計、健康檢查龟再、Metrics監(jiān)控功能书闸。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
具體的使用方法:
- 引入上述的依賴jar;
- 通過下面的配置啟用所有的監(jiān)控端點利凑,默認情況下浆劲,這些端點是禁用的;
management:
endpoints:
web:
exposure:
include: "*"
“*”號代表啟用所有的監(jiān)控端點截碴,可以單獨啟用,例如蛉威,health
日丹,info
,metrics
等蚯嫌。
- 通過
actuator/+端點名
就可以獲取相應(yīng)的信息哲虾。
一般的監(jiān)控管理端點的配置信息丙躏,如下:
management:
endpoints:
web:
exposure:
include: "*"
server:
port: 10111
servlet:
context-path: /
ssl:
enabled: false
endpoint:
health:
show-details: always
上述配置信息僅供參考,具體須參照官方文檔束凑,由于spring boot的版本更新比較快晒旅,配置方式可能有變化。
02 健康檢查
今天重點說一下Actuator監(jiān)控管理中的健康檢查功能汪诉,隨時能掌握線上應(yīng)用的健康狀況是非常重要的废恋,尤其是現(xiàn)在流行的容器云平臺下的應(yīng)用,它們的自動恢復和擴容都依賴健康檢查功能扒寄。
當我們開啟health
的健康端點時鱼鼓,我們能夠查到應(yīng)用健康信息是一個匯總的信息,訪問http://127.0.0.1:10111/actuator/health
時该编,我們獲取到的信息是{"status":"UP"}
迄本,status的值還有可能是 DOWN。
要想查看詳細的應(yīng)用健康信息需要配置management.endpoint.health.show-details
的值為always
课竣,配置之后我們再次訪問http://127.0.0.1:10111/actuator/health
嘉赎,獲取的信息如下:
{
"status": "UP",
"details": {
"diskSpace": {
"status": "UP",
"details": {
"total": 250685575168,
"free": 172252426240,
"threshold": 10485760
}
},
"redis": {
"status": "UP",
"details": {
"version": "3.2.11"
}
},
"db": {
"status": "UP",
"details": {
"database": "Oracle",
"hello": "Hello"
}
}
}
}
從上面的應(yīng)用的詳細健康信息發(fā)現(xiàn),健康信息包含磁盤空間于樟、redis公条、DB,啟用監(jiān)控的這個spring boot應(yīng)用確實是連接了redis和oracle DB隔披,actuator就自動給監(jiān)控起來了赃份,確實是很方便、很有用奢米。
經(jīng)過測試發(fā)現(xiàn)抓韩,details中所有的監(jiān)控項中的任何一個健康狀態(tài)是DOWN
,整體應(yīng)用的健康狀態(tài)也是DOWN
鬓长。
management.endpoint.health.show-details
的值除了always
之外還有when-authorized
谒拴、never
,默認值是never
涉波。
03 健康檢查的原理
Spring boot的健康信息都是從ApplicationContext
中的各種HealthIndicator
Beans中收集到的英上,Spring boot框架中包含了大量的HealthIndicators
的實現(xiàn)類,當然你也可以實現(xiàn)自己認為的健康狀態(tài)啤覆。
默認情況下苍日,最終的spring boot應(yīng)用的狀態(tài)是由HealthAggregator
匯總而成的,匯總的算法是:
- 設(shè)置狀態(tài)碼順序:
setStatusOrder(Status.DOWN, Status.OUT_OF_SERVICE, Status.UP, Status.UNKNOWN);
窗声。 - 過濾掉不能識別的狀態(tài)碼相恃。
- 如果無任何狀態(tài)碼,整個spring boot應(yīng)用的狀態(tài)是
UNKNOWN
笨觅。 - 將所有收集到的狀態(tài)碼按照 1 中的順序排序拦耐。
- 返回有序狀態(tài)碼序列中的第一個狀態(tài)碼耕腾,作為整個spring boot應(yīng)用的狀態(tài)。
源代碼請參見:
org.springframework.boot.actuate.health.OrderedHealthAggregator
杀糯。
Spring boot框架自帶的 HealthIndicators
目前包括:
Name | Description |
---|---|
CassandraHealthIndicator |
Checks that a Cassandra database is up. |
DiskSpaceHealthIndicator |
Checks for low disk space. |
DataSourceHealthIndicator |
Checks that a connection to DataSource can be obtained. |
ElasticsearchHealthIndicator |
Checks that an Elasticsearch cluster is up. |
InfluxDbHealthIndicator |
Checks that an InfluxDB server is up. |
JmsHealthIndicator |
Checks that a JMS broker is up. |
MailHealthIndicator |
Checks that a mail server is up. |
MongoHealthIndicator |
Checks that a Mongo database is up. |
Neo4jHealthIndicator |
Checks that a Neo4j server is up. |
RabbitHealthIndicator |
Checks that a Rabbit server is up. |
RedisHealthIndicator |
Checks that a Redis server is up. |
SolrHealthIndicator |
Checks that a Solr server is up. |
你可以通過
management.health.defaults.enabled
這個配置項將它們?nèi)拷玫羯ò常部梢酝ㄟ^management.health.xxxx.enabled
將其中任意一個禁用掉。
04 自定義 HealthIndicator 健康檢查
有時候需要提供自定義的健康狀態(tài)檢查信息固翰,你可以通過實現(xiàn)HealthIndicator
的接口來實現(xiàn)狼纬,并將該實現(xiàn)類注冊為spring bean。你需要實現(xiàn)其中的health()
方法倦挂,并返回自定義的健康狀態(tài)響應(yīng)信息畸颅,該響應(yīng)信息應(yīng)該包括一個狀態(tài)碼和要展示詳細信息。例如方援,下面就是一個接口HealthIndicator
的實現(xiàn)類:
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class MyHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
}
另外没炒,除了Spring boot定義的幾個狀態(tài)類型,我們也可以自定義狀態(tài)類型犯戏,用來表示一個新的系統(tǒng)狀態(tài)送火。在這種情況下,你還需要實現(xiàn)接口 HealthAggregator
先匪,或者通過配置 management.health.status.order
來繼續(xù)使用HealthAggregator
的默認實現(xiàn)种吸。
例如,在你自定義的健康檢查HealthIndicator
的實現(xiàn)類中呀非,使用了自定義的狀態(tài)類型FATAL
坚俗,為了配置該狀態(tài)類型的嚴重程度,你需要在application的配置文件中添加如下配置:
management.health.status.order=FATAL, DOWN, OUT_OF_SERVICE, UNKNOWN, UP
在做健康檢查時岸裙,響應(yīng)中的HTTP狀態(tài)碼反應(yīng)了整體的健康狀態(tài)猖败,(例如,UP
對應(yīng) 200, 而 OUT_OF_SERVICE
和 DOWN
對應(yīng) 503)降允。同樣恩闻,你也需要為自定義的狀態(tài)類型設(shè)置對應(yīng)的HTTP狀態(tài)碼,例如剧董,下面的配置可以將 FATAL
映射為 503(服務(wù)不可用):
management.health.status.http-mapping.FATAL=503
如果你需要更多的控制幢尚,你可以定義自己的
HealthStatusHttpMapper
bean。
下面是內(nèi)置健康狀態(tài)類型對應(yīng)的HTTP狀態(tài)碼列表:
Status | Mapping |
---|---|
DOWN | SERVICE_UNAVAILABLE (503) |
OUT_OF_SERVICE | SERVICE_UNAVAILABLE (503) |
UP | No mapping by default, so http status is 200 |
UNKNOWN | No mapping by default, so http status is 200 |
05 結(jié)束
本文主要介紹了Spring boot中提供的應(yīng)用健康檢查功能的使用方法和原理翅楼,順帶介紹了一點 Actuator 的內(nèi)容尉剩。主要的內(nèi)容來自spring boot 2.0.1的官方文檔 和 源碼,還有一些自己的想法毅臊,希望多多支持理茎。