⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud/SB-Admin/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labslabx-15 目录。

原创不易,给点个 Star 嘿,一起冲鸭!

1. 概述

在 Spring Boot 项目中,我们可以使用 Spring Boot Admin 作为监控工具。Spring Boot Admin 通过 Spring Boot 项目使用的 Actuator 提供的监控端点,实现对其的监控和管理功能。

拓展阅读:

而 Spring Cloud 项目,目前暂时没有专门针对它的监控工具。不过,因为 Spring Cloud 项目的基础是 Spring Boot,所以我们依然可以在 Spring Cloud 项目中使用 Actuator Actuator 提供监控端点,通过 Spring Boot Admin 作为监控工具

FROM 《Spring Boot Admin Reference Guide》

codecentric’s Spring Boot Admin is a community project to manage and monitor your Spring Boot ® applications.
Spring Boot Admin 是由 https://github.com/codecentric 开源的一个社区项目,用于管理和监控 Spring Boot 应用。

The applications register with our Spring Boot Admin Client (via HTTP) or are discovered using Spring Cloud ® (e.g. Eureka, Consul).
被监控和管理的应用程序,有两种方式注册到 Spring Boot Admin Server 上。

  • 方式一,被监控和管理的应用程序,使用 Spring Boot Admin Client 库,通过 HTTP 调用注册到 Spring Boot Admin Server 上。
  • 方式二,首先,被监控和管理的应用程序,注册到 Spring Cloud 集成的注册中心;然后 Spring Boot Admin Server 通过注册中心获取到被监控和管理的应用程序。

The UI is just a Vue.js application on top of the Spring Boot Actuator endpoints.

Spring Boot Admin Server UI 部分,采用 Vue 前端框架实现。
同时,Spring Boot Admin 是基于调用 Spring Boot Actuator 端点,进行实现的。

  • 胖友认真看看艿艿上面的翻译噢,非直译。

在 Spring Cloud 项目中,显然使用方式二,Spring Boot Admin 通过注册中心来获取到所有的 Spring Cloud 项目的应用实例。考虑到国内采用 Nacos 作为注册中心已经越来越流行,本文就使用它咧。

友情提示:不知道如何安装 Nacos 的胖友,可以阅读《Nacos 极简入门》文章。

2. 快速入门

示例代码对应仓库:

本小节,我们采用方式二,基于 Spring Cloud 支持的注册中心,来实现 Spring Boot Admin 对注册到注册中心的应用,进行监控与管理。这里,我们采用 Nacos 作为注册中心。整个示例的过程如下:

  • 首先,默认安装并启动 Nacos 注册中心。
  • 然后,我们会创建 labx-15-admin-02-demo-application 项目,启动示例项目作为应用,注册到 Nacos 上。
  • 最后,我们会创建 labx-15-admin-02-adminserver 项目,启动 Spring Boot Admin Server 监控工具。之后,Spring Boot Admin Server 从 Nacos 获取到示例项目的两个应用节点,进行监控与管理。

下面,我们会分成三个小小节,分别搭建上述的三个步骤。

2.1 安装 Nacos 注册中心

参考《Nacos 极简入门》文章,安装并启动 Nacos 注册中心。

友情提示:如果想要使用 Eureka 作为注册中心,可以参考《芋道 Spring Boot 监控工具 Admin 入门》文章的「4. 基于 Spring Cloud 注册中心」小节。

2.2 Spring Boot Admin Server

对应 labx-15-admin-02-adminserver 项目,作为 Spring Boot Admin Server。最终项目如下图所示:项目结构

2.2.1 引入依赖

pom.xml 文件中,引入相关依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>labx-15</artifactId>
<groupId>cn.iocoder.springboot.labs</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>labx-15-admin-02-adminserver</artifactId>

<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<spring.boot.version>2.2.4.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR1</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.0.RELEASE</spring.cloud.alibaba.version>
</properties>

<!--
引入 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者 BOM 文件,进行依赖版本的管理,防止不兼容。
在 https://dwz.cn/mcLIfNKt 文章中,Spring Cloud Alibaba 开发团队推荐了三者的依赖关系
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<!-- 实现对 Spring Boot Admin Server 的自动化配置 -->
<!--
包含 1. spring-boot-admin-server :Server 端
2. spring-boot-admin-server-ui :UI 界面
3. spring-boot-admin-server-cloud :对 Spring Cloud 的接入
-->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.2.2</version>
</dependency>

