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所示。
我们需要将组成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 | <dependency> |
现在,我们需要启用Admin服务器,只需要在主配置类上添加@EnableAdminServer
注解就可以了,如下所示:
1 | package tacos.bootadmin; |
最后,因为在开发阶段Admin服务器并不是唯一一个在本地运行的应用,所以我们需要将其设置为监听一个唯一的端口,而且这个端口要易于访问(比如,不能是0)。在这里,我选择9090作为Spring Boot Admin服务器的端口:
1 | server: |
现在,我们的Admin服务器已经准备就绪。如果此时启动应用并在浏览器中访问http://localhost:9090,那么我们将会看到如图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 | <dependency> |
客户端库准备就绪之后,我们需要配置Admin服务器的位置。这样的话,客户端就可以将自身注册进去。为了实现这一点,我们可以将spring.boot.admin.client.url属性设置为Admin服务器的根路径:
1 | spring: |
注意,在这里,我们还设置了spring.application.name属性(在本例中,也就是配料服务)。我们之前已经使用这个属性在Spring Cloud Config Server和Eureka中识别微服务。这里,它的目的很类似:识别Admin服务器中的应用。我们重启应用之后,将会看到它出现在Admin服务器中,如图17.3所示。
尽管在图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 | <dependency> |
Admin服务器启用了Eureka客户端功能之后,什么事情都不需要做了。我们可以直接略过上文所述的客户端配置,因为Admin会自动发现注册在Eureka中的服务并展现它们的Actuator数据。如果Eureka中注册了多个Taco Cloud服务,那么它们将会展现在Admin服务器中(参见图17.4)。
在图17.4中列出了4个不同的应用,对应了6个服务:订单服务有两个实例,taco服务有两个实例,其他的两个应用各有一个实例。这里显示的所有应用均处于UP状态。如果有应用掉线(比如用户服务),就将会在Admin服务器中单独显示(见图17.5)。
作为Eureka的客户端,Admin服务器也会将自身注册为Eureka中的服务。如果要避免这种现象,我们可以将eureka.client.register-with-eureka属性设置为false:
1 | eureka: |
与其他的Eureka客户端类似,如果不是监听默认主机和端口,我们就可以配置Eureka服务器的位置。如下的YAML文件将Eureka位置配置成eureka1.tacocloud.com主机:
1 | eureka: |
现在,我们已经将多个Taco Cloud服务注册到了Admin服务器中。接下来,我们看一下Admin服务器都提供了哪些功能。