Spirng boot 启动的时候进行监控检查不通过停止服务与自定义健康监控节点
基于 spring-boot-starter-actuator health节点检查
• 前提条件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
• 健康节点http请求地址:
• 健康状态响应数据:
{
"description": "Composite Discovery Client",
"status": "UP",
"discoveryComposite": {
"description": "Composite Discovery Client",
"status": "UP",
"discoveryClient": {
"description": "Composite Discovery Client",
"status": "UP",
"services": [
"fileservice",
"dj-atliwen-edi-mqconsumption"
]
},
"eureka": {
"description": "Eureka discovery client has not yet successfully connected to a Eureka server",
"status": "UP",
"applications": {
"SPRING-CLOUD-ZIPKIN": 1,
"DJ-WANGRUI-EDI-GLOBAL": 1
}
}
},
"diskSpace": {
"status": "UP",
"total": 285775753216,
"free": 173917204480,
"threshold": 10485760
},
"rabbit": {
"status": "UP",
"version": "3.7.7"
},
"db": {
"status": "UP",
"database": "MySQL",
"hello": 1
},
"binders": {
"status": "UP",
"rabbit": {
"status": "UP",
"binderHealthIndicator": {
"status": "UP",
"version": "3.7.7"
}
}
},
"configServer": {
"status": "UP",
"propertySources": [
"configClient",
"http://10.10.7.60:20080/zygfengyuwuzu/config-dev.git/application.yml"
]
},
"hystrix": {
"status": "UP"
}
}
• 异常状态响应数据:
{
"status": "DOWN",
"discoveryComposite": {
"description": "Composite Discovery Client",
"status": "UP",
"discoveryClient": {
"description": "Composite Discovery Client",
"status": "UP",
"services": [
"fileservice",
"security-wo-remote"
]
},
"eureka": {
"description": "Eureka discovery client has not yet successfully connected to a Eureka server",
"status": "UP",
"applications": {
"SPRING-CLOUD-ZIPKIN": 1,
"DJ-WANGRUI-EDI-GLOBAL": 1
}
}
},
"diskSpace": {
"status": "UP",
"total": 285775753216,
"free": 173917204480,
"threshold": 10485760
},
"rabbit": {
"status": "UP",
"version": "3.7.7"
},
"db": {
"status": "DOWN",
"error": "org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up."
},
"binders": {
"status": "UP",
"rabbit": {
"status": "UP",
"binderHealthIndicator": {
"status": "UP",
"version": "3.7.7"
}
}
},
"configServer": {
"status": "UP",
"propertySources": [
"configClient",
"http://10.10.7.60:20080/zygfengyuwuzu/config-dev.git/application.yml"
]
},
"hystrix": {
"status": "UP"
}
}
• 异常恢复之后响应数据:
{
"description": "Composite Discovery Client",
"status": "UP",
"discoveryComposite": {
"description": "Composite Discovery Client",
"status": "UP",
"discoveryClient": {
"description": "Composite Discovery Client",
"status": "UP",
"services": [
"fileservice",
"security-wo-remote"
]
},
"eureka": {
"description": "Eureka discovery client has not yet successfully connected to a Eureka server",
"status": "UP",
"applications": {
"SPRING-CLOUD-ZIPKIN": 1,
"DJ-WANGRUI-EDI-GLOBAL": 1
}
}
},
"diskSpace": {
"status": "UP",
"total": 285775753216,
"free": 173917155328,
"threshold": 10485760
},
"rabbit": {
"status": "UP",
"version": "3.7.7"
},
"db": {
"status": "UP",
"database": "MySQL",
"hello": 1
},
"binders": {
"status": "UP",
"rabbit": {
"status": "UP",
"binderHealthIndicator": {
"status": "UP",
"version": "3.7.7"
}
}
},
"configServer": {
"status": "UP",
"propertySources": [
"configClient",
"http://10.10.7.60:20080/zygfengyuwuzu/config-dev.git/application.yml"
]
},
"hystrix": {
"status": "UP"
}
}
• 自定义健康节点:异常状态
{
"status": "DOWN",
"test": {
"status": "DOWN",
"Error Code": 1
},
"discoveryComposite": {
"description": "Composite Discovery Client",
"status": "UP",
"discoveryClient": {
"description": "Composite Discovery Client",
"status": "UP",
"services": [
"fileservice",
"dj-atliwen-edi-mqconsumption"
]
},
"eureka": {
"description": "Eureka discovery client has not yet successfully connected to a Eureka server",
"status": "UP",
"applications": {
"SPRING-CLOUD-ZIPKIN": 1,
"SPRING-CLOUD-DASHBOARD": 1
}
}
},
"diskSpace": {
"status": "UP",
"total": 285775753216,
"free": 173916606464,
"threshold": 10485760
},
"rabbit": {
"status": "UP",
"version": "3.7.7"
},
"db": {
"status": "UP",
"database": "MySQL",
"hello": 1
},
"binders": {
"status": "UP",
"rabbit": {
"status": "UP",
"binderHealthIndicator": {
"status": "UP",
"version": "3.7.7"
}
}
},
"configServer": {
"status": "UP",
"propertySources": [
"configClient",
"http://10.10.7.60:20080/zygfengyuwuzu/config-dev.git/application.yml"
]
},
"hystrix": {
"status": "UP"
}
}
• 自定义健康监控节点 :正常状态
{
"status": "UP",
"test": {
"status": "UP"
},
"discoveryComposite": {
"description": "Composite Discovery Client",
"status": "UP",
"discoveryClient": {
"description": "Composite Discovery Client",
"status": "UP",
"services": [
"fileservice",
"dj-atliwen-edi-mqconsumption"
]
},
"eureka": {
"description": "Eureka discovery client has not yet successfully connected to a Eureka server",
"status": "UP",
"applications": {
"SPRING-CLOUD-ZIPKIN": 1,
"DJ-WANGRUI-EDI-GLOBAL": 1
}
}
},
"diskSpace": {
"status": "UP",
"total": 285775753216,
"free": 173916557312,
"threshold": 10485760
},
"rabbit": {
"status": "UP",
"version": "3.7.7"
},
"db": {
"status": "UP",
"database": "MySQL",
"hello": 1
},
"binders": {
"status": "UP",
"rabbit": {
"status": "UP",
"binderHealthIndicator": {
"status": "UP",
"version": "3.7.7"
}
}
},
"configServer": {
"status": "UP",
"propertySources": [
"configClient",
"http://10.10.7.60:20080/zygfengyuwuzu/config-dev.git/application.yml"
]
},
"hystrix": {
"status": "UP"
}
}
• Spring boot 启动后执行健康检查节点
/**
* @author 李文
* @create 2019-03-14 16:22
**/
@Slf4j
@Component
public class HealthApplication implements ApplicationRunner
{
@Autowired
ConfigurableApplicationContext applicationContext;
@Override
public void run(ApplicationArguments applicationArguments) {
Map<String, HealthIndicator> handcars = applicationContext.getBeansOfType(HealthIndicator.class);
boolean b = true;
for (Map.Entry<String, HealthIndicator> entry : handcars.entrySet()) {
log.error(" entry.getValue() " + entry.getValue().getClass());
Health health = entry.getValue().health();
if (!health.getStatus().equals(Status.UP)) {
log.error(" 启动健康检查异常 {} ", health.toString());
b = false;
}
}
if (!b) {
applicationContext.close();
}
}
}
• 自定义健康监控节点
/**
* 自定义健康监控节点
*
* @author 李文
* @create 2019-03-14 14:14
**/
@Component
public class TestHealthIndicator implements HealthIndicator
{
@Override
public Health health() {
int errorCode = check();
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
private int check() {
return 0;
}
}
补充信息:
默认状态节点名称为类名称 如 TestHealthIndicator 为 test 节点
非spring boot 项目也可以集成。
HealthIndicator组件只带的检查项
CassandraHealthIndicator 检查Cassandra数据库状况 (介于关系数据库和非关系数据库之间的开源产品,是最像关系数据库的NOSQL数据库)
DiskSpaceHealthIndicator 低磁盘空间检查 (10 * 1024 * 1024 单位是bytes)
DataSourceHealthIndicator 检查是否能从DataSource获取连接 (检查数据库情况 只支持spring-boot-data-jpa)
关键代码:
private JdbcTemplate jdbcTemplate;
private static final String DEFAULT_QUERY = "SELECT 1";
this.jdbcTemplate.query()
builder.withDetail("hello", result);
ElasticsearchHealthIndicator 检查Elasticsearch集群状况
JmsHealthIndicator 检查JMS消息代理状况
MailHealthIndicator 检查邮件服务器状况
MongoHealthIndicator 检查Mongo数据库状况
RabbitHealthIndicator 检查Rabbit服务器状况
RedisHealthIndicator 检查Redis服务器状况
SolrHealthIndicator 检查Solr服务器状况
ConfigServerHealthIndicator 检查是否能够读取配置文件(在应用配置中心Maven 后才生效)
关键日志信息:
Registering application zjs-crypto with eureka with status UP
//通知注册中心当前状态修改为UP
Saw local status change event StatusChangeEvent [timestamp=1552551178514, current=UP, previous=STARTING]
DiscoveryClient_ZJS-CRYPTO/10.10.12.27:zjs-crypto:11001: registering service…
// 通知请求执行成功
DiscoveryClient_ZJS-CRYPTO/10.10.12.27:zjs-crypto:11001 - registration status: 204
//健康检查异常
启动健康检查异常 UNKNOWN {error=no property sources located}
Unregistering application zjs-crypto with eureka with status DOWN
//通知注册中心修改当前状态为DOWN
Saw local status change event StatusChangeEvent [timestamp=1552551180100, current=DOWN, previous=UP]
DiscoveryClient_ZJS-CRYPTO/10.10.12.27:zjs-crypto:11001: registering service…
// 通知请求执行成功
DiscoveryClient_ZJS-CRYPTO/10.10.12.27:zjs-crypto:11001 - registration status: 204
实际触发的验证类:
自定义健康监控节点类
com.zjs.password.healthIndicator.CustomHealthIndicator
com.zjs.password.healthIndicator.TestHealthIndicator
Spirng boot 相关包自带的健康监控节点类
org.springframework.cloud.client.discovery.health.DiscoveryCompositeHealthIndicator
org.springframework.boot.actuate.health.DiskSpaceHealthIndicator
org.springframework.boot.actuate.health.RabbitHealthIndicator
org.springframework.boot.actuate.health.DataSourceHealthIndicator
org.springframework.boot.actuate.health.CompositeHealthIndicator
org.springframework.cloud.config.client.ConfigServerHealthIndicator
注意!
请使用spring boot 支持的组件。尤其是数据库,只针对 spring-boot-data-jpa !! 如使用其他数据库 请自定义健康节点方法自行实现。
注意! 不读取配置文件已算是健康检查失败!
PS : 根据引入的maven包不通,所以触发的健康验证类也不一样。可想而知,是不同的包自己实现自己的健康验证方法。
Spirng boot 启动的时候进行监控检查不通过停止服务与自定义健康监控节点的更多相关文章
- 我的前端故事----来聊聊react-native应用的健康监控
监控什么 今天我们来聊聊如何监控你的应用程序,这里的监控说的不是让我们去监控用户,而是监控应用的健康状态,什么是健康状态呢?对于后端的同学来说,在微服务的架构下,每个子服务是否正常工作.返回的结果是否 ...
- Security基础(六):部署Zabbix监控平台、配置及使用Zabbix监控系统、自定义Zabbix监控项目、实现Zabbix报警功能
一.部署Zabbix监控平台 目标: 本案例要求部署一台Zabbix监控服务器,一台被监控主机,为进一步执行具体的监控任务做准备: 在监控服务器上安装LAMP环境 修改PHP配置文件,满足Zab ...
- Spring Boot启动过程(七):Connector初始化
Connector实例的创建已经在Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动中提到了: Connector是LifecycleMBeanBase的子类,先是设置L ...
- Spring Boot 启动原理分析
https://yq.aliyun.com/articles/6056 转 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启 ...
- S3C6410 纯粹的裸机启动,自己写的SD BOOT启动
这几天晚上一直折腾S3C6410的裸机SD卡启动,不大想使用UBOOT,我是搞硬件的,对底层非常感兴趣,不喜欢已经写好的,因此自己一直在尝试,其实很早之前就试过SD卡启动,也就是ARM11上电后会把S ...
- Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动
之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat. private void cr ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十五):系统服务监控
系统服务监控 新建监控工程 新建Spring Boot项目,取名 kitty-monitor,结构如下. 添加项目依赖 添加 spring boot admin 的相关依赖. pom.xml < ...
- Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 健康监控
文章目录 1. 内置 HealthIndicator 监控检测 2. 自定义 HealthIndicator 监控检测 3. 源代码 Health 信息是从 ApplicationContext 中所 ...
- Spring Boot启动过程及回调接口汇总
Spring Boot启动过程及回调接口汇总 链接: https://www.itcodemonkey.com/article/1431.html 来自:chanjarster (Daniel Qia ...
随机推荐
- dedecms如何增加自定义字段
开源的cms比较好的一点是可以根据自己的需求来开发相应的功能,比如dedecms想要增加一个专家职称字段调用要怎么调用呢? 增加自定义字段:后台找到 “核心” - 频道模型 - 内容模型管理 - 字段 ...
- 为帝国cms模板添加站内搜索小教程
由于客户的需要,最近都在整帝国cms,很多东西还是不熟悉,特别是帝国cms模板,以前用的那些网站模板一般是保存在ftp文件中,而帝国cms模板是直接保存在数据库中,修改是在网站后台的模板管理,得慢慢适 ...
- python排序函数sort()与sorted()区别
sort是容器的函数:sort(cmp=None, key=None, reverse=False) sorted是python的内建函数:sorted(iterable, cmp=None, key ...
- PAT 1003 Emergency[图论]
1003 Emergency (25)(25 分) As an emergency rescue team leader of a city, you are given a special map ...
- marquee实现跑马灯
<!DOCTYPE html><html> <head><title>跑马灯大全</title> </head> <bod ...
- CodeForces - 946D Timetable (分组背包+思维)
题意 n天的课程,每天有m个时间单位.若时间i和j都有课,那么要在学校待\(j-i+1\)个时间.现在最多能翘k节课,问最少能在学校待多少时间. 分析 将一天的内容视作一个背包的组,可以预处理出该天内 ...
- EditPlus 4.3.2543 中文版已经发布(2月3日更新,Emmet 功能回归)
新的 EditPlus 版本修复了 Emmet 组件的安全问题. 现在 Emmet 编辑功能又回来啦. 下载连接在页面左上角!
- BabelMap 10.0.0.5 汉化版已经发布
新的 BabelMap 调整了用户体验的一些细节.修正了西夏语表意文字序列.修正了一些文字显示不全的问题. 请点击页面左上角连接,进入下载页面下载.
- Linux基础命令---gunzip
gunzip 解压缩被gzip压缩过的文件.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 gunzip [-ac ...
- linux查看是否有某个运行的进程命令
linux查看是否有某个运行的进程命令:例如,查询是否包含 “my_post” 关键字的进程 ps aux | grep my_post ps aux | grep my_post | grep - ...