Spring Boot 默认提供了 Actuator 组件来监控 Spring Boot 应用。我们可以通过使用 Actuator 中的 REST API 来查看应用的一些端点信息,从而了解应用程序的运行状况。
Spring Boot Admin 是一款基于 Spring Boot Actuator 的 Web 服务,并提供图形化界面,可以更加直观地查看 Spring Boot 应用的运行状态。
在最近使用 Spring Boot Admin 的同时,发现它的图形化界面开始支持中文了,这无疑对国内的开发运维人员提供了便捷。本文将通过最新版本的 Spring Boot 2.3.0.RELEASE 结合 Spring Boot Admin 2.2.3 来简单介绍一下 Spring Boot Admin 的使用。

1. Spring Boot Actuator

在使用 Spring Boot Admin 之前,我们需要先行了解 Spring Boot Actuator 提供了哪些功能。

1.1. 添加依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

1.2. 配置 Actuator

server:
  port: 8000
  
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

由于从 Spring Boot 2.x 版本开始,Actuator 默认只暴露出 health 和 info 端点。这里我们配置 management.endpoints.web.exposure.include='*' 是为了暴露出所有的端点。(这里提一下,之所以给值加上 '' 是因为 Spring Boot 2.x 在读取配置信息的时候使用了 lambda 表达式,不加 '' 的话启动会报一个 lambda 相关的错误,有兴趣的可以看一下。)
配置的 management.endpoint.health.show-details=always 是为了展示 health 端点的详细信息,默认只返回 status 信息。

1.3 支持的端点

在项目中创建启动类,启动项目,通过地址栏访问 http://localhost:8000/actuator 即可查看当前项目暴露出的端点:

{
    "_links": {
        "self": {
            "href": "http://localhost:8000/actuator",
            "templated": false
        },
        "beans": {
            "href": "http://localhost:8000/actuator/beans",
            "templated": false
        },
        "caches-cache": {
            "href": "http://localhost:8000/actuator/caches/{cache}",
            "templated": true
        },
        "caches": {
            "href": "http://localhost:8000/actuator/caches",
            "templated": false
        },
        "health": {
            "href": "http://localhost:8000/actuator/health",
            "templated": false
        },
        "health-path": {
            "href": "http://localhost:8000/actuator/health/{*path}",
            "templated": true
        },
        "info": {
            "href": "http://localhost:8000/actuator/info",
            "templated": false
        },
        "conditions": {
            "href": "http://localhost:8000/actuator/conditions",
            "templated": false
        },
        "configprops": {
            "href": "http://localhost:8000/actuator/configprops",
            "templated": false
        },
        "env": {
            "href": "http://localhost:8000/actuator/env",
            "templated": false
        },
        "env-toMatch": {
            "href": "http://localhost:8000/actuator/env/{toMatch}",
            "templated": true
        },
        "loggers": {
            "href": "http://localhost:8000/actuator/loggers",
            "templated": false
        },
        "loggers-name": {
            "href": "http://localhost:8000/actuator/loggers/{name}",
            "templated": true
        },
        "heapdump": {
            "href": "http://localhost:8000/actuator/heapdump",
            "templated": false
        },
        "threaddump": {
            "href": "http://localhost:8000/actuator/threaddump",
            "templated": false
        },
        "metrics": {
            "href": "http://localhost:8000/actuator/metrics",
            "templated": false
        },
        "metrics-requiredMetricName": {
            "href": "http://localhost:8000/actuator/metrics/{requiredMetricName}",
            "templated": true
        },
        "scheduledtasks": {
            "href": "http://localhost:8000/actuator/scheduledtasks",
            "templated": false
        },
        "mappings": {
            "href": "http://localhost:8000/actuator/mappings",
            "templated": false
        }
    }
}

以下只列出较为常用的端点信息,所有端点信息可查看官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html

