百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Spring Boot进阶-SpringBoot管理工具Actuator介绍

wptr33 2024-12-07 17:44 13 浏览

假设现在有这样一个场景,当一个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的使用要根据具体的情况来开房对应的监控端口。防止端口开放产生安全问题。

相关推荐

F103C8T6移植FATFS文件系统 版本R0.15

STM32F103C8T6芯片在W25Q64上移植FATFS(版本R0.15)实现过程:1、首先完成USART初始化和调试,用于传输信息到串口调试软件。2、完成SPI相关参数配置及调试,用于单片机和存...

stm32使用MPU6050或ADXL345控制的车辆减速灯

本实验例程采用MPU6050六轴运动处理组件...

STM32F103串口输出prtinf覆盖(stm32printf函数的串口输出)

采用正点原子的板子,有如下坑,记录如下:(1)main中应用头文件#include"stdio.h"(2)采用hal进行fputc和fgetc覆盖,如下intfputc(intc...

STM32 学习8 USART串口通讯与printf重定向

一、串口通信介绍STM32F103ZET6包含多个UART、USART串口。...

教你如何使用SEGGER RTT优雅的实现日志系统

今天开始了BMS系统的软件代码部分的搭建,计划是分成三层:硬件驱动,AFE层和系统应用层。第一步肯定是先把底层的IIC通信调通,CG861xx的IIC通信和TI的BQ769X0...

终极调试利器,各种Link通吃(link4a调制方式)

今天继续更新一期KEIL调试方法。事实上,关于调试方法,鱼鹰写了一个系列,汇总文为《佛祖保佑,永无BUG,永不修改|KEIL调试系列总结篇》,对于KEIL方法感兴趣的可以看看。这个调试...

在 STM32 中使用 printf() 函数,别漏掉这几行代码!

问:在STM32上轻松使用printf函数除了点亮LED外,向串行控制台发送打印信息可能是调试嵌入式项目时最简单、最直接且最常用的技术。虽然大多数平台都拥有可以在UART总线上传输数据的API,但它们...

高性能异步io机制:io_uring(异步io select)

io_uring是linux内核5.10引入的异步io接口。相比起用户态的DPDK、SPDK,io_uring作为内核的一部分,通过mmap的方式实现用户和内核共享内存,并基于m...

精品博文ARM中打印函数print 的几种实现方法

1利用C库函数printf步骤:1)首先需要包含头文件stdio.h。2)然后定义文件句柄。实际上就是一个int型变量封装在结构体中。struct__FILE{inthandle;};3)定...

C语言char的详解(c语言(char))

在C语言中,char是一种基础数据类型,用于表示字符或小整数值。对char的理解和处理非常重要,尤其是在字符串操作、文件读写或其他需要直接控制内存的应用场景中。下面从基本定义、存储方式、常见用法...

C语言之文件操作(c语言文件操作实验总结)

文件操作是C语言中非常重要的功能,用于读取和写入文件中的数据。C语言提供了一组标准库函数(如fopen、fclose、fread、fwrite等)来实现文件操作。以下是针对C语言初学者的详细讲解。...

STM32-ADC如何把采集的数据转换为小数

编辑一、代码原理解析这段代码围绕“STM32中ADC数据采集、整数与小数计算及串口输出”展开,核心是数据类型的使用(unsignedint/signedint/float)、ADC数...

循环队列原理及在单片机串口通讯中的应用(二)

前言书接上回,前文主要介绍了环形队列的实现原理以及C语言实现及测试过程,本文将回归到嵌入式平台的应用中,话不多说,淦,上干货!...

STM32编程中printf函数重定向背后的原理

  在C语言中,printf是一个非常好用的函数,尤其是在程序调试阶段,我们可以通printf打印变量的值来帮助查错。在学习C语言的时候我们的开发环境和运行环境都是PC机,printf函数打印到PC机...

MySQL 避坑指南之隐式数据类型转换

...