【SpringBoot】Spring Boot项目的监控

目录

未来的开发场景

  • 假设一个SpringBoot项目开发完毕部署到生产环境中,刚好出现线上问题,而运维希望能提供一些工具帮助定位问题。
  • 再假设应用部署成功,但是发现运行方式与预期不一致,通过查看日志,发现加载的Bean自动配置有误,在生产环境中没法直接调试,用什么办法来解决问题。
  • Spring Boot遵循着约定大于配置"的原则,许多功能使用默认的配置即可。好处在于我们不需要像使用Spring那样编写一大堆的XML配置代码,但过于简单的配置过程会让我们在了解各种依赖,配置之间的关系过程上带来一些困难。对于新手不太友好
  • 对于一个大型的几十个、几百个微服务构成的微服务架构系统,在线上时通常会遇到下面一些问题
    • 如何知道哪些服务出了问题,如何快速定位? (健康状况)
    • 如何统一监控各个微服务的性能指标(内存、jvm、并发数、线程池、Http请求统计)
    • 如何统一管理各个微服务的日志?(切换线上日志等级,快速搜索日志...)
    • 如何优雅管理服务下线(正在运行的线程不发生中断)
  • 不过没关系,在Spring Boot中,我们可以使用Actuator来监控应用,它提供了一系列的RESTful API让我们可以更为细致的了解各种信息。
  • Spring Boot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能

Spring Boot Actuator

  • Actuator是Spring Boot提供的用来对应用系统进行自省和监控的功能模块,借助于Actuator开发者可以很方便地对应用系统某些监控指标进行查看、统计等。
  • Actuator使用Micrometer来整合上面提到的外部应用监控系统。这使得只要通过非常小的配置就可以集成任何应用监控系统。
  • Spring Boot Actuator同时还可以与外部应用监控系统整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用。容器的创建和停止都十分快速(秒级),更重要的是容器性能开销极低。

代码示例

1.引入依赖

xml 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

2.启动程序

  • 在浏览器中输入如下的网址

    http://localhost:8080/actuator/info

    http://localhost:8080/actuator/health

  • SpringBoot 中提供了非常多的默认端点监控,但是出于安全考虑,默认情况下有些端点并不是开启状态,如 shutdown 端点就是默认关闭的。

  • SpringBoot 在运行时就会自动开发/actuator/health和/actuator/info这两个endpoint

3.修改配置文件,添加开放的端点

yaml 复制代码
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always # 可以看到具体哪个是down,其中一个为down,那么status就是down

4.启动程序

Endpoints 介绍

  • Spring Boot 提供了所谓的 endpoints给外部来与应用程序进行访问和交互。
  • 打比方来说,/health 端点 提供了关于应用健康情况的一些基础信息。metrics 端点提供了一些有用的应用程序指标(JVM 内存使用、系统CPU使用等)。
  • 这些 Actuator 模块本来就有的端点我们称之为原生端点。根据端点的作用的话,我们大概可以分为三大类:
    • 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
    • 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP请求统计等。
    • 操作控制类:提供了对应用的关闭等操作类功能。

Actuator 提供的所有 endpoint

http方法 Endpoint 描述
GET /actuator 查看有哪些 Actuator endpoint 是开放的
GET /actuator/auditevent 查看 audit 的事件,例如认证进入、订单失败,需要搭配 Spring Security
GET /actuator/beans 查看全部的 bean,以及它们的关系
GET /actuator/conditions 查看自动配置的结果,记录哪些自动配置条件通过了,哪些没通过
GET /actuator/configprops 查看带有 @ConfigurationProperties 的 properties 值为何(包含默认值)
GET /actuator/env 查看全部环境属性
GET /actuator/flyway 查看 flyway DB 的 migration 资讯
GET /actuator/health 查看当前 SpringBoot 运行的健康指标
GET /actuator/heapdump 取得 JVM 当下的 heap dump,会下载一个档案
GET /actuator/info 查看 properties 中 info开头的属性的值,沒啥用
GET /actuator/mappings 查看全部的 endpoint,以及他们和 Controller 的关系
GET /actuator/metrics 查看有哪些指标可以看
GET /actuator/scheduledtasks 查看定時任务的资讯
POST /actuator/shutdown 唯一一個需要 POST 请求的 endpoint,关闭这个 SpringBoot 程序

Spring Boot Admin

  • Spring Boot 有一个非常好用的监控和管理的源软件,这个软件就是 Spring Boot Admin。
  • 该软件能够将 Actuator 中的信息进行界面化的展示,也可以监控所有 Spring Boot 应用的健康状况,提供实时警报功能。
  • https://github.com/codecentric/spring-boot-admin

主要的功能点

  • 显示应用程序的监控状态
  • 应用程序上下线监控
  • 查看 JVM,线程信息
  • 可视化的查看日志以及下载日志文件
  • 动态切换日志级别
  • Http 请求信息跟踪

代码示例

1.添加依赖

xml 复制代码
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.3.1</version>
        </dependency>

2.启动类添加注解

java 复制代码
@SpringBootApplication
@EnableAdminServer
public class Demo2Application {
    public static void main(String[] args) {
        SpringApplication.run(Demo2Application.class, args);
    }
}

3.启动程序

将监控到的数据传输到Admin-Server中。

1.添加客户端依赖

在之前的redisdemo工程中添加以下依赖

xml 复制代码
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.3.1</version>
        </dependency>

2.修改配置文件,指定admin-server的地址

在之前的redisdemo工程中配置admin-server的地址

yaml 复制代码
spring:
  boot:
    admin:
      client:
        url: http://localhost:8080
        instance:
          service-url: http://localhost:${server.port}

3.启动程序

启动redisdemo工程

相关推荐
苏三说技术27 分钟前
Claude Code从失控到起飞,只用了这些技巧
后端
长栎1 小时前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode1 小时前
Redis 在生产项目的使用
前端·后端
用户559822481222 小时前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode2 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战2 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
米丘2 小时前
微前端之 Web Components 完全指南
微服务·html
xiaodaoluanzha2 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn2 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425912 小时前
ShardingJDBC
后端