端点功能描述HTTP 方法是否敏感
beans显示应用程序上下文所有的 bean 以及它们之间的关系GET
configprops显示所有 @ConfigurationProperties 的配置属性列表GET
caches显示可用的缓存GET
conditions显示在配置和自动配置类上的评估条件以及它们匹配和不匹配的原因。GET
env显示应用程序的环境变量GET
health显示应用程序的健康指标。其 showDetails 属性有 3 个可选值:never、always、when_authorized,分别表示“从不”、“总是”,“认证后”展示应用程序的详细健康信息,默认为 neverGET
httptrace显示 http 请求的跟踪信息(默认为最近的 100 个 HTTP 请求)GET
info显示应用的信息GET
metrics显示所有应用程序的度量信息,如 HTTP 计数和内存使用量GET
mappings显示所有 @RequestMapping 的路径列表GET
scheduledtasks显示应用程序中所有定时任务GET
sessions允许从 Spring Session 支持的会话中查询或删除 Session 信息,但需要使用基于 Servlet 的 Web 应用(即不支持 Webflux)GET
shutdown关闭应用(默认不启用,如需启用,需配置(endpoint.shutdown.enable=true)GET
threaddump获取线程活动信息GET

2. Spring Boot Admin

从上面的内容可以看出,Spring Boot Actuator 仅提供了一些接口来用于监控 Spring Boot 应用状态信息。由于返回的是大量的 JSON 信息,从这些信息中很难直观地得到有效反馈。而 Spring Boot Admin 对这些接口进行了整合,并提供了图表支持,使得这些信息能够很直观地反映出各个端点的运行状态。

Spring Boot Admin 分服务端客户端,客户端通过 HTTP 的方式将自己注册到服务端,通过服务端来对这些客户端进行统一监控和管理,大致关系图如下:

image.png
image.png

2.1. Spring Boot Admin 服务端

🔖 添加依赖

创建一个 Spring Boot 项目,添加 spring-boot-admin-starter-server 依赖:

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

该 starter 中已经包含了 spring-boot-admin-serverspring-boot-admin-server-ui 依赖,也就是说已经提供了可视化界面。

🔖 开启 Admin 监控

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

开启方式跟开启其他的组件的方式一样,只需在启动类上添加 @EnableAdminServer 注解即可。

启动项目后,访问 http://localhost:8080/applications,出现如下界面:

image.png

此时服务端已经启动,但由于目前没有添加客户端,所以应用列表里是空的。

2.2. Spring Boot Admin 客户端

🔖 添加依赖

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

🔖 客户端配置

server:
  address: localhost
  port: 8081
  
spring:
  boot:
    admin:
      client:
        url: http://localhost:8080
        instance:
          name: user-service
#        enabled: false
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
      health:
        show-details: always

配置中的 spring.boot.admin.client.url 指向 Admin 服务端的访问地址。instance-name 表示注册至服务端所显示的服务名称,默认为 spring-boot-application。enabled 表示是否开启 Admin 监控,默认为 true。

配置好后,启动客户端,刷新 http://localhost:8080/applications 页面:

image.png

🔖 多个客户端

以同样的配置,再启动一个客户端,访问监控页面:

image.png

关闭其中一个服务,服务端与客户端之间通过 netty 通信维持心跳,客户端断连后,服务端在下一次心跳检测时就会监控到服务掉线:

image.png

2.3. 监控页面展示

当前版本的 Spring Boot Admin 监控页面的内容已经相当丰富,内存消耗,JVM 垃圾回收等等性能上的监控也是一目了然:

image.png

3. 安全配置

由于我们在客户端中将应用的一些敏感端点暴露出来了,所以官方建议我们为 Admin 服务端和客户端应用添加安全配置。

🔖 服务端配置

首先添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server-ui-login</artifactId>
    <version>1.5.7</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

上面的依赖中的 spring-boot-admin-server-ui-login 是将登录界面添加到 Admin 中。

用过 Spring Security 的朋友想必都知道,如果不手动去配置验证的用户名和密码,Spring Security 将会使用默认的用户名 user,并伴随项目的启动会生成一个默认的密码。我们使用该用户名和密码就可以完成登录。

这里我们手动配置用户名密码:

spring:
  security:
    user:
      name: admin
      password: admin

现在我们启动项目,访问 http://localhost:8080/applications 会出现如下页面:

image.png

🔖 客户端配置

配置好服务端后,重启客户端,控制台中会输出一段这样的内容:

WARN 8800 --- [gistrationTask1] d.c.b.a.c.r.ApplicationRegistrator       : Failed to register application as Application(name=user-service, managementUrl=http://127.0.0.1:8081/actuator, healthUrl=http://127.0.0.1:8081/actuator/health, serviceUrl=http://127.0.0.1:8081/) at spring-boot-admin ([http://localhost:8080/instances]): 401 : [no body]. Further attempts are logged on DEBUG level

也就是说我们的客户端无法注册到服务端上了。我们只需在客户端中添加如下配置:

spring:
  boot:
    admin:
      client:
        url: http://localhost:8080
        instance:
          name: user-service
+       username: admin
+       password: admin

这样我们的应用就可以成功的注册到服务端上了。

4. 邮件通知

应用监控当然也不是一直盯着监控页面观察,更多的是用来分析系统问题的。那么系统出现问题时就必须第一时间反映给对应的人,这就需要用到异常通知。

🔖 添加依赖

在 Admin Server 项目下添加 mail 相关依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

🔖 配置邮件

在 Admin Server 项目的 application.yml 文件中添加配置:

spring:
  security:
    user:
      name: admin
      password: admin
+ mail:
+   host: smtp.163.com
+   username: example@163.com
+   password: user_password
+ boot:
+   admin:
+     notify:
+       mail:
+         from: from_example@163.com
+         to: to_example@163.com

这样配置好之后,只要是注册在 Admin 服务端上的应用异常掉线了,服务端都会通过邮件的方式提醒指定用户:

image.png

Reference


关于作者:NekoChips
本文地址:https://chenyangjie.com.cn/articles/2020/05/30/1590811065515.html
版权声明:本篇所有文章仅用于学习和技术交流,本作品采用 BY-NC-SA 4.0 许可协议,如需转载请注明出处!
许可协议:知识共享许可协议