优秀的编程知识分享平台

网站首页 > 技术文章 正文

监控和扩展:为应用程序添加系统监控,AdminServer组件

nanyue 2025-03-10 18:57:35 技术文章 92 ℃

Admin Server组件

基于前面的介绍,我们引入Actuator组件为Spring Boot应用程序添加了系统监控功能。通过Actuator所暴露的各种HTTP端点,开发人员可以获取系统的运行时状态。

端点是一种底层的监控技术,需要对HTTP和Spring Boot应用程序的构建方式有一定的了解。那么,有没有更简单的、可视化的方式来获取这些端点背后的监控信息呢?答案是肯定的,这就是本节将要介绍的Spring Boot Admin组件。

构建Admin Server

Spring Boot Admin用于监控基于Spring Boot构建的应用程序。本质上,它集成Spring Boot Actuator所提供的各种HTTP端点,并在此基础上提供简洁的可视化Web界面。Spring Boot Admin会消费来自Actuator的端点信息并将这些信息进行统计和聚合,其基本原理如图12-3所示。

从图12-3中不难看出,Spring Boot Admin的整体架构中存在两大角色,即服务器端组件Admin Server和客户端组件Admin Client。其中的AdminClient实际上就是一个普通的Spring Boot应用程序,而Admin Server则是一个独立服务,需要专门构建。在接下来的内容中,我们将介绍构建AdminServer的两种实现方式:一种是独立的Admin服务,比较简单;另一种则相对复杂,需要依赖服务注册中心所具备的服务注册和发现机制。我们先从简单的实现方式开始讨论。

1. 基于独立服务构建Admin Server

无论使用哪种方式来实现Admin Server,首先都需要创建一个SpringBoot应用程序,并在pom文件中添加如代码清单12-16所示的依赖项。

代码清单12-16 Admin Server依赖包

de.codecentric

spring-boot-admin-server

de.codecentric

spring-boot-admin-server-ui

请注意Spring Boot Admin组件并不是Spring家族官方提供的组件,而是来自一个叫作codecentric AG的团队。想要把普通的Spring Boot应用程序转变为Spring Boot Admin Server,只需要在Bootstrap类上添加一个注解即可,这个注解就是@EnableAdminServer。添加完该注解之后的BootStrap类如代码清单12-17所示。

代码清单12-17 Admin Server BootStrap类

@SpringBootApplication

@EnableAdminServer

public class AdminApplication {

public static void main(String[] args) {

SpringApplication.run(AdminApplication.class, args);

}

}

Spring Boot Admin Server的构建就是这么简单。现在,启动这个Spring Boot应用程序,并打开Web界面,就能看到如图12-4所示的效果。

可以看到目前还没有任何一个应用程序与Admin Server有关联。想要将Spring Boot应用程序关联到Admin Server,需要对原有应用做一定的改造。

首先,同样在Maven依赖中引入对Spring Boot Admin Client组件的依赖,如代码清单12-18所示。

代码清单12-18 Admin Client依赖包

de.codecentric

spring-boot-admin-starter-client

然后,需要在配置文件中添加如代码清单12-19所示的配置信息,以便该应用程序能够与Admin Server进行关联。

代码清单12-19 Admin Client中的Admin Server配置信息

spring:

boot:

admin:

client:

url: http://localhost:9000

注意这里的9000就是Admin Server的服务器端口。现在启动这个应用程序,我们就会发现Admin Server中已经出现了这个应用的名称和地址,如图12-5所示。

我们看到,这里的APPLICATIONS和INSTANCES的数量都是1,代表AdminServer管理着一个应用程序,而该应用程序只有一个运行实例。在界面的下方展示了这个应用的名称以及实例地址。你可以尝试使用不同的端口启动应用程序的不同实例,然后观察这个列表的变化。

2. 基于注册中心构建Admin Server

虽然基于独立服务构建Admin Server和Admin Client非常简单,但我们需要在每个应用程序中添加对Spring Boot Admin的Maven依赖以及指定AdminServer地址。这实际上是一种代码侵入,意味着应用程序与Admin Server之间有一种强耦合。那么,有没有更好的办法来分离或者转嫁这种耦合呢?

联想到Admin Server和Admin Client之间需要建立的关联关系类似于服务注册,我们可以认为这是服务注册和发现机制的一种表现形式。在Spring家族中,存在用于构建微服务架构的Spring Cloud框架,而在Spring Cloud中就有一个专门用于实现服务注册和发现的组件,这个组件就是服务注册中心。注册中心的实现技术有很多种,而Spring Boot Admin内置了与SpringCloud Netflix Eureka的无缝集成。基于注册中心,Admin Server与各个Admin Client之间的交互方式如图12-6所示。

使用Eureka构建注册中心的过程也很简单,我们需要创建一个独立的Spring Boot应用程序,并在pom文件中添加如代码清单12-20所示的用于提供Eureka服务端功能的Maven依赖。

代码清单12-20 Eureka服务端依赖包

org.springframework.cloud

spring-cloud-starter-netflix-eureka

server

引入Maven依赖之后就可以创建Spring Boot的启动类。我们把该启动类命名为Eureka-ServerApplication,如代码清单12-21所示。

代码清单12-21 EurekaServerApplication类实现代码

@SpringBootApplication

@EnableEurekaServer

