使用Spring Boot Admin

我曾经被问到很多次,开发一个消费Actuator端点的Web应用并为其提供一个易于查看的UI到底有多难、是否有意义。我的答复是,它只是一个REST API,因此一切皆有可能。不过,既然位于德国的软件和咨询公司codecentric AG的优秀工程师已经完成了这项工作,我们为什么还要为Actuator创建自己的UI呢?

Spring Boot Admin是一款管理类的Web前端应用,它可以使得Actuator的端点更易于使用。它分为两个主要的组件:Spring Boot Admin服务器和其客户端。Admin服务器负责收集并展现Actuator数据,而展现的数据则是由一个或多个Spring Boot应用提供的,这些应用就是Spring Boot Admin的客户端,如图16.1所示。

image 2024 03 14 15 28 21 133
Figure 1. 图16.1 Spring Boot Admin的服务器消费来自一个或多个Spring Boot应用的Actuator端点,并将数据展现在一个基于Web的UI中

我们需要将Taco Cloud应用注册为Spring Boot Admin的客户端。首先,需要搭建Spring Boot Admin服务器,以便接收每个客户端的Actuator信息。

创建Admin服务器

为了启用Admin服务器,首先需要创建一个新的Spring Boot应用,并将Admin服务器依赖添加到项目的构建文件中。我们通常会将Admin服务器作为一个单独的应用,以与其他的应用区分开来。因此,一种简单的方式是使用Spring Boot Initializr创建一个新的Spring Boot项目,并选择标签为Spring Boot Admin (Server)的复选框。这样会将如下的依赖添加到<dependencies>代码块中:

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

接下来,需要启用Admin服务器,只需在主配置类上添加@EnableAdminServer注解:

package tacos.admin;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import de.codecentric.boot.admin.server.config.EnableAdminServer;

@EnableAdminServer
@SpringBootApplication
public class AdminServerApplication {

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

}

最后,因为在开发阶段Admin服务器并不是唯一在本地运行的应用,所以需要将其设置为监听唯一端口,且这个端口要易于访问(如不能为0)。在这里,我选择9090作为Spring Boot Admin服务器的端口:

server:
  port: 9090

现在,Admin服务器已经准备就绪。启动应用并在浏览器中访问http://localhost:9090 ,就会看到如图16.2所示的效果。

image 2024 03 14 15 30 05 257
Figure 2. 图16.2 在Spring Boot Admin UI展现的新创建的服务器,此时没有注册任何实例

我们可以看到,Spring Boot Admin显示有0个应用的0个实例正在运行。数字下面有“No applications registered.”这样的提示信息,说明此时这些数字没有任何意义。要让Admin服务器真正发挥作用,需要为其注册应用。

注册Admin客户端

因为Admin服务器独立于要展现Actuator数据的其他Spring Boot应用,所以要让Admin服务器能够以某种方式感知这些应用。Admin服务器有两种方式注册Spring Boot Admin客户端:

  • 每个应用显式向Admin服务器注册自身;

  • Admin通过Eureka服务注册中心发现服务。

我们会重点讨论如何将Spring Boot应用程序配置为Spring Boot Admin客户端,以使它们能够向Admin服务器进行注册。有关使用Eureka的更多信息,请参见Spring Cloud文档或John Carnell和Illary Huaylupo Sánchez编写的《Spring微服务实战(第2版)》。

为了让Spring Boot应用程序将自己注册为Admin服务器的客户端,我们必须在其构建脚本中包含Spring Boot Admin client starter。我们可以在Initializr中选择标有Spring Boot Admin (Client)的复选框,从而很容易地将该依赖项添加到构建文件中,也可以为Maven构建的Spring Boot应用程序设置以下<dependency>:

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

客户端库准备就绪之后,还需要配置Admin服务器的访问地址,这样客户端就可以将自身注册进去。为此,需要将spring.boot.admin.client.url属性值设置为Admin服务器的根URL,像下面这样:

spring:
  application:
      name: taco-cloud
  boot:
      admin:
          client:
              url: http://localhost:9090

注意,在这里,我们还设置了spring.application.name属性。这个属性会被一些Spring项目用来识别应用程序。在这里,它的值是向Admin服务器提供的客户端应用名称,会作为标签出现在Admin服务器中关于应用程序的所有地方。

已注册的应用如图16.3所示。尽管其中并没有太多关于Taco Cloud应用程序的信息,但是我们可以看到应用的运行时间、Spring Boot Maven插件是否配置了build-info goal(正如15.3.1小节中讨论的那样)和构建版本。请放心,在Admin服务器中点击应用后,我们会看到更多应用运行时的细节。

image 2024 03 14 15 31 57 659
Figure 3. 图16.3 Spring Boot Admin UI展示了一个已注册的应用

现在我们已经在Admin服务器上注册了Taco Cloud应用程序,接下来,我们看看Admin服务器提供了哪些功能。