云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

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

jxf315 2025-01-20 14:07:03 教程文章 77 ℃

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

最近发表
标签列表