SpringBoot | 第二十七章:监控管理之Actuator使用
前言
随着我们服务越来越多,部署的环境也越来越繁多时,由于各服务都部署在不同的机器上,每当出现问题或者异常时,想快速进行问题的定位就变的麻烦了。所以,本章节开始,开始讲解
SpringBoot的监控相关知识点。本章节就先来说一说,其自带的Actuator功能。
一点知识
Spring Boot Actuator是spring boot项目一个监控模块,提供了很多原生的端点,包含了对应用系统的自省和监控的集成功能,可以查看应用配置的详细信息,比如应用程序上下文里全部的Bean、健康指标、环境变量及各类重要度量指标等等,这些都是使用可HTTP进行请求访问。通过这些监控信息,我们就能随时了解应用的运行情况了。

Actuator实践
特别说明:
最近在编写SpringCloud的教程,使用的是SpringBoot2.x的版本,其和1.x版本是有区别的,需要额外开启端点,默认只开启了info、health两个端点,其他的需要额外去配置的。本教程还是沿用Spring Boot 1.5.15版本来示例。关于2.x的后续再来更新吧,不然会乱了。。
原生端点
原生端点是在应用程序里提供众多 Web 接口,通过它们了解应用程序运行时的内部状况。原生端点又可以分成三类:
- 应用配置类:可以查看应用在运行期的静态信息:例如自动配置信息、加载的springbean信息、yml文件配置信息、环境信息、请求映射信息;
- 度量指标类:主要是运行期的动态信息,例如堆栈、请求连、一些健康指标、metrics信息等;
- 操作控制类:主要是指shutdown,用户可以发送一个请求将应用的监控功能关闭。
官网可以看出,原生的端点很多

以下列举内置的端点相关说明:
| ID | 描述 | 是否需要鉴权 |
|---|---|---|
actuator |
为其他端点提供“发现页面”。要求Spring HATEOAS在classpath路径上。 | 需要 |
auditevents |
陈列当前应用程序的审计事件信息。 | 需要 |
autoconfig |
展示自动配置信息并且显示所有自动配置候选人以及他们“被不被”应用的原因。 | 需要 |
beans |
显示应用程序中所有Spring bean的完整列表。 | 需要 |
configprops |
显示所有配置信息。 | 需要 |
dump |
dump所有线程。 | 需要 |
env |
陈列所有的环境变量。 | 需要 |
flyway |
Shows any Flyway database migrations that have been applied. | 需要 |
health |
显示应用程序运行状况信息 | 不需要 |
info |
显示应用信息。 | 不需要 |
loggers |
显示和修改应用程序中的loggers配置。 | 需要 |
liquibase |
显示已经应用的任何Liquibase数据库迁移。 | 需要 |
metrics |
显示当前应用程序的“指标”信息。 | 需要 |
mappings |
显示所有@RequestMapping的url整理列表。 |
需要 |
shutdown |
关闭应用(默认情况下不启用)。 | 需要 |
trace |
显示跟踪信息(默认最后100个HTTP请求)。 | 需要 |
从官网文档也可以看出,可通过配置文件,修改某端点是否开启,是否需要鉴权访问等

如:
# 这里的id 是指访问的url路径
endpoints.beans.id=springbeans
# 关闭鉴权
endpoints.beans.sensitive=false
# 开启shutdown
endpoints.shutdown.enabled=true
至于以上每个端点实际输出的信息,大家可以看看大佬们的文章或者访问/docs端点里面也有的,常用的命令输出都有示例,这里就不贴了。不然文章看起来就冗长了,哈哈~
命令详解:http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html
访问/docs端点(如何使用下文有说明):

上手实践
0.加入POM依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 加入doc文档 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator-docs</artifactId>
</dependency>
<!-- 开启安全认证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
加入spring-boot-actuator-docs可查看相关文档,如

1.配置文件(可无),具体的可根据实际业务来配置。
# actuator的访问路径
management.context-path=/monitor
# 管理的端口调整成1234
management.port=1234
# 有些需要身份认证才能访问,可直接关闭鉴权
#management.security.enabled=true
# 开启关闭应用端点
endpoints.shutdown.enabled=true
# 安全验证的账号密码
security.user.name=oKong
security.user.password=123456
2.编写启动类(普通的启动类),启动后,访问:http://127.0.0.1:1234/monitor/ (因为我们重新指定了访问端口的上下文为monitor了)

访问/monitor/beans,是需要授权的,可以看见需要输入用户名和密码了:

输入配置文件里面配置的用户名和密码,就可以正常访问了:

