Spring Boot Actuator自定義健康檢查教程
健康檢查是Spring Boot Actuator中重要端點(diǎn)之一,可以非常容易查看應(yīng)用運(yùn)行至狀態(tài)。本文在前文的基礎(chǔ)上介紹如何自定義健康檢查。
1. 概述
本節(jié)我們簡單說明下依賴及啟用配置,展示缺省健康信息。首先需要引入依賴:
compile("org.springframework.boot:spring-boot-starter-actuator")
現(xiàn)在通過http://localhost:8080/actuator/health端點(diǎn)進(jìn)行驗(yàn)證:
{"status":"UP"}
缺省該端點(diǎn)返回應(yīng)用中很多組件的匯總健康信息,但可以修改屬性配置展示詳細(xì)內(nèi)容:
management: endpoint: health: show-details: always
現(xiàn)在再次訪問返回結(jié)果如下:
{ "status": "UP", "components": { "diskSpace": { "status": "UP", "details": { "total": 214748360704, "free": 112483500032, "threshold": 10485760, "exists": true } }, "ping": { "status": "UP" } } }
查看DiskSpaceHealthIndicatorProperties文件的源碼:
@ConfigurationProperties(prefix = "management.health.diskspace") public class DiskSpaceHealthIndicatorProperties { /** * Path used to compute the available disk space. */ private File path = new File("."); /** * Minimum disk space that should be available. */ private DataSize threshold = DataSize.ofMegabytes(10); public File getPath() { return this.path; } public void setPath(File path) { this.path = path; } public DataSize getThreshold() { return this.threshold; } public void setThreshold(DataSize threshold) { Assert.isTrue(!threshold.isNegative(), "threshold must be greater than or equal to 0"); this.threshold = threshold; } }
上面結(jié)果顯示當(dāng)前項(xiàng)目啟動(dòng)的路徑 . ,報(bào)警值 為10M ,這些屬性都可以通過配置進(jìn)行修改。
2. 預(yù)定義健康指標(biāo)
上面Json響應(yīng)顯示“ping”和“diskSpace”檢查。這些檢查也稱為健康指標(biāo),如果應(yīng)用引用了數(shù)據(jù)源,Spring會(huì)增加db健康指標(biāo);同時(shí)“diskSpace”是缺省配置。
Spring Boot包括很多預(yù)定義的健康指標(biāo),下面列出其中一部分:
DataSourceHealthIndicator
MongoHealthIndicator
Neo4jHealthIndicator
CassandraHealthIndicator
RedisHealthIndicator
CassandraHealthIndicator
RabbitHealthIndicator
CouchbaseHealthIndicator
DiskSpaceHealthIndicator
(見上面示例)ElasticsearchHealthIndicator
InfluxDbHealthIndicator
JmsHealthIndicator
MailHealthIndicator
SolrHealthIndicator
如果在Spring Boot應(yīng)用中使用Mongo或Solr等,則Spring Boot會(huì)自動(dòng)增加相應(yīng)健康指標(biāo)。
3. 自定義健康指標(biāo)
Spring Boot提供了一捆預(yù)定義健康指標(biāo),但并沒有阻止你增加自己的健康指標(biāo)。一般有兩種自定義類型檢查:
單個(gè)健康指標(biāo)組件和組合健康指標(biāo)組件。
3.1 自定義單個(gè)指標(biāo)組件
自定義需要實(shí)現(xiàn)HealthIndicator接口并重新health()方法,同時(shí)增加@Component注解。假設(shè)示例應(yīng)用程序與服務(wù)A(啟動(dòng))和服務(wù)B(關(guān)閉)通信。如果任一服務(wù)宕機(jī),應(yīng)用程序?qū)⒈灰暈殄礄C(jī)。因此,我們將寫入兩個(gè)運(yùn)行狀況指標(biāo)。
@Component public class ServiceAHealthIndicator implements HealthIndicator { private final String message_key = "Service A"; @Override public Health health() { if (!isRunningServiceA()) { return Health.down().withDetail(message_key, "Not Available").build(); } return Health.up().withDetail(message_key, "Available").build(); } private Boolean isRunningServiceA() { Boolean isRunning = true; // Logic Skipped return isRunning; } }
@Component public class ServiceBHealthIndicator implements HealthIndicator { private final String message_key = "Service B"; @Override public Health health() { if (!isRunningServiceB()) { return Health.down().withDetail(message_key, "Not Available").build(); } return Health.up().withDetail(message_key, "Available").build(); } private Boolean isRunningServiceB() { Boolean isRunning = false; // Logic Skipped return isRunning; } }
現(xiàn)在,我們看到健康監(jiān)控響應(yīng)中增加的指標(biāo)。ServerA狀態(tài)是UP,ServiceB是DOWN,因此整個(gè)監(jiān)控檢測狀態(tài)為DOWN.
{ "status": "DOWN", "components": { "diskSpace": { "status": "UP", "details": { "total": 214748360704, "free": 112483229696, "threshold": 10485760, "exists": true } }, "ping": { "status": "UP" }, "serviceA": { "status": "UP", "details": { "Service A": "Available" } }, "serviceB": { "status": "DOWN", "details": { "Service B": "Not Available" } } } }
3.2 自定義組合健康檢查
前面示例很容易查看各個(gè)指標(biāo)各自的狀態(tài)。但有時(shí)需要基于幾個(gè)指標(biāo)查看資源的狀態(tài),則需要使用 HealthContributor ,該接口沒有定義方法,僅用于標(biāo)記。如果一個(gè)服務(wù)有另外兩個(gè)動(dòng)作組合進(jìn)行實(shí)現(xiàn),只有兩者同時(shí)工作該服務(wù)狀態(tài)才算正常。最后使用 CompositeHealthContributors組合多個(gè)指標(biāo):
public class ServiceAHealthIndicator implements HealthIndicator, HealthContributor { ... }
下面定義組合健康檢查指標(biāo):
@Component("UserServiceAPI") public class UserServiceAPIHealthContributor implements CompositeHealthContributor { private Map<String, HealthContributor> contributors = new LinkedHashMap<>(); @Autowired public UserServiceAPIHealthContributor( ServiceAHealthIndicator serviceAHealthIndicator, ServiceBHealthIndicator serviceBHealthIndicator) { contributors.put("serverA", serviceAHealthIndicator); contributors.put("serverB", serviceBHealthIndicator); } /** * return list of health contributors */ @Override public Iterator<NamedContributor<HealthContributor>> iterator() { return contributors.entrySet().stream() .map((entry) -> NamedContributor.of(entry.getKey(), entry.getValue())).iterator(); } @Override public HealthContributor getContributor(String name) { return contributors.get(name); } }
現(xiàn)在我們使用serverA和serverB組合新的檢查UserServiceAPI。
4. 總結(jié)
本文我們學(xué)習(xí)了Spring Boot健康指標(biāo)及相關(guān)配置、以及預(yù)定義的健康指標(biāo),同時(shí)介紹了如何自定義健康指標(biāo)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
多用多學(xué)之Java中的Set,List,Map詳解
下面小編就為大家?guī)硪黄嘤枚鄬W(xué)之Java中的Set,List,Map詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06IntelliJ IDEA修改內(nèi)存大小,使得idea運(yùn)行更流暢
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA修改內(nèi)存大小,使得idea運(yùn)行更流暢的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10創(chuàng)建動(dòng)態(tài)代理對(duì)象bean,并動(dòng)態(tài)注入到spring容器中的操作
這篇文章主要介紹了創(chuàng)建動(dòng)態(tài)代理對(duì)象bean,并動(dòng)態(tài)注入到spring容器中的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02Java實(shí)戰(zhàn)之酒店人事管理系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了如何用Java實(shí)現(xiàn)酒店人事管理系統(tǒng),文中采用的技術(shù)有:JSP、Spring、SpringMVC、MyBatis等,感興趣的小伙伴可以學(xué)習(xí)一下2022-03-03詳解spring security四種實(shí)現(xiàn)方式
這篇文章主要介紹了詳解spring security四種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Java11?中基于嵌套關(guān)系的訪問控制優(yōu)化問題
在?Java?語言中,類和接口可以相互嵌套,這種組合之間可以不受限制的彼此訪問,包括訪問彼此的構(gòu)造函數(shù)、字段、方法,接下來通過本文給大家介紹Java11中基于嵌套關(guān)系的訪問控制優(yōu)化問題,感興趣的朋友一起看看吧2022-01-01