Spring Boot Actuator自定義健康檢查教程
健康檢查是Spring Boot Actuator中重要端點之一,可以非常容易查看應(yīng)用運行至狀態(tài)。本文在前文的基礎(chǔ)上介紹如何自定義健康檢查。
1. 概述
本節(jié)我們簡單說明下依賴及啟用配置,展示缺省健康信息。首先需要引入依賴:
compile("org.springframework.boot:spring-boot-starter-actuator")
現(xiàn)在通過http://localhost:8080/actuator/health端點進行驗證:
{"status":"UP"}
缺省該端點返回應(yīng)用中很多組件的匯總健康信息,但可以修改屬性配置展示詳細內(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é)果顯示當前項目啟動的路徑 . ,報警值 為10M ,這些屬性都可以通過配置進行修改。
2. 預定義健康指標
上面Json響應(yīng)顯示“ping”和“diskSpace”檢查。這些檢查也稱為健康指標,如果應(yīng)用引用了數(shù)據(jù)源,Spring會增加db健康指標;同時“diskSpace”是缺省配置。
Spring Boot包括很多預定義的健康指標,下面列出其中一部分:
DataSourceHealthIndicatorMongoHealthIndicatorNeo4jHealthIndicatorCassandraHealthIndicatorRedisHealthIndicatorCassandraHealthIndicatorRabbitHealthIndicatorCouchbaseHealthIndicatorDiskSpaceHealthIndicator(見上面示例)ElasticsearchHealthIndicatorInfluxDbHealthIndicatorJmsHealthIndicatorMailHealthIndicatorSolrHealthIndicator
如果在Spring Boot應(yīng)用中使用Mongo或Solr等,則Spring Boot會自動增加相應(yīng)健康指標。
3. 自定義健康指標
Spring Boot提供了一捆預定義健康指標,但并沒有阻止你增加自己的健康指標。一般有兩種自定義類型檢查:
單個健康指標組件和組合健康指標組件。
3.1 自定義單個指標組件
自定義需要實現(xiàn)HealthIndicator接口并重新health()方法,同時增加@Component注解。假設(shè)示例應(yīng)用程序與服務(wù)A(啟動)和服務(wù)B(關(guān)閉)通信。如果任一服務(wù)宕機,應(yīng)用程序?qū)⒈灰暈殄礄C。因此,我們將寫入兩個運行狀況指標。
@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)中增加的指標。ServerA狀態(tài)是UP,ServiceB是DOWN,因此整個監(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 自定義組合健康檢查
前面示例很容易查看各個指標各自的狀態(tài)。但有時需要基于幾個指標查看資源的狀態(tài),則需要使用 HealthContributor ,該接口沒有定義方法,僅用于標記。如果一個服務(wù)有另外兩個動作組合進行實現(xiàn),只有兩者同時工作該服務(wù)狀態(tài)才算正常。最后使用 CompositeHealthContributors組合多個指標:
public class ServiceAHealthIndicator
implements HealthIndicator, HealthContributor {
...
}
下面定義組合健康檢查指標:
@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é)
本文我們學習了Spring Boot健康指標及相關(guān)配置、以及預定義的健康指標,同時介紹了如何自定義健康指標。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java 實現(xiàn)下壓棧的操作(能動態(tài)調(diào)整數(shù)組大小)
這篇文章主要介紹了java 實現(xiàn)下壓棧的操作(能動態(tài)調(diào)整數(shù)組大小),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
springboot+VUE前后端分離實現(xiàn)疫情防疫平臺JAVA
本文主要使用了Java、springmvc、VUE、node.js、mybatis、mysql、tomcat、jquery、layui、bootstarp、JavaScript、html、css、jsp、log4j等一些常見的基本技術(shù),實現(xiàn)一個疫情防疫小平臺2021-08-08
springboot實現(xiàn)添加郵件發(fā)送及壓縮功能
這篇文章主要介紹了springboot實現(xiàn)添加郵件發(fā)送及壓縮功能 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07
Java?properties?和?yml?的區(qū)別解析
properties和yml都是Spring?Boot支持的兩種配置文件,它們可以看做Spring?Boot在不同時期的兩種“產(chǎn)品”,這篇文章主要介紹了Java?properties?和?yml?的區(qū)別,需要的朋友可以參考下2023-02-02

