Appearance
Spring In Action 6th:管理 Spring
1. 使用 Spring Boot Admin
我被问过好几次,开发一个消费 Actuator 端点并将其以易于查看的 UI 呈现的 Web 应用程序是否有意义,如果有,那么难度如何。我回答说,这只是一个 REST API,因此,一切皆有可能。但是,当德国的软件和咨询公司 codecentric AG 的好人们已经为你完成了这项工作,那么为什么还要费心为 Actuator 创建自己的 UI 呢?
Spring Boot Admin 是一个管理性的前端 Web 应用程序,使 Actuator 端点更易于人类查看。它主要分为两个组件:Spring Boot Admin 服务器和其客户端。Admin 服务器收集并显示来自一个或多个被标识为 Spring Boot Admin 客户端的 Spring Boot 应用程序提供的 Actuator 数据,如图 1.1 所示:

你需要将你的每一个应用程序,包括 Taco Cloud 应用程序,注册到 Spring Boot Admin 服务器上。但是首先,你需要设置 Spring Boot Admin 服务器,以接收每个客户端的 Actuator 信息。
1.1. 创建 Admin 服务端
要启用 Admin 服务器,你首先需要创建一个新的 Spring Boot 应用程序,并将 Admin 服务器依赖添加到项目的构建中。Admin 服务器通常作为一个独立的应用程序,与任何其他应用程序分开。因此,最简单的开始方式是使用 Spring Boot Initializr 创建一个新的 Spring Boot 项目,并选择标有 Spring Boot Admin(Server)的复选框。这将导致以下依赖被包含在 <dependencies> 块中:
XML
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>1
2
3
4
2
3
4
接下来,你需要通过在主配置类上添加 @EnableAdminServer 注解来启用 Admin 服务器,如下所示:
Java
@EnableAdminServer
@SpringBootApplication
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(AdminServerApplication.class, args);
}
}1
2
3
4
5
6
7
2
3
4
5
6
7
最后,因为 Admin 服务器在开发过程中不会是唯一在本地运行的应用程序,你应该设置它监听一个独特的端口。在这里,我选择了端口 9090 作为 Spring Boot Admin 服务器的端口:
YAML
server:
port: 90901
2
2
现在你的 Admin 服务器已经准备好了。如果你现在启动它,并在你的网络浏览器中导航到 http://localhost:9090,你会看到类似于图 1.2 所示的内容:

如你所见,Spring Boot Admin 显示零个实例的零个应用程序都已启动。所以接下来,你需要向其注册一些应用程序。
1.2. 注册 Admin 客户端
因为 Admin 服务器是一个与其他 Spring Boot 应用程序(它呈现 Actuator 数据)分开的应用程序,你必须以某种方式让 Admin 服务器知道它应该显示哪些应用程序。有两种方式可以将 Spring Boot Admin 客户端注册到 Admin 服务器:
- 每个应用程序都显式地将自己注册到 Admin 服务器;
- Admin 服务器通过 Eureka 服务注册表发现应用程序;
我们将重点介绍如何将单个 Boot 应用程序配置为 Spring Boot Admin 客户端,以便它们可以将自己注册到 Admin 服务器。关于如何使用 Eureka 的更多信息,请参阅 Spring Cloud 文档或 John Carnell 和 Illary Huaylupo Sánchez 的《Spring 微服务实战,第二版》。
要将 Spring Boot 应用程序注册为 Admin 服务器的客户端,你必须在其构建中包含 Spring Boot Admin 客户端启动器。你可以通过在 Initializr 中选择标有 Spring Boot Admin(Client)的复选框轻松地将此依赖添加到你的构建中,或者你可以为 Maven 构建的 Spring Boot 应用程序设置以下 <dependency>:
XML
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>1
2
3
4
2
3
4
有了客户端库,你还需要配置 Admin 服务器的位置,以便客户端可以注册自己。为此,你需要将 spring.boot.admin.client.url 属性设置为 Admin 服务器的根 URL,如下所示:
YAML
spring:
boot:
admin:
client:
url: http://localhost:90901
2
3
4
5
2
3
4
5
Note:你还可以设置
spring.application.name属性,它被 Spring 项目用来识别一个应用程序。在这种情况下,它是将被赋予 Admin 服务器的名称,用作在 Admin 服务器中出现的关于应用程序的信息的标签。
虽然在图 1.3 中显示的关于 Taco Cloud 应用程序的信息并不多,但它确实显示了应用程序的运行时间,Spring Boot Maven 插件是否配置了 build-info 目标(正如我们之前讨论的),以及构建版本。请放心,当你在 Admin 服务器中点击应用程序后,你会看到许多其他的运行时详细信息。

