前言
上一章节, 我们介绍了 Actuator 的使用, 知道了可通过访问不同的端点路径, 获取相应的监控信息. 但使用后也能发现, 返回的监控数据都是以 JSON 串的形式进行返回的, 对于实施或者其他人员来说, 不是很直观, 而当需要监控的应用越来越多时, 依次去访问对应的应用也过于繁琐和低效了. 所以, 本章节来介绍下 Spring Boot Admin 这个 UI 监控工具.
Spring-Boot-Admin 是什么
先看看, 官网给其定义:
简单来说, Spring Boot Admin 是一个管理和监控 Spring Boot 应用程序的开源软件. 每个应用都认为是一个客户端, 通过 HTTP 或者服务注册发现 Spring Cloud(Eureka,Consul 等等)注册到 admin server 中进行展示, Spring Boot Admin UI 部分使用 AngularJs 将数据展示在前端.
Spring Boot Admin 是一个针对 spring-boot 的 actuator 接口进行 UI 美化封装的监控工具. 它可以: 在列表中浏览所有被监控 spring-boot 项目的基本信息, 详细的 Health 信息, 内存信息, JVM 信息, 垃圾回收信息, 各种配置信息 (比如数据源, 缓存列表和命中率) 等, 还可以直接修改 logger 的 level.
监控实例
Spring Boot Admin 包含 admin-server 与 admin-client 两个组件, admin-server 通过采集 actuator 端点数据, 显示在 spring-boot-admin-ui 上.
提醒: 为了演示服务端和客户端, 本实例创建了一个 maven 多模块项目.
admin-server 端
admin-server 端主要是数据展现功能, 包含了一个 ui 页面.
创建一个 spring-boot-admin-server 工程.
0. 引入 pom 依赖
- <dependency>
- <groupId>de.codecentric</groupId>
- <artifactId>spring-boot-admin-starter-server</artifactId>
- </dependency>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>de.codecentric</groupId>
- <artifactId>spring-boot-admin-dependencies</artifactId>
- <version>1.5.7</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
注意: 由于使用的 SprinBoot 为 1.5.15 版本, 所以选用的 Spring Boot Admin 版本为 1.5.7 版本. 同时为了版本依赖, 使用 dependencyManagement 加入了 spring-boot-admin-dependencies 进行版本管理.
1. 启动类, 加入注解 @EnableAdminServer.
- @SpringBootApplication
- @EnableAdminServer
- @Slf4j
- public class Chapter28AdminServerApplication {
- public static void main(String[] args) throws Exception {
- SpringApplication.run(Chapter28AdminServerApplication.class, args);
- log.info("Chapter28AdminServer 启动!");
- }
- }
一个服务端就基本配置结束了, 启动应用, 访问: http://127.0.0.1:8080 , 即可看见监控页面了:
由于现在还没有加入客户端, 所以应用列表都是空的.
admin-client 端
被监控的应用只需要加入相关依赖和服务端配置即可.
创建一个 spring-boot-admin-client 项目
0. 引入 pom 依赖
- <dependency>
- <groupId>de.codecentric</groupId>
- <artifactId>spring-boot-admin-starter-client</artifactId>
- </dependency>
1. 配置文件加入服务端地址等信息.
- application.properties
- # 应用名称 便于识别
- spring.application.name=spring-boot-admin-client
- server.port=8081
- # 服务端地址
- spring.boot.admin.url=http://127.0.0.1:8080
- # 关闭安全认证
- management.security.enabled=false
- # 利用 info 端点, 加入版本等信息
- info.version=@project.version@
- info.name=@project.artifactId@
- # 可自定义信息
- info.author=oKong
- info.blog=http://blog.lqdev.cn/
注意: 为了能获取 maven 的配置内容, 需要在 pom 文件中加入以下配置:
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>build-info</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
只需要这两部, 客户端就配置完了, 启动下, 访问 http://127.0.0.1:8080 , 即可看见监控页面已经包含了此应用数据了:
此时, 我们点击详情, 即可看见各类监控数据了.
环境变量:
线程信息:
日志相关:
若需要动态的修改日志级别, 按官网的提示, 需要加入 logback-spring.xml 文件, 具体的可查看官网文档吧, 写的很详细了.
其他监控指标, 大家可以自行查看下.
注意: 在生产环境中, 为了数据的安全, 还是需要加上安全认证的, 具体的可以查看官方文档: securing-spring-boot-admin, 相对比较简单, 简单来说就是加入 spring-boot-starter-security 进行安全认证, 这里可以直接引入 spring-boot-admin-server-ui-login 进行登录安全认证. 本文就不阐述了.
监控通知
虽然我们可以通过界面进行可视化监控, 但不可能实时去盯着屏幕的, 我们希望在服务有问题, 比如下线, CPU 异常等情况时, 能通过邮件等形式及时通知对应责任人, 这样就能做到预警效果了.
在 SpingBootAdmin 中, 提供了多种通知机制, 来实现监控告警功能.
可以看见, 其集成了国外的一些通讯软件, 而对于我们而言, 还是使用邮件通知比较靠谱. 当然也能自定义通知, 进行个性化消息通知功能, 比如钉钉机器人通知等.
发送邮件通知
这里简单以邮件通知为例. 具体邮件发送相关知识点, 可查看: 第二十六章: 邮件发送, 这里不在阐述了.
以下配置都是在服务端 spring-boot-admin-server 进行添加.
0. 引入 pom 依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-mail</artifactId>
- </dependency>
1. 配置邮箱信息.
- # 邮件相关
- # SMTP 服务器地址
- spring.mail.host=smtp.qq.com
- # SMTP 服务器端口号 默认 - 1
- # spring.mail.port=-1
- # 发送方帐号
spring.mail.username = 邮箱
# 发送方密码(授权码)
spring.mail.password = 邮箱密码
- #javaMailProperties 配置
- # 开启用户身份验证
- spring.mail.properties.mail.smtp.auth=true
- # 发送给谁
- spring.boot.admin.notify.mail.to=499452441@qq.com
- # 谁发的
- spring.boot.admin.notify.mail.from=499452441@qq.com
再次启动服务端应用和客户端, 之后停止客户端, 就可以收到下线通知邮件了.
同时, 我们还能自定义发送邮件的主题和内容, 配置文件加入
- # 主题格式
- # 使用中文会乱码, 可使用 yml 文件格式解决
- # 之类直接 unicode 编码了
- # 应用 #{application.name}(#{application.id}) 状态为:#{to.status}
- spring.boot.admin.notify.mail.subject=\u5e94\u7528#{application.name}(#{application.id}) \u72b6\u6001\u4e3a\uff1a#{to.status}
- # 邮件内容
- # 应用 #{application.name} (#{application.id})\n 状态从 #{from.status} 变为 #{to.status}\n\n 应用健康地址:#{application.healthUrl}
- spring.boot.admin.notify.mail.text=\u5e94\u7528#{application.name} (#{application.id})\n\u72b6\u6001\u4ece #{from.status} \u53d8\u4e3a #{to.status}\n\n \u5e94\u7528\u5065\u5eb7\u5730\u5740\uff1a#{application.healthUrl}
多说几句: 这里的 subject 和 text 都支持 SpEL(Spring Expression Language)表达式的, 关于 SpEL 表达式, 有兴趣的同学可以自行搜索下, 是一个支持运行时查询和操作对象图的强大的表达式语言, 类似于 EL 表达式, 定界符为 #{}, 一种简化开发的表达式, 通过使用表达式来简化开发, 减少一些逻辑, 配置的编写.
而此次, 发送邮件的参数, 通过跟踪源码获悉, 入口的参数为 ClientApplicationEvent, 对应路径为: de.codecentric.boot.admin.event.ClientApplicationEvent, 即应用信息. 其继承的类如下:
当应用发送状态变更时, 就会触发 ClientApplicationStatusChangedEvent 事件了, 对应的参数如下所示:
所以, 需要额外一些参数时, 可以根据 de.codecentric.boot.admin.model.Application 的属性获取更加详细的信息, 如 metadata,info 等等.
之后, 发送的邮件内如如下:
自定义通知
除了使用自带的一些通知机制外, 我们还能通过自定义, 来进行个性化通知的创建, 比如在一些场景下, 我们会把消息推送到 MQ 服务器上或者手机上等等. 实现通知比较简单, 就是实现 Notifier 接口, 而官方提供给了一个抽象类 AbstractStatusChangeNotifier, 我们直接继承此类就好了.
0. 创建一个自定义通知类
CustomNotifier.java
- /**
- * 自定义通知
- * @author oKong
- *
- */
- @Component
- @ConfigurationProperties("okong.custom.notify")
- @Setter
- @Getter
- @Slf4j
- public class CustomNotifier extends AbstractStatusChangeNotifier{
- String name;
- @Override
- protected void doNotify(ClientApplicationEvent event) throws Exception {
- // 这里只是为了示例 , 直接输出到控制台了.
- log.info("{}- 自定义通知: 应用 -{}", name,event.getApplication().getName());
- }
- }
1. 配置文件配置属性 name 的值
- # 自定义通知类型
- okong.custom.notify.name=oKong
再次, 启动应用, 当监控的应用状态发生变动时, 可以看见邮件和自定义通知都生效了, 控制台可以看见自定义输出内容了.
大家可以结合实际的业务需求, 编写不同的自定义通知类的, 比如利用小程序或者微信公众号, 发送微信信息; 或者发送短信; 或者其他的通讯工具都可以的, 自由发挥~
参考资料
总结
本章节主要讲解了利用 Spring Boot Admin 这个 web 监控工具进行可视化的监控应用各指标信息. 关于使用 Spring Cloud 注册中心来进行客户端自动注册与发现的, 本系列就不阐述了, 因为涉及到一些 Eureka 的相关知识点, 后期会在白话 SpringCloud 的实施监控里面进行详细阐述, 而且基于 Spring Boot2 的界面风格也有大变动, 使用 vue.js 来进行构建了, 同时很会集成 Hystrix 和 turbine 的集成监控, 会更加方便.
最后
来源: https://www.cnblogs.com/okong/p/springboot-twenty-eight.html