一、SpringBoot Admin简介
1.1.简介
Spring Boot Admin是一个管理和监控Spring Boot应用程序的开源项目,在对单一应用服务监控的同时也提供了集群监控方案,支持通过eureka、consul、zookeeper等注册中心的方式实现多服务监控与管理。Spring Boot Admin UI部分使用Vue JS将数据展示在前端。
Spring Boot Admin分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client)两个组件:
- spring-boot-admin-server通过采集actuator端点数据显示在spring-boot-admin-ui上,已知的端点几乎都有进行采集。
- spring-boot-admin-client是对Actuator的封装,提供应用系统的性能监控数据。此外,还可以通过spring-boot-admin动态切换日志级别、导出日志、导出heapdump、监控各项性能指标等。
Spring Boot Admin服务器端负责收集各个客户的数据。各台客户端配置服务器地址,启动后注册到服务器。服务器不停地请求客户端的信息(通过Actuator接口)。具体架构如下图所示。
上图为Spring Boot Admin的整体架构,在每个Spring Boot应用程序上增加Spring Boot Admin Client组件。这样每个Spring Boot应用即Admin客户端,Admin服务端通过请求Admin客户端的接口收集所有的Spring Boot应用信息并进行数据呈现,从而实现Spring Boot应用监控。
换句话说,监控平台就像老师,各SpringBoot就像学生,老师(监控平台)可以收集学生(客户端)的成绩(信息),来判断学生的状态,彼此关系是一对多的关系。
1.2.功能
监控平台有多中功能,主要包括显示应用程序的监控状态、应用程序上下线监控、查看 JVM,线程信息、可视化的查看日志以及下载日志文件、动态切换日志级别、Http 请求信息跟踪等等
二、监控平台搭建
2.1.pom依赖
创建新的Spring Boot项目,在新建的项目中添加Spring Boot Admin服务器端的依赖JAR包:spring-boot-admin-starter-server。
项目创建就不具体介绍了,不熟悉的可以参考SpringBoot项目搭建
版本说明:Spring Boot 2.x=Spring Boot Admin 2.x (比如Spring Boot 2.3.x 可以用Spring Boot Admin 2.3.x)
Spring版本:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
</parent>
服务器端依赖:
<!-- 监控平台依赖 -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.3.1</version>
</dependency>
<!-- 添加spring-boot-starter-web是为了让应用处于启动状态。-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
我上面给的是项目搭建完毕后,再在pom文件里添加依赖,如果是创建项目时选择依赖,要仔细选择,平台依赖和客户端依赖类似,要注意区分,具体如下
2.2.配置文件
server.port=8000
spring.application.name=admin-test
management.endpoint.health.show-details=always
2.3.主启动类添加注解 @EnableAdminServer
2.4.浏览器登录URL: localhost:8000
URL是IP+端口,端口用自己定义的。下面是在没有客户端的情况下的初始界面
从Admin服务端的启动界面可以看到,Applications页面会展示应用数量、实例数量和状态3个信息。
三、客户端的搭建
3.1.pom依赖
创建新的Spring Boot项目,在新建的项目中添加Spring Boot Admin客户端的依赖JAR包:spring-boot-admin-starter-server。
Spring版本:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
客户端依赖:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-admin-starter-client会自动添加Actuator相关依赖,所以这里不需要重复添加Actuator的相关依赖。
3.2.配置文件
server.port=9999
spring.application.name=clientTest1
spring.boot.admin.client.url=http://localhost:8000
配置说明:
- server.port:当前应用设置端口为8001。
- spring.application.name:设置Application名称,其默认名称都是spring-boot-application。
- spring.boot.admin.client.url:意思是被监控的信息要发到哪个服务器,这里配置Admin服务器的地址。
3.3刷新监控平台
启动客户端并刷新监控平台页面...
四、监控平台页面说明
4.1.主页面
启动client了,等待几秒钟,刷新刚才打开的页面
点击【应用墙】可以看到如下图所示界面,如果有多个客户端,界面会出现多个6边型
- 绿色:健康
- 灰色:连接客户端健康信息超时(超过10s)
- 红色:就能看到具体异常信息
客户端启动之后,Admin服务器界面的Application数量会增加。单击Application下的数值可以查看完整的应用信息。页面会展示被监控的应用列表,单击应用名称会进入此应用的详细监控信息页面。
这个页面会实时显示应用的运行监控信息,包括之前介绍的Actuator所有的端点数据信息。
Spring Boot Admin以图形化的形式展示了应用的各项信息,这些信息大多来自于Spring Boot Actuator提供的接口。利用图形化的形式很容易看到应用的各项参数变化,甚至有些页面还可以进行一些配置操作,比如改变打印日志的级别等。
4.2.监控界面
4.2.1.接口信息
4.2.2.JVM信息
可以看到各个时间点,各个线程的工作状态
4.2.3.日志
以客户端2为示例,在客户端项目的resources目录下创建logback.xml文件,添加日志信息
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<!-- pro -->
<property name="LOG_PATH" value="/data/jar/j-client-test2/log" />
<!-- 按照每天生成日志文件 -->
<appender name="INFO_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<fileNamePattern>${LOG_PATH}/client-test2.%d{yyyy-MM-dd}.%i.log </fileNamePattern>
<!--日志文件保留天数 -->
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>200MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n</pattern>
</layout>
</appender>
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="com.alibaba.druid" level="ERROR" />
<logger name="com.task" level="DEBUG" />
<root level="INFO">
<appender-ref ref="INFO_FILE" />
</root>
</configuration>
所需pom依赖
<!-- log 日志打印 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<!-- logback日志框架 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
刷新Maven,重启项目后,界面如下所示
勾选【已配置】选项,可以看到该项目已经配置的日志配置
配置文件添加日志路径
##与logback中路径保持一致
management.endpoint.logfile.external-file=/data/jar/j-client-test2/log/client-test2.2023-09-05.0.log
##logback文件中,日志文件命名是动态的,但我这里是写死的仅用来测试,后续需要修改
刷新监控平台界面,可以看到日志信息