Spring Boot Admin实现服务健康预警
Over View
上一篇文章主要介绍了Spring Boot Admin的概况以及我们如何在系统中引入和使用Spring Boot Admin,以此来帮助我们更加了解自己的系统,做到能快速发现、排查问题。本篇文章将用代码演示Spring Boot Admin的消息通知功能,并利用这个开箱即用的特性来个性化我们的需求,优化我们在服务治理方面的工作效率。
Spring Boot Admin内置了多种开箱即用的系统通知渠道,包括邮件、Slack、Telegram、Hipchat等多种社交媒体的通知渠道。但是考虑到它所支持的大都是一些国外的主流社交媒体,在国内的本地化可能并不是那么的友好。不过没关系Spring Boot Admin也提供了通用的接口,使得用户可以基于他所提供的接口来自定义通知方式。下面使用Spring Boot Admin的通知功能来实现基于邮件和国内办公软件“飞书”的服务健康预警。
邮件预警
依赖引入
在Spring Boot Admin的服务端项目中引入邮件相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
添加配置
添加Spring Mail相关配置,我们配置好我们邮箱的Smtp服务器相关信息
spring.mail.host=your email smtp server
spring.mail.password=your password
spring.mail.port=your email smtp server port
spring.mail.test-connection=true
spring.mail.username=837718548@qq.com
添加Spring Boot Admin(SBA)中相关的邮件配置,以下是SBA官方提供的邮件相关参数
Property name |
Description |
Default value |
---|---|---|
spring.boot.admin.notify.mail.enabled |
Enable mail notifications |
true |
spring.boot.admin.notify.mail.ignore-changes |
Comma-delimited list of status changes to be ignored. Format: ":". Wildcards allowed. |
"UNKNOWN:UP" |
spring.boot.admin.notify.mail.template |
Resource path to the Thymeleaf template used for rendering. |
"classpath:/META-INF/spring-boot-admin-server/mail/status-changed.html" |
spring.boot.admin.notify.mail.to |
Comma-delimited list of mail recipients |
"root@localhost" |
spring.boot.admin.notify.mail.cc |
Comma-delimited list of carbon-copy recipients |
|
spring.boot.admin.notify.mail.from |
Mail sender |
"Spring Boot Admin noreply@localhost" |
spring.boot.admin.notify.mail.additional-properties |
Additional properties which can be accessed from the template |
我们这里使用如下配置
spring.boot.admin.notify.mail.from=837718548@qq.com
spring.boot.admin.notify.mail.ignore-changes=""
spring.boot.admin.notify.mail.to=目标邮箱
配置中的ignore-changes参数表示服务从一个状态变成其他状态时发出预警,例如:"UNKNOWN:UP" 表示服务从未知状态变成UP时,发出通知。当其值是""时,表示任何状态变更都会发出预警。若想指定其他参数,参考上面的参数表。完成上述操作后,重启Spring Boot Admin服务端,当客户端服务注册进来并且状态变为UP时,我们可以收到一封邮件:
添加邮件模版
Spring Boot admin发送的邮件可以自定义模板样式,我们使用thymeleaf语法编写邮件模板,示例模板代码可参考本文在Github的代码示例仓库,编写完模板文件之后,将文件放入项目src/main/resources/templates中,并且在配置文件中增加指定模板文件的地址:
spring.boot.admin.notify.mail.template=classpath:/templates/status-changed.html
重启Spring Boot Admin服务端,当客户端服务注册进来并且状态变为UP时,我们可以收到一封邮件,如下是我们对邮件进行本地化之后的样式:
飞书预警
由于Spring Boot Admin内置的通知渠道都是国外的社交媒体,不过它也提供了自定义通知渠道的接口,所以我们很容易就可以自定义通知渠道,下面演示集成办公软件飞书的通知。
获取通知地址
飞书中提供了聊天机器人,我们只需调用机器人的WebHook就可以实现详细的推送(企业微信,钉钉也具有类似功能)。
自定义通知渠道
Spring Boot Admin中提供了一个AbstractStatusChangeNotifier抽象类,我们可以通过继承它来自定义通知渠道
public class FlyBookNotifier extends AbstractStatusChangeNotifier {
private static final String DEFAULT_MESSAGE = "#{instance.registration.name} (#{instance.id}) 状态发生转变 #{lastStatus} ➡️ #{instance.statusInfo.status} " +
"n" +
"n 实例详情:#{instanceEndpoint}";
private final SpelExpressionParser parser = new SpelExpressionParser();
private RestTemplate restTemplate;
private URI webhookUrl;
private Expression message;
public FlyBookNotifier(InstanceRepository repository, RestTemplate restTemplate) {
super(repository);
this.restTemplate = restTemplate;
this.message = parser.parseExpression(DEFAULT_MESSAGE, ParserContext.TEMPLATE_EXPRESSION);
}
@Override
protected Mono<Void> doNotify( InstanceEvent event, Instance instance) {
if (webhookUrl == null) {
return Mono.error(new IllegalStateException("'webhookUrl' must not be null."));
}
return Mono
.fromRunnable(() -> restTemplate.postForEntity(webhookUrl, createMessage(event, instance), Void.class));
}
public void setRestTemplate(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
protected Object createMessage(InstanceEvent event, Instance instance) {
Map<String, Object> messageJson = new HashMap<>();
messageJson.put("title", "?警告&?提醒");
messageJson.put("text", getText(event, instance));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return new HttpEntity<>(messageJson, headers);
}
protected String getText(InstanceEvent event, Instance instance) {
Map<String, Object> root = new HashMap<>();
root.put("event", event);
root.put("instance", instance);
root.put("instanceEndpoint", instance.getEndpoints().toString());
root.put("lastStatus", getLastStatus(event.getInstance()));
StandardEvaluationContext context = new StandardEvaluationContext(root);
context.addPropertyAccessor(new MapAccessor());
return message.getValue(context, String.class);
}
public URI getWebhookUrl() {
return webhookUrl;
}
public void setWebhookUrl(URI webhookUrl) {
this.webhookUrl = webhookUrl;
}
public String getMessage() {
return message.getExpressionString();
}
public void setMessage(String message) {
this.message = parser.parseExpression(message, ParserContext.TEMPLATE_EXPRESSION);
}
}
上面代码是一个示例,用户可以根据自己的需求来自定义消息体的格式和内容。随后我们在Spring中创建该通知类的bean
@Configuration
public static class NotifierConfiguration {
@Bean
@ConditionalOnMissingBean
@ConfigurationProperties("spring.boot.admin.notify.flybook")
public FlyBookNotifier flyBookNotifier(InstanceRepository repository) {
return new FlyBookNotifier(repository, new RestTemplate());
}
}
最后我们在项目的配置文件中添加我们飞书渠道的配置信息
spring.boot.admin.notify.flybook.ignore-changes=""
spring.boot.admin.notify.flybook.webhook-url=https://open.feishu.cn/open-apis/bot/hook...
完成上述操作后,重启Spring Boot Admin服务端,当客户端服务注册进来并且状态变为UP时,我们可以在飞书端收到Spring Boot Admin自动推过来的预警信息:
至此,我们的自定义消息渠道就已经完成。通过继承AbstractStatusChangeNotifier抽象类,我们可以很轻易的自定义自己想要实现的推送渠道(设计模式:模板方法模式)。
总结
本文主要介绍了Spring Boot Admin中所提供的多种消息预警推送渠道,并且我们可以通过自定义消息预警渠道来满足我们自身的需求,整个过程并不需要耗费太多的人力和时间成本。我们用了两个示例来演示如何实现Spring Boot Admin的消息预警功能,分别是邮件预警和自定义的飞书预警。
本文的示例代码 SBA-client:https://github.com/cg837718548/sba-client-demo.git SBA-server:https://github.com/cg837718548/sba-server-demo.git
- nginx通过https方式反向代理多实例tomcat
- Linux系统下yum镜像源环境部署记录
- 特斯拉vs凯迪拉克vs奔驰:三大汽车自动驾驶系统比拼
- Centos下添加静态路由(临时和永久有效)的操作记录
- python如何保证输入键入数字
- 微信小程序自定义数据分析试水
- 挂载银行前置机Ukey到windows server2012虚拟机的操作记录
- 文件上传速度查询方法
- “AS3.0高级动画编程”学习:第三章等角投影(上)
- su: 无法设置用户ID: 资源暂时不可用
- NumPY学习笔记
- LVS负载均衡下session共享的实现方式-持久化连接
- Centos6.9下RabbitMQ集群部署记录
- “AS3.0高级动画编程”学习:第三章等角投影(下)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 第九节:Activiti6.0——ReceiveTask接收信号、中间信号捕获事件和中间消息捕获事件的流程推进
- SpringBoot——全局异常捕获和自定义异常
- RTSP协议视频平台EasyNVR接入到EasyNVS管理平台后无法显示RTMP及RTSP视频流地址问题
- SpringBoot——配置logback日志
- Istio 运维实战系列(2):让人头大的『无头服务』-上
- 第十节:Activiti6.0——四种Job工作的产生与管理
- 使用vue3.0,不需要build也可以
- 听说vue项目不用build也能用?
- 使用 Vue 3.0,你可能不再需要Vuex了
- MySQL InnoDB索引:存储结构
- Element 根据描述展示表单
- VUE 插件注册
- 表格中的输入框验证
- 不可忽视的CSS布局
- 让小黑窗口听你指挥