现在你已经将 Taco Cloud 应用程序注册到了 Admin 服务器,让我们来看看 Admin 服务器能提供什么。
2. 深入 Admin 服务端
一旦你已经将所有的 Spring Boot 应用程序注册为 Admin 服务器的客户端,Admin 服务器就会提供大量的信息,让你看到每个应用程序内部正在发生的情况,包括以下内容:
- 一般的健康状况和信息;
- 通过 Micrometer 和
/metrics端点发布的任何指标; - 环境属性;
- 包和类的日志级别;
事实上,几乎所有 Actuator 暴露的内容都可以在 Admin 服务器中查看,尽管它们以更适合人类阅读的格式呈现。还包括图表和过滤器,以帮助提炼信息。Admin 服务器中呈现的信息量远远超过我们在这一章中详细介绍的空间。但是让我用这一节的剩余部分来分享 Admin 服务器的一些亮点。
2.1. 查看普通应用程序运行状况和信息
正如我们在《Spring In Action 6th:Actuator》中讨论的,Actuator 提供的一些最基本的信息是通过 /health 和 /info 端点提供的健康状况和一般应用程序信息。Admin 服务器在 Details 菜单项下显示这些信息,如图 2.1 所示。

如果你在 Details 视图中滚动过 Health 和 Info 部分,你会发现来自应用程序的 JVM 的有用统计信息,包括显示内存、线程和处理器使用情况的图表(参见图 2.2)。
图表中显示的信息,以及 Processes 和 Garbage Collection Pauses 下的指标,可以提供关于你的应用程序如何使用 JVM 资源的有用洞察。这些信息可以帮助你更好地理解和优化你的应用程序的性能。
2.2. 观察关键指标
/metrics 端点呈现的信息可能是 Actuator 所有端点中最不易于人类阅读的。但是,Admin 服务器使我们这些普通人可以轻松地通过其 UI 下的 Metrics 菜单项查看应用程序中生成的度量。

最初,Metrics 视图并不显示任何度量。但是,顶部的表单让你可以在任何你想要关注的度量上设置一个或多个监视器。
在图 16.6 中,我在 http.server.requests 类别下的度量上设置了两个监视器。第一个监视器在收到 HTTP GET 请求并且返回状态为 200(OK)时报告度量。第二个监视器报告任何导致 HTTP 404 (NOT FOUND)响应的请求的度量。
这些度量的好处(实际上,Admin 服务器中显示的几乎所有内容)是它们显示实时数据 —— 它们会自动更新,无需刷新页面。
2.3. 检查环境属性
Actuator 的 /env 端点返回所有可用于 Spring Boot 应用程序的环境属性,这些属性来自其所有的属性源。尽管端点的 JSON 响应并不难读,但 Admin 服务器在 Environment 菜单项下以更加美观的形式呈现它,如图 2.4 所示。
因为可能有数百个属性,你可以通过属性名称或值过滤可用属性列表。图 2.4 显示了通过名称和/或值包含 spring. 文本的属性进行过滤的属性。Admin 服务器还允许你使用 Environment Manager 下的表单设置或覆盖环境属性。

/metrics 端点发布的任何度量上设置监视器
2.4. 查看并设置 log 级别
Actuator 的 /loggers 端点有助于理解和覆盖正在运行的应用程序中的日志级别。Admin 服务器的 Loggers 视图在 /loggers 端点之上添加了一个易于使用的 UI,使管理应用程序中的日志变得简单。图 2.5 显示了通过名称 org.springframework.boot 过滤的日志记录器列表。