<!-- 引入 Spring Cloud Alibaba Nacos Discovery 相关依赖,将 Nacos 作为注册中心,并实现对其的自动配置 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>

</project>

  • 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。

2.2.2 配置文件

创建 application.yaml 配置文件,设置 Nacos 注册中心的配置项。配置如下:

spring:
application:
name: demo-admin-server # Spring 应用名
cloud:
nacos:
# Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类
discovery:
server-addr: 127.0.0.1:8848 # Nacos 服务器地址
service: ${spring.application.name} # 注册到 Nacos 的服务名。默认值为 ${spring.application.name}。

关于 spring.cloud.nacos.discovery 配置项的内容,胖友可以后续阅读《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》文章。

2.2.3 AdminServerApplication

创建 AdminServerApplication 类,用于启动 Spring Boot Admin Server。代码如下:

@SpringBootApplication
@EnableAdminServer
public class AdminServerApplication {

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

}

在类上,添加了 @EnableAdminServer 注解,表示开启 Spring Boot Admin Server 功能。

2.2.4 简单测试

运行 AdminServerApplication 方法,启动 Spring Boot Admin Server。控制台输出日志如下:

2020-03-29 08:28:14.498  INFO 17224 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 8080

  • 有没惊奇的发现,启动的 Server 是 Netty 。😈 Spring Boot Admin Server 采用 WebFlux 实现噢。

使用浏览器,打开 http://127.0.0.1:8080/ 地址,访问 Spring Boot Admin Server UI 。界面如下:Spring Boot Admin Server UI

比较友好的是,UI 界面目前支持中文,美滋滋。不过考虑到和 Spring Boot Actuator 更好的对应,所以我们还是切换到英文。

2.3 Spring Cloud 项目

对应 labx-15-admin-02-demo-application 项目,作为 Spring Cloud 示例项目。最终项目如下图所示:项目结构

2.3.1 引入依赖

pom.xml 文件中,引入相关依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>labx-15</artifactId>
<groupId>cn.iocoder.springboot.labs</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>labx-15-admin-02-demo-application</artifactId>

<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<spring.boot.version>2.2.4.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR1</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.0.RELEASE</spring.cloud.alibaba.version>
</properties>

<!--
引入 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者 BOM 文件,进行依赖版本的管理,防止不兼容。
在 https://dwz.cn/mcLIfNKt 文章中,Spring Cloud Alibaba 开发团队推荐了三者的依赖关系
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<!-- 实现对 Spring MVC 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- 实现对 Actuator 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!-- 引入 Spring Cloud Alibaba Nacos Discovery 相关依赖,将 Nacos 作为注册中心,并实现对其的自动配置 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>

</project>

很干净,我们并不会引入 Spring Boot Admin 相关的依赖。

2.3.2 配置文件

创建 application.yaml 配置文件,设置 Nacos 注册中心Spring Boot Actuator 的配置项。配置如下:

management:
endpoints:
# Actuator HTTP 配置项,对应 WebEndpointProperties 配置类
web:
exposure:
include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。

spring:
application:
name: demo-application # 应用名
cloud:
nacos:
# Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类
discovery:
server-addr: 127.0.0.1:8848 # Nacos 服务器地址
service: ${spring.application.name} # 注册到 Nacos 的服务名。默认值为 ${spring.application.name}。

2.3.3 DemoApplication

创建 Demo01ApplicationDemo02Application 类,用于方便启动该项目的两个应用节点。代码如下:

// Demo01Application.java
@SpringBootApplication
@EnableDiscoveryClient
public class Demo01Application {

public static void main(String[] args) {
System.setProperty("server.port", "18081"); // 端口 18081
SpringApplication.run(Demo01Application.class, args);
}

}

// Demo02Application.java
@SpringBootApplication
@EnableDiscoveryClient
public class Demo02Application {

public static void main(String[] args) {
System.setProperty("server.port", "18082"); // 端口 18082
SpringApplication.run(Demo02Application.class, args);
}

}

  • 通过 "server.port" 配置项,设置不同的服务器端口。

2.3.4 简单测试

分别运行 Demo01Application 和 Demo02Application,启动该项目的两个应用节点。此时在 Nacos 控制台看到 demo-application 服务有两个示例,如下图所示:Nacos 服务列表

