未来的开发场景

  • 假设一个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.引入依赖

        <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】Spring Boot项目的监控-LMLPHP

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

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

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

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

4.启动程序

  • 在浏览器中输入如下的网址
    http://localhost:8080/actuator/info
    http://localhost:8080/actuator/health
    http://localhost:8080/actuator/beans
    http://localhost:8080/actuator/metrics
    http://localhost:8080/actuator/metrics/jvm.gc.pause
    【SpringBoot】Spring Boot项目的监控-LMLPHP

Endpoints 介绍

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

Actuator 提供的所有 endpoint

Spring Boot Admin

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

主要的功能点

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

代码示例

1.添加依赖

        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.3.1</version>
        </dependency>

2.启动类添加注解

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

3.启动程序

  • 在浏览器中输入如下的网址
    http://localhost:8080/applications
    【SpringBoot】Spring Boot项目的监控-LMLPHP

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

1.添加客户端依赖

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

        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.3.1</version>
        </dependency>

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

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

spring:
  boot:
    admin:
      client:
        url: http://localhost:8080
        instance:
          service-url: http://localhost:${server.port}

3.启动程序

启动redisdemo工程
【SpringBoot】Spring Boot项目的监控-LMLPHP

  • 访问:http://localhost:8080/instances/08402ca825c2/details
    【SpringBoot】Spring Boot项目的监控-LMLPHP
05-07 10:19