网站首页 > 技术文章 正文
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组件
- 下文给大家讲解的是监控和扩展:为应用程序添加系统监控,系统监控实战经验
猜你喜欢
- 2025-03-10 mysql 修改密码 报错 ERROR 1396 (HY000): 解决方案
- 2025-03-10 教你部署在线客服 - 宝塔面板篇 5:配置服务器主程序
- 2025-03-10 手把手教你搭建免费个人博客网站
- 2025-03-10 10分钟学会VS NuGet包私有化部署
- 2025-03-10 Hexo建站全攻略
- 2025-03-10 1.8K Star!Cool-Admin-Vue:AI编码+流程编排,重新定义后台开发
- 2025-03-10 后台权限管理系统,开源免费,模块化、插件化、AI极速开发CRUD
- 2025-03-10 Spring Cloud Gateway实战之五:内置filter
- 2025-03-10 Farm 火了!比 Rspack/Vite 更快的打包方案!
- 2025-03-10 NET 7 + Vue.js 的前后端分离的通用后台管理系统框架
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)