Spring Boot Actuator自定义健康检查教程
作者:梦想画家 发布时间:2022-06-12 14:54:59
健康检查是Spring Boot Actuator中重要端点之一,可以非常容易查看应用运行至状态。本文在前文的基础上介绍如何自定义健康检查。
1. 概述
本节我们简单说明下依赖及启用配置,展示缺省健康信息。首先需要引入依赖:
compile("org.springframework.boot:spring-boot-starter-actuator")
现在通过http://localhost:8080/actuator/health端点进行验证:
{"status":"UP"}
缺省该端点返回应用中很多组件的汇总健康信息,但可以修改属性配置展示详细内容:
management:
endpoint:
health:
show-details: always
现在再次访问返回结果如下:
{
"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;
}
}
上面结果显示当前项目启动的路径 . ,报警值 为10M ,这些属性都可以通过配置进行修改。
2. 预定义健康指标
上面Json响应显示“ping”和“diskSpace”检查。这些检查也称为健康指标,如果应用引用了数据源,Spring会增加db健康指标;同时“diskSpace”是缺省配置。
Spring Boot包括很多预定义的健康指标,下面列出其中一部分:
DataSourceHealthIndicator
MongoHealthIndicator
Neo4jHealthIndicator
CassandraHealthIndicator
RedisHealthIndicator
CassandraHealthIndicator
RabbitHealthIndicator
CouchbaseHealthIndicator
DiskSpaceHealthIndicator
(见上面示例)ElasticsearchHealthIndicator
InfluxDbHealthIndicator
JmsHealthIndicator
MailHealthIndicator
SolrHealthIndicator
如果在Spring Boot应用中使用Mongo或Solr等,则Spring Boot会自动增加相应健康指标。
3. 自定义健康指标
Spring Boot提供了一捆预定义健康指标,但并没有阻止你增加自己的健康指标。一般有两种自定义类型检查:
单个健康指标组件和组合健康指标组件。
3.1 自定义单个指标组件
自定义需要实现HealthIndicator接口并重新health()方法,同时增加@Component注解。假设示例应用程序与服务A(启动)和服务B(关闭)通信。如果任一服务宕机,应用程序将被视为宕机。因此,我们将写入两个运行状况指标。
@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;
}
}
现在,我们看到健康监控响应中增加的指标。ServerA状态是UP,ServiceB是DOWN,因此整个监控检测状态为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 自定义组合健康检查
前面示例很容易查看各个指标各自的状态。但有时需要基于几个指标查看资源的状态,则需要使用 HealthContributor ,该接口没有定义方法,仅用于标记。如果一个服务有另外两个动作组合进行实现,只有两者同时工作该服务状态才算正常。最后使用 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);
}
}
现在我们使用serverA和serverB组合新的检查UserServiceAPI。
4. 总结
本文我们学习了Spring Boot健康指标及相关配置、以及预定义的健康指标,同时介绍了如何自定义健康指标。
来源:https://blog.csdn.net/neweastsun/article/details/108933365


猜你喜欢
- 之前我写过直接用国内镜像的IP地址端口进行配置国内镜像的,如下链接:Android studio配置国内镜像源但是这种方法不一定在每台电脑上
- 前言我相信很多Android开发同学都遇到过这样的需求: 1.实现一个Splash界面,界面上有应用相关的背景图片和一个开始按钮.
- 废话不多说,咱们第一篇文章就是模仿“知乎”的回答详情页的动画效果,先上个原版的效果图,咱们就是要做出这个效果 &nbs
- .Net为我们提供了众多的泛型集合。比如,Stack<T>先进后出,Queue<T>先进先出,List<T&g
- 一. 为什么需要比较对象上一节介绍了优先级队列,在优先级队列中插入的元素必须能比较大小,如果不能比较大小,如插入两个学生类型的元素,会报Cl
- 本文实例为大家分享了JavaFX实现简单日历效果的具体代码,供大家参考,具体内容如下1.先看效果:2.代码:1)ClockEdge.java
- 最近准备整理一套关于UI效果的文章,算是对这段时间的一个总结,主要讲Android开发中的UI效果设计模块。初步分为一下几个篇幅:Andro
- C#一些延时函数sleep延时方法System.Threading.Thread.Sleep(1000); //毫秒实现的是非独占性延时函数
- 一、背景新做了一个的需求,需要在SpringBoot项目中引入了多个依赖,然后就感觉idea下载依赖包的时间很漫长,然后我就网上找了解决办法
- Kotlin定义变量一般有如下写法lateinit var name: String var age: String? = null那么用l
- 介绍Java中介者模式(Mediator Pattern)是一种行为设计模式,它可以降低多个对象之间的耦合性,通过一个中介者对象来协调这些对
- 在常见场景下:返回数据建议使用map,不建议使用实体对象 /** * 1. 名字包含雨并且年龄小于40  
- 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很
- 很不错的手电筒APP,分享给大家,希望大家喜欢。1. Java代码 package com.
- 众所周知在android7.0,修改了对私有存储的限制,导致在获取资源的时候,不能通过Uri.fromFile来获取uri了我们需要适配7.
- ActionBar的引入方式:有几种,从 Android 3.0(API lever 11) 开始,所有使用 Theme.Holo 主题(或
- 当我们需要在Unity客户端做一个限制功能,比如按钮 (最好是发送验证码按钮)要求每天只能点击三次,等到第二天又有三次机会,这个过程不涉及到
- 本文实例为大家分享了C#用timer实现背单词小程序的具体代码,供大家参考,具体内容如下看到网上有类似的教程视频实现单词本,于是自己敲了一个
- 最近由于参加一个小小的创意比赛,用安卓做了一个小小的图片识别应用,主要是通过拍照识别图片中的菜品,还有对象位置查找的东西。之前没有做过安卓,
- 前言在前面的文章中其实大家也已经看到我使用过collect(Collectors.toList()) 将数据最后汇总成一个 List 集合。