② 使用浏览器,打开 http://127.0.0.1:8080/ 地址,访问 Spring Boot Admin Server UI 。界面如下:Spring Boot Admin Server UI

  • 可以看到 "demo-application" 中,有我们刚启动的两个应用节点,处于在线状态。

后续的使用与测试,参考「3. 功能介绍」即可。

3. 功能介绍

直接偷懒,复用《芋道 Spring Boot 监控工具 Admin 入门》「3. 功能介绍」的内容。

Spring Boot Admin 提供的功能挺强大的,基本所有 Actuator 端点提供的功能,都开发了相应的 UI 界面。其仓库介绍功能列表如下:

FROM https://github.com/codecentric/spring-boot-admin

It provides the following features for registered applications.

  • Show health status
  • Show details, like
    • JVM & memory metrics
    • micrometer.io metrics
    • Datasource metrics
    • Cache metrics
  • Show build-info number
  • Follow and download logfile
  • View jvm system- & environment-properties
  • View Spring Boot Configuration Properties
  • Support for Spring Cloud's postable /env- &/refresh-endpoint
  • Easy loglevel management
  • Interact with JMX-beans
  • View thread dump
  • View http-traces
  • View auditevents
  • View http-endpoints
  • View scheduled tasks
  • View and delete active sessions (using spring-session)
  • View Flyway / Liquibase database migrations
  • Download heapdump
  • Notification on status change (via e-mail, Slack, Hipchat, ...)
    状态变更通知(通过电子邮件,Slack,Hipchat,......)
  • Event journal of status changes (non persistent)
    状态更改的事件日志(非持久性)
  • 英文比较简单,基本和 Actuator 端点能够一一对应上。😈 暂时就不翻译了,翻译了反倒增加理解的障碍。

继续「2. 快速入门」的示例,点击具体某个应用,进入该应用的监控与管理。如下图:

  • 应用列表
  • 应用明细

功能还是蛮丰富的,我们逐个菜单来看看。

3.1 Insights

3.1.1 Details

翻译为细节。如下图:Details

对应多个 Actuator 端点,拼凑而成的界面。涉及元数据、健康状态、进程、线程、JVM GC、JVM 内存。

3.1.2 Metrics

翻译为性能。如下图:Metrics

对应 metrics 端点,可见《芋道 Spring Boot 监控端点 Actuator 入门》「6. metrics 端点」小节。

通过该界面,我们可以选择要查询的 Metrics ,点击「Add Metrics」按钮,确认添加。

3.1.3 Environment

翻译为环境。如下图:Environment

对应 env 端点,可见《芋道 Spring Boot 监控端点 Actuator 入门》「11. env 端点」小节。

3.1.4 Beans

翻译为。如下图:Beans

对应 beans 端点,可见《芋道 Spring Boot 监控端点 Actuator 入门》「9. beans 端点」小节。

3.1.5 Configuration Properties

翻译为配置属性。如下图:Configuration Properties

对应 configprops 端点,可见《芋道 Spring Boot 监控端点 Actuator 入门》「12. configprops 端点」小节。

3.1.6 Scheduled Tasks

翻译为配置属性。如下图:Scheduled Tasks

对应 scheduledtasks 端点,可见《芋道 Spring Boot 监控端点 Actuator 入门》「19. scheduledtasks 端点」小节。

3.2 Loggers

翻译为日志配置。如下图:Loggers

对应 loggers 端点,可见《芋道 Spring Boot 监控端点 Actuator 入门》「14. loggers 端点」小节。

可以查看和修改 Logger 配置。

3.3 JVM

3.3.1 JMX

翻译为Java 管理扩展。如下图:JMX

对应《Spring Boot Actuator: Production-ready Features —— 4. Monitoring and Management over JMX》文档。

3.3.2 Thread Dump

翻译为线程转储。如下图:Thread Dump

对应 threaddump 端点,可见《芋道 Spring Boot 监控端点 Actuator 入门》「15. threaddump 端点」小节。

从界面开始,每秒读取一次线程快照。= = 图片上写错了。

3.3.3 Heap Dump

翻译为内存转储。如下图:Heap Dump

对应 heapdump 端点,可见《芋道 Spring Boot 监控端点 Actuator 入门》「16. heapdump 端点」小节。