public class EurekaServerApplication {

public static void main(String[] args) {

SpringApplication.run(EurekaServerApplication.class, args);

}

}

请注意,在上面的代码中,我们在启动类上添加了一个@EnableEurekaServer注解。在Spring Cloud中,包含@EnableEurekaServer注解的服务意味着就是一个Eureka服务器组件。这样,Eureka服务就构建完毕了。

接下来,我们需要对Admin Server做相应的调整。首先,在pom文件中,需要添加对
spring-cloud-starter-netflix-eureka-client这个Eureka客户端组件的依赖,如代码清单12-22所示。

代码清单12-22 Eureka客户端依赖包

org.springframework.cloud

spring-cloud-starter-netflix-eureka

client

这时Admin Server相当于是Eureka的客户端,所以在它的BootStrap类上,我们需要添加@EnableEurekaClient以便将Admin Server注册到Eureka上。

重构Admin Server的最后一个步骤是调整配置信息,我们需要在配置文件中添加对应的配置项,用于指定Eureka服务器地址,如代码清单12-23所示。

代码清单12-23 Eureka客户端中对服务端地址的配置信息

eureka:

client:

registerWithEureka: true

fetchRegistry: true

serviceUrl:

defaultZone: http://localhost:8761/eureka/

好了,现在Admin Server已经重构完毕,接下来讨论Admin Client。正如前面所提到的,引入注册中心的目的是降低Admin Client与Admin Server之间的耦合度,这点从Maven依赖上就可以得到印证。有了注册中心,AdminClient就不需要再依赖
spring-boot-admin-starter-client组件,而是直接使用Eureka客户端组件即可。同样,在配置文件中,我们也需要去掉对AdminServer地址的引用,调整为直接使用Eureka服务端地址。而Admin Client中的Bootstrap类不需要做任何的修改。

通过以上调整,各个Admin Client就可以通过Eureka注册中心实现与Admin Server的关联。

Admin Server系统监控案例分析

按照Spring Boot Admin官方介绍,该组件提供了一套完整的可视化方案,所提供的核心功能特性包括显示健康状态、JVM、内存等度量明细信息,以及线程、HTTP跟踪等监控信息。基于Admin Server,这些功能都通过可视化的UI界面进行展示。

1. 监控系统运行时关键指标

注意到在Admin Server的菜单中有一个Wallboard,点击该菜单可以看到一面应用墙。而点击应用墙中的某一个应用,就能进入针对该应用的监控信息主界面,在该界面的左侧,是监控功能的各级目录,如图12-7所示。

这里我们看到了最重要的Health信息,显然,这一信息来自Spring BootActuator组件的health端点,我们在12.1节中对该端点进行了详细介绍。

将这个界面往下滑动,你会找到一些与JVM相关的监控信息,包括线程、垃圾回收、内存状态等非常有用的数据,如图12-8所示。

这些JVM数据都是通过可视化的方式进行展现,并随着运行时状态的变化而实时更新。

在Admin Server中,同样存在一个Metrics菜单,用于展示Spring Boot应用程序的各种度量指标,效果如图12-9所示。

开发人员可以通过对各种条件进行筛选,添加对应的度量指标。在图12-9中,我们针对HTTP请求中的/actuator/health端点进行了过滤,从而得到度量结果。

我们接着来看系统环境方面的属性,因为这方面的属性非常之多,所以在Admin Server中也提供了一个过滤器,如图12-10所示。

在图12-10中,我们通过输入spring参数,获取一系列与该参数相关的环境属性。

最后,我们来看一下Admin Server中的JVM菜单,该菜单下有两个子菜单,分别是Thread Dump和Heap Dump。以Thread Dump为例,尽管Actuator提供了/threaddump端点,但开发人员只能获取触发该端点时的Dump快照信息,而Admin Server则提供了一个连续性的可视化监控界面,如图12-11所示。

点击图12-11中的色条,我们可以获取每一个线程的详细信息。

2. 控制访问安全性

讲到这里,你会发现Admin Server的功能非常强大,而这些功能显然也不应该暴露给所有的开发人员。因此,我们需要控制Admin Server的访问安全性。要做到这一点也非常简单,只需要集成Spring Security即可。

结合本书第7章所介绍的内容,我们在Spring Boot应用程序中添加对
spring-boot-starter-security的Maven依赖,如代码清单12-24所示。

代码清单12-24 Spring Security依赖包

org.springframework.boot

spring-boot-starter-security

然后在配置文件中添加如代码清单12-25所示的配置项。

代码清单12-25 Spring Security用户名/密码配置信息

spring:

security:

user:

name: "springboot_admin"

password: "springboot_password"

重启Admin Server,再次通过Web界面进行访问时,就需要你输入用户名和密码。

本案例的代码位于:
https://github.com/tianminzheng/spring-boot
examples/tree/main/AdminServerExample。

基于Admin Server的构建方式,你可以在想要添加系统监控机制的Spring Boot应用程序中添加对Admin Server的引用,并使用前面介绍的可视化界面来对系统运行时的关键指标进行监控。

本文给大家讲解的内容是监控和扩展:为应用程序添加系统监控,Admin Server组件

  • 下文给大家讲解的是监控和扩展:为应用程序添加系统监控,系统监控实战经验
最近发表
标签列表