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

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

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

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

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...