摘要:作为互联网大厂的后端开发人员,你有没有过这样的经历?在项目上线后,满心期待着一切顺利运行,可没过多久,线上就出现了性能问题,用户投诉不断,而自己却对应用程序内部的运行状况一头雾水,不知道问题究竟出在哪里。明明使用了 Spring Boot 框架来开发应用,为什
作为互联网大厂的后端开发人员,你有没有过这样的经历?在项目上线后,满心期待着一切顺利运行,可没过多久,线上就出现了性能问题,用户投诉不断,而自己却对应用程序内部的运行状况一头雾水,不知道问题究竟出在哪里。明明使用了 Spring Boot 框架来开发应用,为什么还是会陷入这种困境?其实,这很可能是因为你没有做好 Spring Boot 应用程序的监控!
在如今竞争激烈的互联网大厂环境中,后端项目大多采用 Spring Boot 框架开发,据统计,超过 70% 的后端开发项目都在使用它 。Spring Boot 以其快速开发、简化配置等优势,大大提高了开发效率。然而,随着应用程序规模的不断扩大、功能日益复杂,以及用户量的持续增长,应用程序在运行过程中会面临各种各样的问题,如内存泄漏、线程阻塞、接口响应缓慢等。如果没有有效的监控手段,这些问题就像隐藏在暗处的 “定时炸弹”,随时可能引发线上故障,影响用户体验,甚至给公司带来巨大的损失。而且,在大厂中,项目通常是多人协作开发、多团队共同维护,一旦出现问题,快速定位和解决问题至关重要,这就更凸显了 Spring Boot 应用程序监控的必要性。
那么,该如何对 Spring Boot 应用程序进行监控呢?别着急,下面就为你提供详细的解决方案。
首先要介绍的是 Spring Boot Actuator,它就像是 Spring Boot 应用程序的 “健康管家”,能帮我们实时掌握应用的运行状态。使用它非常简单,第一步就是添加依赖。在 Spring Boot 项目的 pom.xml 文件中,只需添加 spring - boot - starter - actuator 依赖,Spring Boot 就会自动完成 Actuator 的基础配置并启用其默认端点。比如,当你创建一个新的 Spring Boot 项目,并在 pom.xml 中加入以下依赖:
org.springframework.framework.bootspring-boot-starter-actuator项目构建完成后,Actuator 的基础功能便已初步具备。
添加完依赖后,默认情况下,Spring Boot Actuator 仅开启少量端点。这时,我们可以通过 application.properties 或 application.yml 配置文件来自定义启用更多端点。比如在 application.yml 中配置management: endpoints: web: exposure: include: '*',就能开启所有端点;要是只想启用部分特定端点,像健康检查端点 health、信息端点 info 以及指标端点 metrics,配置management: endpoints: web: exposure: include: 'health,info,metrics'即可。配置完成后,通过浏览器或 HTTP 客户端访问http://localhost:8080/actuator(假设应用运行在本地 8080 端口),就能看到所有已启用的监控端点列表。
这里面有几个常用端点,作用非常大。以 /actuator/health 端点为例,它可以实时检查应用程序及其依赖服务的健康状况,它内置了针对多种常见服务的健康指示器,像数据库、消息队列等。例如,当应用程序依赖 MySQL 数据库时,Actuator 会通过相关的健康指示器检查数据库连接是否正常。若想获取更详细的健康检查信息,可在 application.yml 中配置management: endpoint: health: show - details: always。配置完成后,再次访问/actuator/health端点,你会看到类似如下的详细信息:
{"status": "UP","components": {"db": {"status": "UP","details": {"database": "MySQL","hello": 1}},"diskSpace": {"status": "UP","details": {"total": 500117280768,"free": 343654328320,"threshold": 10485760}}}}从上述信息中,我们能清晰地了解到数据库服务的运行状态以及磁盘空间情况。
/actuator/metrics 端点则展示当前应用程序的各类指标信息,比如内存使用量、线程池活动线程数、HTTP 请求的平均处理时间等。通过分析这些指标数据,我们就能深入了解应用的性能表现,及时发现潜在的性能问题。例如,当我们访问/actuator/metrics/jvm.memory.used端点时,会得到应用程序当前使用的 JVM 内存量数据:
{"name": "jvm.memory.used","description": "The amount of used memory","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 123456789}],"availableTags": [{"tag": "area","values": ["heap","nonheap"]},{"tag": "id","values": ["PS Eden Space","PS Survivor Space","PS Old Gen","Metaspace","Compressed Class Space"]}]}这些数据能帮助我们判断应用是否存在内存泄漏等问题。
/actuator/loggers 端点允许我们查看和动态修改应用的日志配置,在运行时根据不同场景需求灵活调整日志级别,不用重启应用。例如,当线上出现问题时,我们可以临时将日志级别调整为 DEBUG,以便获取更详细的日志信息来定位问题。在实际操作中,我们可以通过发送 POST 请求到/actuator/loggers/{loggerName}端点(其中{loggerName}为具体的日志名称,如com.example.demo),并在请求体中设置{"configuredLevel": "DEBUG"},即可将指定日志的级别调整为 DEBUG。
除了 Spring Boot Actuator,还有 Spring Boot Admin 这个强大的工具。它是一个开源社区项目,专门用于管理和监控 Spring Boot 应用程序,分为客户端和服务端两部分。
搭建服务端时,先导入与当前使用的 spring - boot 版本一致的 spring - boot - admin 对应的 starter,然后将其配置成 web 工程,并在引导类上添加注解@EnableAdminServer,这样当前应用启动后就成为了 Spring Boot Admin 的服务器。假设我们创建一个 Spring Boot Admin 服务端项目,在 pom.xml 中添加如下依赖:
de.codecentricspring-boot-admin-starter-server2.6.7org.springframework.bootspring-boot-starter-webimport de.codecentric.boot.admin.server.config.EnableAdminServer;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableAdminServerpublic class AdminServerApplication {public static void main(String args) {SpringApplication.run(AdminServerApplication.class, args);}}这样,Spring Boot Admin 服务端的基本框架就搭建好了。
客户端同样要导入对应版本的 starter,配置成 web 工程,并在 yml 文件中设置将信息上传到哪个服务器上。客户端默认开放了 13 组信息给服务器,但除健康信息外,其他信息默认不允许通过 HTTP 请求查看,不过我们可以通过配置开启查阅的内容项。例如,在客户端项目的 pom.xml 中添加如下依赖:
de.codecentricspring-boot-admin-starter-client2.6.7org.springframework.bootspring-boot-starter-actuator然后在 application.yml 中进行如下配置,以将客户端注册到服务端:
spring:boot:admin:client:url: http://localhost:8081 # Spring Boot Admin服务端地址instance:name: ${spring.application.name}:${spring.application.instance_id:${random.value}}management:endpoints:web:exposure:include: '*'通过 Spring Boot Admin,我们能在一个可视化的界面中,集中监控多个 Spring Boot 应用程序,查看应用的运行状态、指标数据、日志信息等,大大提高了监控和管理的效率。当我们打开 Spring Boot Admin 的管理界面(假设服务端运行在http://localhost:8081),会看到类似如下的界面:在应用列表中,展示了各个注册到服务端的 Spring Boot 应用的基本信息,如应用名称、状态等。点击具体的应用,我们可以进一步查看该应用详细的运行指标,包括内存使用情况、线程活动情况、HTTP 请求统计等,还能实时查看应用的日志信息,方便我们快速定位和解决问题。
做好 Spring Boot 应用程序的监控,对于我们互联网大厂后端开发人员来说至关重要。无论是使用 Spring Boot Actuator 还是 Spring Boot Admin,都能帮助我们及时发现应用程序运行过程中的问题,保障项目的稳定运行。希望大家都能重视应用程序监控,将这些方法运用到实际项目中。如果你在监控过程中有任何好的经验、遇到的问题,欢迎在评论区分享和讨论,让我们一起把 Spring Boot 应用程序监控做得更好!
来源:从程序员到架构师一点号