自定义端点
虽然本身
SpringBoot已经自带了很多端点,大部分情况下是够用了。但对于某些特殊需要时,还是需要自定义端点来满足的。接下来就简单讲解下自定义端点的创建。
自定义健康端点
健康信息可以用来检查应用的运行状态。所以经常被监控软件用来提醒生产系统是否停止,数据库是否正常,或者redis是否启动等等,而且一般上健康端点的信息都是比较敏感的,应加入身份鉴权。
自动配置的健康端点有:

简单说明下:
| 名称 | 描述 |
|---|---|
CassandraHealthIndicator |
检查 Cassandra 数据库是否启动。 |
DiskSpaceHealthIndicator |
检查磁盘空间不足。 |
DataSourceHealthIndicator |
检查是否可以获得连接 DataSource。 |
ElasticsearchHealthIndicator |
检查 Elasticsearch 集群是否启动。 |
InfluxDbHealthIndicator |
检查 InfluxDB 服务器是否启动。 |
JmsHealthIndicator |
检查 JMS 代理是否启动。 |
MailHealthIndicator |
检查邮件服务器是否启动。 |
MongoHealthIndicator |
检查 Mongo 数据库是否启动。 |
Neo4jHealthIndicator |
检查 Neo4j 服务器是否启动。 |
RabbitHealthIndicator |
检查 Rabbit 服务器是否启动。 |
RedisHealthIndicator |
检查 Redis 服务器是否启动。 |
SolrHealthIndicator |
检查 Solr 服务器是否已启动。 |
这些端点,在spring-boot-starter-xxx包被依赖导入后,利用@Conditional等注解进行自动加载的,具体可以看看org.springframework.boot.actuate.autoconfigure包下的自动加载类。

比如,上图中的,当我们加入spring-boot-starter-data-redis依赖后,RedisHealthIndicator就会自动被装载了,这个时候我们访问下:http://127.0.0.1:1234/monitor/health ,可以看见redis节点有显示了,状态是关闭

其他的都是类似的,具体可以看看源码。接下来,我们通过继承AbstractHealthIndicator来自定义一个监控端点(当然也可以实现 HealthIndicator接口的)
CustomHealthIndicator.java
/**
* 自定义健康端点 继承AbstractHealthIndicator类 也可以实现 HealthIndicator接口的
* @author oKong
*
*/
//这里也可以使用 类似@ConditionalOnMissingBean写法自动加载的
//这里的name 就是默认健康节点的名称了
@Component("oKong")
public class CustomHealthIndicator extends AbstractHealthIndicator{
@Override
protected void doHealthCheck(Builder builder) throws Exception {
//设置健康信息
builder.withDetail("code", "0123")
.withDetail("version", "v0.1")
//有其他信息可继续添加的
.up().build();
}
}
最后效果:

{
"status": "DOWN",
"oKong": {
"status": "UP",
"code": "0123",
"version": "v0.1"
},
"diskSpace": {
"status": "UP",
"total": 120032587776,
"free": 8374538240,
"threshold": 10485760
},
"redis": {
"status": "DOWN",
"error": "org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool"
}
}
这方面用的不多,至于其他详细信息,可以查看官网:Security with HealthIndicators

自定义端点
出来在原来内置的端点进行添加,访问的路径还是内置的路径,我们还能通过完全自定义一个端点来实现我们的业务需求的。
首先,我们来看看健康端点对应的类org.springframework.boot.actuate.endpoint.HealthEndpoint,其是继承了AbstractEndpoint<T>来实现的。通过IDE我们也能看到,大部分的端点都是继承此抽象类来完成的。

所以,我们也通过继承此类来实现自定义端点。
CustomEndPoint.java
/**
* 自定义端点
* @author oKong
*
*/
@Component
@ConfigurationProperties(prefix = "endpoints.oKong")
public class CustomEndPoint extends AbstractEndpoint<Map<String,Object>>{
public CustomEndPoint() {
//设置ID 即访问路径 :/oKong
super("oKong");
}
/**
* 返回信息
*/
@Override
public Map<String, Object> invoke() {
Map<String, Object> result = new HashMap<>();
result.put("author", "oKong");
result.put("chapter", "chapter27");
result.put("mp", "lqdevOps");
return result;
}
}

加入了@ConfigurationProperties后可在配置文件中,设置是否开启等等。当然也可以加入自定义的参数了,这里就默认了,没有添加额外的参数。