3.4 Mappings

翻译为映射。如下图:Mappings

对应 loggers 端点,可见《芋道 Spring Boot 监控端点 Actuator 入门》「13. mappings 端点」小节。

3.5 Caches

翻译为缓存。如下图:Caches

对应 caches 端点。

4. Admin Server 安全认证

示例代码对应仓库:

考虑到安全性,我们需要给 Spring Boot Admin Server 增加安全认证,需要经过登录之后,才可以使用。我们可以通过整合 Spring Security 框架,快速的实现安全认证的功能。

友情提示:如果没有学习过 Spring Security 框架的胖友,后续可以看看《芋道 Spring Boot 安全框架 Spring Security 入门》文章。

下面,我们就来进行本小节的示例,考虑到不污染「2. 快速入门」 的示例,我们在 labx-15-admin-02-adminserver 项目的基础上,复制出一个 labx-15-admin-03-adminserver 项目。最终项目如下图所示:项目结构

4.1 引入依赖

修改 pom.xml 文件中,额外引入 spring-boot-starter-security 相关依赖。

<!-- 实现对 Spring Security 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

4.2 SecurityConfig

创建 SecurityConfig 配置类,增加 Spring Security 配置。代码如下:

// SecurityConfig.java

@Configuration
@EnableWebFluxSecurity // 开启 Security 对 WebFlux 的安全功能
public class SecurityConfig {

@Bean
public MapReactiveUserDetailsService userDetailsService() {
// 创建一个用户
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("user")
.roles("USER")
.build();

// 如果胖友有更多用户的诉求,这里可以继续创建

// 创建 MapReactiveUserDetailsService
return new MapReactiveUserDetailsService(user);
}

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.authorizeExchange(exchanges -> // 设置权限配置
exchanges
.pathMatchers("/assets/**").permitAll() // 静态资源,允许匿名访问
.pathMatchers("/login").permitAll() // 登录接口,允许匿名访问
.anyExchange().authenticated() //
)
.formLogin().loginPage("/login") // 登录页面
.and().logout().logoutUrl("/logout") // 登出界面
.and().httpBasic() // HTTP Basic 认证方式
.and().csrf().disable(); // csrf 禁用
return http.build();
}

}

① 在类上,添加 @EnableWebFluxSecurity 注解,开启 Security 对 WebFlux 的安全功能。😈 因为 Spring Boot Admin Server 是基于 WebFlux 实现的,所以不能按照我们之前针对 Servlet 的配置方式。

#userDetailsService() 方法,创建了 MapReactiveUserDetailsService 对象。在其中,我们配置了一个「user/user」账号。如果胖友有更多用户的诉求,这里可以继续创建。

#springSecurityFilterChain(...) 方法,创建了SecurityWebFilterChain 对象。在其中,我们设置了权限配置、登录页面、登出地址、禁用 csrf 。

4.3 简单测试

① 运行 AdminServerApplication 方法,启动 Spring Boot Admin Server。

② 使用浏览器,打开 http://127.0.0.1:8080/ 地址,访问 Spring Boot Admin Server UI 。此时,因为我们暂未登录,所以被 Spring Security 拦截跳转到 http://127.0.0.1:8080/login 登录页。如下图:登录页面

③ 登录完成,我们就能进入 Spring Boot Admin Server 首页。如下图:首页