默认情况下,Admin 服务器显示所有包和类的日志级别。我们可以通过名称(仅限类)和/或明确配置的日志级别与从根记录器继承的日志级别进行过滤。
3. 保护 Admin 服务端
正如我们在上一章中讨论的,Actuator 端点公开的信息并不是为了普遍消费。它们包含了只有应用程序管理员应该看到的关于应用程序的详细信息。此外,一些端点允许进行的更改肯定不应该向任何人公开。就像 Actuator 的安全性一样,Admin 服务器的安全性也很重要。更重要的是,如果 Actuator 端点需要身份验证,那么 Admin 服务器需要知道凭据才能访问这些端点。让我们看看如何为 Admin 服务器添加一些安全性。我们将从需要身份验证开始。
3.1. 在 Admin 服务端中启用登录
将安全性添加到 Admin 服务器可能是一个好主意,因为它默认情况下并未加固。由于 Admin 服务器是一个 Spring Boot 应用程序,你可以像对待任何其他 Spring Boot 应用程序一样使用 Spring Security 对其进行加固。就像你对任何由 Spring Security 加固的应用程序一样,你可以自由地决定哪种安全方案最适合你的需求。
你可以通过在 Initializr 中勾选 Security 复选框或者在项目的 pom.xml 文件中添加以下 <dependency> 来将 Spring Boot security starter 添加到 Admin 服务器的构建中:
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>1
2
3
4
2
3
4
然后,为了不必一直查看 Admin 服务器的日志以获取随机生成的密码,你可以在 application.yml 中配置一个简单的管理员用户名和密码,如下所示:
YAML
spring:
security:
user:
name: admin
password: 53cr3t1
2
3
4
5
2
3
4
5
现在,当在浏览器中加载 Admin 服务器时,你将被 Spring Security 的默认登录表单提示输入用户名和密码。如代码片段中所示,输入 admin 和 53cr3t 就可以进入。
默认情况下,Spring Security 将在 Spring Boot Admin 服务器上启用 CSRF,这将阻止客户端应用程序注册到 Admin 服务器。因此,我们需要一小部分安全配置来禁用 CSRF,如下所示:
Java
@EnableWebFluxSecurity
public class SecurityConfig {
@Bean
public SecurityWebFilterChain filterChain(ServerHttpSecurity http) throws
Exception {
return http
.csrf()
.disable()
.build();
}
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
当然,这种安全配置非常基础。我建议你参考《Spring In Action 6th:Spring 安全》,了解如何为 Admin 服务器配置更丰富的 Spring Security 安全方案。
3.2. 使用 Actuator 进行认证
在《Spring In Action 6th:Actuator》中,我们讨论了如何使用 HTTP Basic 认证来保护 Actuator 端点。通过这样做,你可以阻止所有不知道你分配给 Actuator 端点的用户名和密码的人。不幸的是,这也意味着 Admin 服务器除非提供用户名和密码,否则无法使用 Actuator 端点。但是 Admin 服务器要如何获得这些凭证呢?
如果应用程序直接向 Admin 服务器注册,那么它可以在注册时将其凭证发送给服务器。你需要配置一些属性来启用这个功能。
spring.boot.admin.client.username 和 spring.boot.admin.client.password 属性指定了 Admin 服务器可以用来访问应用程序的 Actuator 端点的凭证。以下是 application.yml 中的一段片段,展示了你可能如何设置这些属性:
YAML
spring:
boot:
admin:
client:
url: http://localhost:9090
username: admin
password: 53cr3t1
2
3
4
5
6
7
2
3
4
5
6
7
username 和 password 属性必须在每个向 Admin 服务器注册的应用程序中设置。给定的值必须与 Actuator 端点的 HTTP Basic 认证头部所需的用户名和密码匹配。在这个例子中,它们被设置为 admin 和 53cr3t,这些是配置用来访问 Actuator 端点的凭证。
4. 总结
Spring Boot Admin 服务器从一个或多个 Spring Boot 应用程序中获取 Actuator 端点,并将数据以用户友好的方式展示在 Web 应用程序中;
Spring Boot 应用程序可以选择自己注册为 Admin 服务器的客户端,或者 Admin 服务器可以通过 Eureka 发现它们;
与捕获应用程序状态快照的 Actuator 端点不同,Admin 服务器能够显示应用程序内部运行的实时视图;
Admin 服务器可以轻松过滤 Actuator 结果,并在某些情况下,将数据以图形的形式进行可视化展示;
由于它是一个 Spring Boot 应用程序,Admin 服务器可以通过 Spring Security 的任何可用手段进行保护;