Spring Boot进阶-SpringBoot管理工具Actuator介绍
wptr33 2024-12-07 17:44 25 浏览
假设现在有这样一个场景,当一个SpringBoot的项目开发完成并且部署到生产环境之后,刚好该应用就出现了线上的问题,而这个时候运维团队希望能够提供一些线上的工具来帮助定位查找问题。这个时候开发者应该如何去解决这个问题呢?
对于Java开发者来讲,对于JMX的使用应该是不陌生的,我们可以通过JMX来监控系统运行的状态,但是我们应该使用什么样的方式来访问JMX的MBean对象就成问题。因为JDK默认自带的JConsole默认都是关闭的,所以有很多的应用服务器会额外提供一些基于Web的JMX Console,例如JBoss等等,那么既然是使用了Spring Boot作为开发框架,那么Spring Boot又提供了怎么样的JMX的MBean访问机制呢?
为了解决这个问题Spring Boot就提供了Actuator来支撑这一类的操作。
如何使用Actuator?
要使用到Actuator就需要加入对应的依赖。代码如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然后我们可以启动项目,会看到在控制台日志中多了如下的一行日志
Exposing 1 endpoint(s) beneath base path '/actuator'
也就是说在SpringBoot项目启动的时候主动暴露了一个/actuator的接口,我们可以在浏览器中输入http://localhost:8080/actuator就会看到在浏览器中响应了如下的内容
会看到这个响应结果是通过restful风格来进行返回的。这个时候我们可以在浏览器中继续访问返回结果中的http://localhost:8080/actuator/health 接口,会看到返回结果如下
从这个返回结果我们就可以知道这个时候服务是正常运行的。上面我们演示了一些关于Actuator的基本用法,我们会看到在第一个返回结果中有这样一个连接http://localhost:8080/actuator/health/{*path} 我们还没有进行测试,那么这个连接到底是干什么用的呢?
其实在我们的Actuator中提供了很多的访问链接,归纳如下,我们可以通过http://localhost:8080/actuator/{endpoint} 来进行访问,这里的endpoint可以被替换成下面的任何的链接。
我们可以通过如下的配置来开放所有的监听节点
management:
endpoints:
web:
exposure:
include: '*'
获取应用程序中 Spring 上下文的 Bean 装配情况
http://localhost:8080/actuator/beans // get请求
启动了这个请求之后可以看到如下的效果。
获取详细配置情况
通过conditions来获取Bean的配置情况
http://localhost:8080/actuator/conditions // get请求
调用接口返回结果如下
查看属性配置
http://localhost:8080/actuator/env // get请求
这个端点就是用来获取应用中的各种环境属性配置,无论在应用中是否使用到,都会展示出来,其结果如下
查看配置属性相关内容
http://localhost:8000/actuator/configprops // get请求
在我们声明一些属性定义的时候,都会定义一个Java Bean来通过@ConfigurationProperties注解将属性值与JavaBean对象进行绑定,那么如何获取到具体的属性值,我们就可以通过上面的/configprops端点来获取。其执行结果如下
查看接口路径和Controller的映射关系
http://localhost:8000/actuator/mappings // get请求
访问这个端点之后会获取到一套映射列表,结果如下,从中我们可以获取到在调用的时候我们具体的接口映射处理情况。
获取到应用程序的各种运行指标
http://localhost:8000/actuator/metrics // get请求
通过metrics端点,我们何以获取到当前应用的各种度量的指标。例如内存信息、线程信息、垃圾回收信息等等。
{
"names": [
// hikaricp 是 Spring Boot2.x 选择的默认数据库连接池
"hikaricp.connections", // 数据库连接池总连接数
"hikaricp.connections.acquire", //单位时间内获取连接时间统计
"hikaricp.connections.active", // 活跃连接数
"hikaricp.connections.creation", // 创建连接时间
"hikaricp.connections.idle", // 空闲连接
"hikaricp.connections.max", // 最大连接数
"hikaricp.connections.min", // 最小连接数
"hikaricp.connections.pending", // 等待连接数
"hikaricp.connections.timeout", // 获取连接超时总数
"hikaricp.connections.usage", // 连接使用时间统计
"http.server.requests", // 访问应用的总请求数
"jdbc.connections.active", // 数据源分配的当前活跃连接数
"jdbc.connections.idle", // 已和数据源建立的空闲连接数
"jdbc.connections.max", // 同一时间最大可以建立的数据库连接数
"jdbc.connections.min", // 数据库连接池中最小空闲连接数
"jvm.buffer.count", // Java虚拟机缓冲区的个数估计
"jvm.buffer.memory.used", // Java虚拟机用于这个缓冲池的内存的估计
"jvm.buffer.total.capacity", // Java虚拟机中缓冲区总容量估计
"jvm.classes.loaded", // 当前装入Java虚拟机中的类的数量
"jvm.classes.unloaded", // 自虚拟机启动卸载的类总数
"jvm.gc.live.data.size", // gc后老年代的大小
"jvm.gc.max.data.size", // 老年代的最大内存
"jvm.gc.memory.allocated", // 年轻代在一次gc后到下一次gc前过程中增长的内存大小
"jvm.gc.memory.promoted", // 老年代有效gc次数
"jvm.gc.pause", // gc暂停所花费的时间
"jvm.memory.committed", // 提交给Java虚拟机使用的内存量(以字节为单位)
"jvm.memory.max", // 可以用于jvm内存管理的最大内存数量(以字节为单位)
"jvm.memory.used", // jvm已使用的内存数量
"jvm.threads.daemon", // 当前活动守护进程线程的数量
"jvm.threads.live", // 当前活动线程的数量,包括守护线程和非守护线程
"jvm.threads.peak", // 自Java虚拟机启动后的最大活跃线程数
"jvm.threads.states", // 当前处于BLOCKED状态的线程数
"logback.events", // 记录到日志中的事件的数量
"process.cpu.usage", // Java虚拟机进程的“最近cpu使用量”
"process.files.max", // 最大文件描述符数量
"process.files.open", // 当前打开的文件描述符数量
"process.start.time", // 进程启动时间
"process.uptime", // Java虚拟机的正常运行时间
"spring.data.repository.invocations", // Spring中DAO访问数据库统计信息
"system.cpu.count", // Java虚拟机可用的cpu数量
"system.cpu.usage", // 整个系统的“最近的cpu使用量”
"system.load.average.1m", // 一段时间内的CPU负载
"tomcat.sessions.active.current", // tomcat服务器当前活跃会话数
"tomcat.sessions.active.max", // tomcat最大会话数
"tomcat.sessions.alive.max", // tomcat会话最大存活时间
"tomcat.sessions.created", // tomcat会话已创建数量
"tomcat.sessions.expired", // tomcat会话已创建数量
"tomcat.sessions.rejected" // tomcat会话拒绝数量
]
}
如果我们想查看某个指标我们可以通过http://localhost:8000/actuator/metrics/process.uptime 方式来获取相应的指标
追踪Web请求操作
http://localhost:8080/actuator/httptrace // get请求
httptrace 端点可以提供所有 web 请求的详细信息,包括请求方法、路径、时间戳以及请求头等信息。
使用 Spring Boot 2.x 的时候发现这个端点默认是不能访问的会报404,需要自己实现添加一个配置类实现显示最近100个请求的信息,它是在内存中维护了一个跟踪库,当然我们也可以自定义这个跟踪库将信息持久化
@Configuration
@ConditionalOnWebApplication
@ConditionalOnProperty(prefix = "management.trace.http", name = "enabled", matchIfMissing = true)
@EnableConfigurationProperties(HttpTraceProperties.class)
@AutoConfigureBefore(HttpTraceAutoConfiguration.class)
class TraceConfig {
private List<HttpTrace> list = new CopyOnWriteArrayList<HttpTrace>();
@Bean
@ConditionalOnMissingBean(HttpTraceRepository.class)
public HttpTraceRepository traceRepository() {
return new HttpTraceRepository() {
@Override
public List<HttpTrace> findAll() {
return list;
}
@Override
public void add(HttpTrace trace) {
if (list.size() > 99){
list.remove(0);
}
list.add(trace);
}
};
}
}
监控应用的健康状况
http://localhost:8080/actuator/health // get请求
获取应用信息
http://localhost:8080/actuator/info // get请求
总结
通过上面的介绍,我们了解了在Spring Boot中Actuator的常用使用方式,但是在这里需要注意的是,在我们实际生产环境中,对于Actuator的使用要根据具体的情况来开房对应的监控端口。防止端口开放产生安全问题。
相关推荐
- MySQL进阶五之自动读写分离mysql-proxy
-
自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...
- 3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?
-
引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...
- 一文由浅入深带你完全掌握MySQL的锁机制原理与应用
-
本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...
- 验证Mysql中联合索引的最左匹配原则
-
后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...
- MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)
-
目录1.索引基础...
- 你会看 MySQL 的执行计划(EXPLAIN)吗?
-
SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...
- MySQL 从入门到精通(四)之索引结构
-
索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...
- mysql总结——面试中最常问到的知识点
-
mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...
- mysql总结——面试中最常问到的知识点(2)
-
首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...
- MySQL基础全知全解!超详细无废话!轻松上手~
-
本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...
- 深入剖析 MySQL 中的锁机制原理_mysql 锁详解
-
在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...
- Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析
-
引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...
- MySQL基础篇:DQL数据查询操作_mysql 查
-
一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...
- MySql:索引的基本使用_mysql索引的使用和原理
-
一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
如何将AI助手接入微信(打开ai手机助手)
-
redission YYDS spring boot redission 使用
-
SparkSQL——DataFrame的创建与使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)