此时我们会发现,demo-admin-server 服务【自己】是出于离线状态的,这是为什么呢?因为我们使用 Spring Security 开启了安全认证功能,恰好把 Spring Boot Actuator 的 /actuator/* 路径一起拦截了,导致 Spring Boot Admin Server 无法访问 demo-admin-server 服务的 /actuator/* 接口。

解决办法也很简单,在服务注册到 Nacos 等注册中心时,在元数据带上 Spring Security 的安全认证的账号密码即可。那么,我们来修改 appliation.yaml 配置文件,在 spring.cloud.nacos.discovery.metadata 配置项中,添加 user.name 账号、user.password 密码。完整配置文件如下:

spring:
application:
name: demo-admin-server # Spring 应用名
cloud:
nacos:
# Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类
discovery:
server-addr: 127.0.0.1:8848 # Nacos 服务器地址
service: ${spring.application.name} # 注册到 Nacos 的服务名。默认值为 ${spring.application.name}。
metadata:
user.name: user # Spring Security 安全认证的账号
user.password: user # Spring Security 安全认证的密码

重新运行 AdminServerApplication 方法,重启 Spring Boot Admin Server。然后重新登录,进入 Spring Boot Admin Server 首页后,就会发现 demo-admin-server 服务处于在线状态。如下图:首页 02

5. Admin Client 安全认证

示例代码对应仓库:

友情提示:哈哈哈,有点不造怎么给这个小节取标题。简单来说,就是 Spring Cloud 项目的 Spring Boot Actuator 提供的 /actuator/* 也使用了 Spring Security 进行安全认证。

解决方案和「4. Admin Server 安全认证」小节一样,也是通过在元数据带上 Spring Security 的安全认证的账号密码的方式。

《芋道 Spring Boot 监控端点 Actuator 入门》中,我们看到可以通过整合 Spring Security 框架,给 Spring Boot Actuator 的端点增加安全认证的功能。这就意味着,如果 Spring Boot Admin Server 访问 Spring Boot Actuator 的端点时,也需要知道该端点的账号密码。

因此,我们需要在 Spring Cloud 应用在注册自己到注册中心时,同时在实例的 metadata 元数据中带上 Actuator 端点的账号密码。

下面,我们就来进行本小节的示例,考虑到不污染「2. 快速入门」 的示例,我们在 labx-15-admin-02-demo-application 项目的基础上,复制出一个 labx-15-admin-03-demo-application 项目。最终项目如下图所示:项目结构

5.1 引入依赖

修改 pom.xml 文件中,额外引入 spring-boot-starter-security 相关依赖。

<!-- 实现对 Spring Security 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

5.2 配置文件

修改 application.yml 配置文件,添加安全认证所需的配置,如下:

management:
endpoints:
# Actuator HTTP 配置项,对应 WebEndpointProperties 配置类
web:
exposure:
include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。

spring:
application:
name: demo-application # 应用名

# Spring Security 配置项,对应 SecurityProperties 配置类
security:
# 配置默认的 InMemoryUserDetailsManager 的用户账号与密码。
user:
name: test # 账号
password: test # 密码

cloud:
nacos:
# Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类
discovery:
server-addr: 127.0.0.1:8848 # Nacos 服务器地址
service: ${spring.application.name} # 注册到 Nacos 的服务名。默认值为 ${spring.application.name}。
metadata:
user.name: ${spring.security.user.name} # Spring Security 认证账号
user.password: ${spring.security.user.password} # Spring Security 认证密码

① 新增 spring.security.user 配置项,配置了一个 Spring Security 认证账号。后续 Spring Boot Admin Server 在访问该应用的 Actuator 的端点时,需要使用该账号进行认证。

② 新增 spring.boot.admin.client.instance.metadata 配置项,设置 Actuator 端点的认证账号和密码。

5.3 简单测试

① 运行 AdminServerApplication 方法,启动 Spring Boot Admin Server。

② 运行 Demo01Application 方法,启动 Spring Cloud 应用。

③ 使用浏览器,打开 http://127.0.0.1:8080/ 地址,访问 Spring Boot Admin Server UI。此时我们可以看到,可以正常监控当前启动的 Spring Cloud 应用,如下图所示:首页

6. 监控告警

在 Spring Boot Admin 中,已经集成告警功能。例如说,被监控的应用状态变更为 DOWNOFFLINEUNKNOWN 时,会自动发出告警。

Spring Boot Admin 内置了多种告警方式:

考虑到可能告警胖友会漏看,或者不及时,Spring Boot Admin 支持针对 DOWNOFFLINE 的应用的重复告警。具体的,可以参考《Spring Boot Admin Reference Guide —— 4.5.11. Notification Reminder》文档。

考虑到并不是所有告警通知都是我们所需要的,Spring Boot Admin 提供了过滤机制。具体的,可以参考《Spring Boot Admin Reference Guide —— 4.5.12. Filtering Notifications》文档。

6.1 邮件告警

考虑到基于邮件,是我们最常用的告警方式,所以在本小节中,我们来搭建一个 Spring Boot Admin 邮件告警的示例。考虑到不污染「2. 快速入门」 的示例,我们在 labx-15-admin-02-adminserver 项目的基础上,复制出一个 labx-15-admin-04-adminserver-mail 项目。最终项目如下图所示:项目结构

6.1.1 引入依赖

修改 pom.xml 文件中,额外引入 spring-boot-starter-mail 相关依赖。

<!-- 实现对 Java Mail 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

6.1.2 配置文件

application.yml 中,添加邮件告警的配置,如下:

spring:
mail: # 配置发送告警的邮箱
host: smtp.126.com
username: wwbmlhh@126.com
password: '******'
default-encoding: UTF-8

boot:
admin:
notify:
mail:
from: ${spring.mail.username} # 告警发件人
to: 7685413@qq.com # 告警收件人

  • spring.mail 配置项下,设置发送告警的邮箱。
  • spring.boot.admin.nofity.mail 配置项下,设置 Spring Boot Admin Server 邮件告警的配置。

6.1.3 简单测试

① 首先,我们使用 AdminServerApplication 来启动一个 Spring Boot Admin Server。

② 然后,我们使用 labx-15-admin-02-demo-application 项目,我们使用 Demo01Application 来启动一个 Spring Cloud 应用。

③ 之后,我们主动关闭被监控的应用,模拟应用下线的场景,从而触发告警。此时,我们打开接收告警的邮箱,成功收到一封告警邮件。如下图:邮件告警

6.2 自定义告警

虽然说,Spring Boot Admin 已经内置了多种告警方式,但是实际场景下,我们可能还需要其它告警方式。例如说,短信告警、电话告警、钉钉告警、公众号告警等等。

下面,我们来搭建一个 Spring Boot Admin 自定义告警的示例。考虑到不污染「2. 快速入门」 的示例,我们在 labx-15-admin-02-adminserver 项目的基础上,复制出一个 labx-15-admin-04-adminserver-custom 项目。最终项目如下图所示:项目结构

6.2.1 LoggerNotifier

创建 LoggerNotifier 类,实现 AbstractEventNotifier 抽象类,实现自定义告警。代码如下:

// LoggerNotifier.java

@Component
public class LoggerNotifier extends AbstractStatusChangeNotifier {

private Logger logger = LoggerFactory.getLogger(getClass());

public LoggerNotifier(InstanceRepository repository) {
super(repository);
}

@Override
protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
return Mono.fromRunnable(() -> {
if (event instanceof InstanceStatusChangedEvent) {
logger.info("Instance {} ({}) is {}", instance.getRegistration().getName(), event.getInstance(),
((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());
} else {
logger.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(), event.getType());
}
});
}

}

  • AbstractEventNotifier 是 Spring Boot Admin 定义的事件通知器的抽象基类,其类图如下:AbstractEventNotifier 类图
  • InstanceEvent 是 Spring Boot Admin 定义的实例事件的抽象基类,其类图如下:InstanceEvent 类图
  • 通过实现 #doNotify(InstanceEvent event, Instance instance) 方法,实现对指定实例的指定事件,进行自定义的告警通知。例如说,调用短信发送接口、钉钉消息发送接口等等。这里,😈 我们为了简单化,就打印下日志吧,嘿嘿。

6.2.2 简单测试

① 首先,我们使用 AdminServerApplication 来启动一个 Spring Boot Admin Server。

② 然后,我们使用 labx-15-admin-02-demo-application 项目,我们使用 Demo01Application 来启动一个 Spring Cloud 应用。此时,Spring Boot Admin Server 控制台输出日志如下:

# 非 InstanceStatusChangedEvent 事件
2019-12-28 16:00:24.268 INFO 58652 --- [ctor-http-nio-2] c.i.s.l.a.notify.LoggerNotifier : Instance demo-application (278170067ddd) REGISTERED
2019-12-28 16:00:24.393 INFO 58652 --- [ctor-http-nio-3] c.i.s.l.a.notify.LoggerNotifier : Instance demo-application (278170067ddd) is UP
2019-12-28 16:00:24.434 INFO 58652 --- [ctor-http-nio-3] c.i.s.l.a.notify.LoggerNotifier : Instance demo-application (278170067ddd) ENDPOINTS_DETECTED

③ 之后,我们主动关闭被监控的应用,模拟应用下线的场景,从而触发告警。此时,Spring Boot Admin Server 控制台输出日志如下:

# InstanceStatusChangedEvent 事件
2019-12-28 16:02:21.673 INFO 58652 --- [ctor-http-nio-3] c.i.s.l.a.notify.LoggerNotifier : Instance demo-application (278170067ddd) is OFFLINE

一般来说,我们只基于 InstanceStatusChangedEvent 事件,进行告警处理。例如说,MailNotifier 邮件通知器,通过继承 AbstractStatusChangeNotifier 抽象类,只处理 InstanceStatusChangedEvent 实例状态变化事件,进行发送邮件。

6.3 钉钉告警

基于「6.2 自定义告警」的方式,我们可以实现钉钉告警。

代码比较简单,胖友可以直接参考 https://github.com/luoyoubao/springboot-admin-demo 仓库。艿艿偷个小懒,嘿嘿。

666. 彩蛋

至此,我们已经完成 Spring Boot Admin 作为 Spring Cloud 的监控工具的学习。如下是 Spring Boot Admin 相关的官方文档:

总得来说,Spring Boot Admin 算是不错的轻量级的监控工具,只需要极少量的配置,就可以完成 Spring Cloud 的应用的监控、管理、甚至说告警。一般情况下,如果想要快速搭建一个监控工具,那么 Spring Boot Admin 算是一个不错的选择。

不过呢,Spring Boot Admin 比较大的一个问题,并不会主动采集 Spring Boot 应用的 Metrics 指标数据,记录到存储器中。这样就会导致,我们如果排查问题时,需要查看过去一段时间的 Metrics 指标数据,就无从得知。当然,此时我们可以考虑通过 Prometheus + Grafana 打造监控平台。😈 感兴趣的胖友,可以阅读《芋道 Spring Boot 监控平台 Prometheus + Grafana 入门》文章。

更多的时候,我们可以把 Spring Boot Admin 看成 Spring Boot 应用的 Actuator 的网关,负责将 UI 界面需要的数据,转发到对应的应用的 Actuator 的端点,从而让我们可以进行不同应用实例的监控与管理。也因此,艿艿把 Spring Boot Admin 定义为监控工具

文章目录
  1. 1. 1. 概述
  2. 2. 2. 快速入门
    1. 2.1. 2.1 安装 Nacos 注册中心
    2. 2.2. 2.2 Spring Boot Admin Server
      1. 2.2.1. 2.2.1 引入依赖
      2. 2.2.2. 2.2.2 配置文件
      3. 2.2.3. 2.2.3 AdminServerApplication
      4. 2.2.4. 2.2.4 简单测试
    3. 2.3. 2.3 Spring Cloud 项目
      1. 2.3.1. 2.3.1 引入依赖
      2. 2.3.2. 2.3.2 配置文件
      3. 2.3.3. 2.3.3 DemoApplication
    4. 2.4. 2.3.4 简单测试
  3. 3. 3. 功能介绍
    1. 3.1. 3.1 Insights
      1. 3.1.1. 3.1.1 Details
      2. 3.1.2. 3.1.2 Metrics
      3. 3.1.3. 3.1.3 Environment
      4. 3.1.4. 3.1.4 Beans
      5. 3.1.5. 3.1.5 Configuration Properties
      6. 3.1.6. 3.1.6 Scheduled Tasks
    2. 3.2. 3.2 Loggers
    3. 3.3. 3.3 JVM
      1. 3.3.1. 3.3.1 JMX
      2. 3.3.2. 3.3.2 Thread Dump
      3. 3.3.3. 3.3.3 Heap Dump
    4. 3.4. 3.4 Mappings
    5. 3.5. 3.5 Caches
  4. 4. 4. Admin Server 安全认证
    1. 4.1. 4.1 引入依赖
    2. 4.2. 4.2 SecurityConfig
    3. 4.3. 4.3 简单测试
  5. 5. 5. Admin Client 安全认证
    1. 5.1. 5.1 引入依赖
    2. 5.2. 5.2 配置文件
    3. 5.3. 5.3 简单测试
  6. 6. 6. 监控告警
    1. 6.1. 6.1 邮件告警
      1. 6.1.1. 6.1.1 引入依赖
      2. 6.1.2. 6.1.2 配置文件
      3. 6.1.3. 6.1.3 简单测试
    2. 6.2. 6.2 自定义告警
      1. 6.2.1. 6.2.1 LoggerNotifier
      2. 6.2.2. 6.2.2 简单测试
      3. 6.2.3. 6.3 钉钉告警
  7. 7. 666. 彩蛋