参考资料
总结
本注解主要介绍了一些原生端点和自定义端点的相关实践。对于一般的信息,使用使用这些原生的端点就能基本满足了,但由于返回的是json串,不够明了。下一章节就介绍下,利用
Spring Boot Admin进行可视化的监控,比如有图表信息、查看日志输出等等,通过界面来进行展现。
最后
目前互联网上很多大佬都有
SpringBoot系列教程,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。
老生常谈
- 个人QQ:
499452441 - 微信公众号:
lqdevOps

个人博客:http://blog.lqdev.cn
完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-27
原文地址:http://blog.lqdev.cn/2018/09/11/springboot/chapter-twenty-seven/
SpringBoot | 第二十七章:监控管理之Actuator使用的更多相关文章
- Gradle 1.12用户指南翻译——第二十七章. Ear 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- 《Linux命令行与shell脚本编程大全》 第二十七章 学习笔记
第二十七章:shell脚本编程进阶 监测系统统计数据 系统快照报告 1.运行时间 uptime命令会提供以下基本信息: 当前时间 系统运行的天数,小时数,分钟数 当前登录到系统的用户数 1分钟,5分钟 ...
- “全栈2019”Java多线程第二十七章:Lock获取lock/释放unlock锁
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java第二十七章:流程控制语句中循环语句for
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- SpringBoot | 第二十三章:日志管理之整合篇
前言 在本系列<第四章:日志管理>中,由于工作中日志这块都是走默认配置,也没有深入了解过,因为部署过程中直接使用了linux中的输出重定向功能,如java -jar xx.jar > ...
- SpringBoot 监控管理模块actuator没有权限的问题
SpringBoot 1.5.9 版本加入actuator依赖后, 访问/beans 等敏感的信息时候报错,如下 Tue Mar 07 21:18:57 GMT+08:00 2017 There wa ...
- 第二十七章 springboot + zipkin(brave-okhttp实现)
本文截取自:http://blog.csdn.net/liaokailin/article/details/52077620 一.前提 1.zipkin基本知识:附8 zipkin 2.启动zipki ...
- 【第二十七章】 springboot + zipkin(brave-okhttp实现)
本文截取自:http://blog.csdn.net/liaokailin/article/details/52077620 一.前提 1.zipkin基本知识:附8 zipkin 2.启动zipki ...
- Spring-boot内置的程序管理监控工具-Actuator
1.引入jar包: <dependencies> <dependency> <groupId>org.springframework.boot</groupI ...
随机推荐
- 「HNOI2010」合唱队
题目链接 戳我 \(Solution\) 令: \(f[i][j]\)为\([i,j]\)中最后排进去的是第i人 \(dp[i][j]\)为\([i,j]\)中最后排进去的是第j人 则排头的元素即\( ...
- 「BZOJ 1876」「SDOI 2009」SuperGCD「数论」
题意 求\(\gcd(a, b)\),其中\(a,b\leq10^{10000}\) 题解 使用\(\text{Stein}\)算法,其原理是不断筛除因子\(2\)然后使用更相减损法 如果不筛\(2\ ...
- Atcoder Grand Contest 032C(欧拉回路,DFS判环)
#include<bits/stdc++.h>using namespace std;int vis[100007];vector<int>v[100007];vector&l ...
- win10 + Lubuntu 双系统安装
win10 + Lubuntu 双系统安装 最近重装了系统,索性直接安装win10 + Lubuntu 双系统,便于在物理机下进行 Linux开发. 这里我选择的 Linux 发行版是 Lubuntu ...
- docker kubernetes swarm spring cloud结合学习资源
http://www.docin.com/p-2062732301.html https://blog.csdn.net/michael_hm/article/details/79213839 htt ...
- 第9项:尽量使用try-with-resources而不是try-finally(Prefer try-with-resources to try-finally)
Java库包含许多必须通过调用close方法手动关闭的资源. 示例包括InputStream,OutputStream和java.sql.Connection. 关闭资源经常被客户忽视,可预见的可 ...
- HDU-1431-素数回文(暴力打表)
素数回文 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 一款很好用的页面滚动元素动画插件-AOS.JS
aos.js是一款效果超赞的页面滚动元素动画jQuery动画库插件.该动画库可以在页面滚动时提供28种不同的元素动画效果,以及多种easing效果.在页面往回滚动时,元素会恢复到原来的状态. 加载方法 ...
- Hadoop文章
hadoop入门--简单的MapReduce案例:https://blog.csdn.net/zhangt85/article/details/42077281?utm_source=blogxgwz ...
- jquery 中 $('div','li')是什么意思?
Javascript 专业回答 2013-07-18 10:59 这个写法没有错误,而且那个人跟你说的也没错,是选择li里面所有div 前面几位都学艺不精,都说错了 要搞清楚$('div','l ...