【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工程

相关推荐
起名字真南10 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
爬山算法15 分钟前
Maven(28)如何使用Maven进行依赖解析?
java·maven
tyler_download21 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~22 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#22 分钟前
go mod 依赖管理
开发语言·后端·golang
小春学渗透24 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc
杜杜的man26 分钟前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
陈大爷(有低保)26 分钟前
三层架构和MVC以及它们的融合
后端·mvc
亦世凡华、27 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
河西石头28 分钟前
一步一步从asp.net core mvc中访问asp.net core WebApi
后端·asp.net·mvc·.net core访问api·httpclient的使用