17.1 使用Spring Boot Admin

17.1 使用Spring Boot Admin

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

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

image-20211023202613037

图17.1 Spring Boot Admin的服务器消费来自一个或多个Spring Boot应用的Actuator端点,并将数据展现在一个基于Web的UI中

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

17.1.1 创建Admin服务器

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

1
2
3
4
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>

现在,我们需要启用Admin服务器,只需要在主配置类上添加@EnableAdminServer注解就可以了,如下所示:

1
2
3
4
5
6
7
8
9
10
11
package tacos.bootadmin;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import de.codecentric.boot.admin.server.config.EnableAdminServer;
@SpringBootApplication
@EnableAdminServer
public class BootAdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(BootAdminServerApplication.class, args);
}
}

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

1
2
server:
port: 9090
注意:与其他微服务架构的Spring Boot应用类似,server.port可以在生产环境的profile使用不同的端口,在那时端口可能会由底层平台来决定。

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

image-20211023202805870

图17.2 没有任何实例在运行

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

17.1.2 注册Admin客户端

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

  • 每个应用显式向Admin服务器注册自身;
  • Admin通过Eureka服务注册中心发现服务。

接下来,我们分别看一下这两种方案,首先是如何将单个Spring Boot应用配置为Spring Boot Admin客户端,这样它们就能向Admin服务器注册自身了。

显式配置Admin客户端应用

为了让Spring Boot应用注册为Admin服务器的客户端,我们必须将Spring BootAdmin client starter添加到项目的构建文件中。在Initializr中,我们可以选中标签为Spring Boot Admin (Client)的复选框,这样很容易就能将这个依赖添加到构建文件中。对于Maven构建的Spring Boot应用,我们也可以设置如下的依赖:

1
2
3
4
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>

客户端库准备就绪之后,我们需要配置Admin服务器的位置。这样的话,客户端就可以将自身注册进去。为了实现这一点,我们可以将spring.boot.admin.client.url属性设置为Admin服务器的根路径:

1
2
3
4
5
6
7
spring:
application:
name: ingredient-service
boot:
admin:
client:
url: http://localhost:9090

注意,在这里,我们还设置了spring.application.name属性(在本例中,也就是配料服务)。我们之前已经使用这个属性在Spring Cloud Config Server和Eureka中识别微服务。这里,它的目的很类似:识别Admin服务器中的应用。我们重启应用之后,将会看到它出现在Admin服务器中,如图17.3所示。

image-20211023202908369

图17.3 Spring Boot Admin UI展现了一个已注册的应用

尽管在图17.3中并没有太多关于配料服务的信息,但是我们可以看到应用的启动时间。如果Spring Boot Maven插件配置了build-info goal(如16.3.1小节所讨论的那样),这里还会显示构建版本。请放心,在Admin服务器中点击应用之后,我们会看到很多其他运行时的细节。我们将会在17.2节深入了解Admin服务器都提供了哪些功能。

我们需要在所有的应用间重复设置这些在Admin服务器中注册配料服务的配置。一种比较简单的方式是我们只配置spring.application.name属性,Spring CloudConfig Server会将spring.boot.admin.client.url发送给它的所有客户端。如果你已经使用Eureka作为服务注册中心,那么更好的方式是让Admin自己去发现服务。接下来,我们看一下如何将Admin配置为Eureka客户端。

发现Admin客户端

如果想让Admin服务器来发现服务,唯一需要做的事情就是添加Spring CloudNetflix Eureka Client starter到Admin服务器的构建文件中。如下是我们需要的Maven <dependency>

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
注意:我们也可以通过在Spring Initializr中选择Eureka Discovery复选框来添加该依赖。

Admin服务器启用了Eureka客户端功能之后,什么事情都不需要做了。我们可以直接略过上文所述的客户端配置,因为Admin会自动发现注册在Eureka中的服务并展现它们的Actuator数据。如果Eureka中注册了多个Taco Cloud服务,那么它们将会展现在Admin服务器中(参见图17.4)。

image-20211023202942990

图17.4 Spring Boot Admin UI能够展现在Eureka中发现的所有服务

在图17.4中列出了4个不同的应用,对应了6个服务:订单服务有两个实例,taco服务有两个实例,其他的两个应用各有一个实例。这里显示的所有应用均处于UP状态。如果有应用掉线(比如用户服务),就将会在Admin服务器中单独显示(见图17.5)。

image-20211023202956020

图17.5 Spring Boot Admin UI单独展现掉线的服务,与在线的服务隔离开

作为Eureka的客户端,Admin服务器也会将自身注册为Eureka中的服务。如果要避免这种现象,我们可以将eureka.client.register-with-eureka属性设置为false:

1
2
3
eureka:
client:
register-with-eureka: false

与其他的Eureka客户端类似,如果不是监听默认主机和端口,我们就可以配置Eureka服务器的位置。如下的YAML文件将Eureka位置配置成eureka1.tacocloud.com主机:

1
2
3
4
eureka:
client:
service-url:
defaultZone: http://eureka1.tacocloud.com:8761/eureka/

现在,我们已经将多个Taco Cloud服务注册到了Admin服务器中。接下来,我们看一下Admin服务器都提供了哪些功能。