Spring Boot进阶-SpringBoot管理工具Actuator介绍
wptr33 2024-12-07 17:44 19 浏览
假设现在有这样一个场景,当一个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的使用要根据具体的情况来开房对应的监控端口。防止端口开放产生安全问题。
相关推荐
- redis的八种使用场景
-
前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...
- 基于Redis的3种分布式ID生成策略
-
在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...
- 基于OpenWrt系统路由器的模式切换与网页设计
-
摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...
- 这篇文章教你看明白 nginx-ingress 控制器
-
主机nginx一般nginx做主机反向代理(网关)有以下配置...
- 如何用redis实现注册中心
-
一句话总结使用Redis实现注册中心:服务注册...
- 爱可可老师24小时热门分享(2020.5.10)
-
No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...
- Apportable:拯救程序员,IOS一秒变安卓
-
摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...
- JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透
-
以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...
- 3月26日更新 快速施法自动施法可独立设置
-
2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...
- Redis 是如何提供服务的
-
在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...
- lua _G、_VERSION使用
-
到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...
- China's top diplomat to chair third China-Pacific Island countries foreign ministers' meeting
-
BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...
- 移动工作交流工具Lua推出Insights数据分析产品
-
Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...
- Redis 7新武器:用Redis Stack实现向量搜索的极限压测
-
当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...
- Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求
-
重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- 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)