Spring Boot Admin 集成钉钉群机器人报警通知
前言
实现流程
创建钉钉群机器人后,得到 Webhook 与 Secret。Java 代码 实现 Admin 的 Notifier 接口,当监听到 Admin 服务状态变更后,直接调用 Webhook 发送消息给钉钉群机器人,群成员就可以收到报警消息通知,这个过程与 Github 的 Webhook 实现流程一致。
钉钉官方文档
值得一提的是,本文使用的是钉钉提供的 自定义机器人
接口,而不是 开发企业内部机器人
接口,同时 Webhook 里包含的 access_token
不存在有效期(永久有效),即不需要定时刷新 access_token
。
创建钉钉群机器人
首先登录钉钉的 PC 版,创建钉钉群机器人,得到钉钉群机器人的 Webhook;在群机器人的安全设置页面,若选择加签名,加签一栏下面还可以获取到 SEC 开头的字符串(签名秘钥)。
Admin 集成钉钉群机器人通知
Java 核心代码
钉钉群机器人的配置类
1 | import org.springframework.beans.factory.annotation.Value; |
钉钉群机器人的消息类型枚举类
1 | public enum DingTalkMessageType { |
钉钉群机器人的常量类
1 | public class DingTalkConstants { |
钉钉群机器人的消息发送类
1 | import cn.hutool.core.codec.Base64; |
消息通知模板类
1 | public class MessageTemplate { |
实现 Admin 的 Notifier 接口来添加钉钉群机器人的消息通知,若需要监听服务的所有事件变更,还可以改为继承 AbstractEventNotifier
类
1 | import de.codecentric.boot.admin.server.domain.entities.Instance; |
Admin 的服务状态变更钉钉群机器人通知实现类
1 | import cn.hutool.core.date.DatePattern; |
YML 配置内容
1 | notify: |
钉钉的 Java SDK
由于钉钉官方没有将钉钉的 SDK 发布到 Maven 仓库,因此需要在钉钉官网手动下载最新版的 SDK,然后发布到 Maven 私有仓库,或者安装在本地的 Maven 仓库,最后在项目的 pom.xml
配置文件里添加以下依赖。
1 | <dependency> |
安装钉钉 SDK 到本地 Maven 仓库的命令如下:
1 | $ mvn install:install-file -Dfile=taobao-sdk-java-auto_1455552377940-20200322.jar -DgroupId=com.dingtalk -DartifactId=dingtalk-api-sdk -Dversion=1.0.0 -Dpackaging=jar |
值得一提的是,不同版本的 钉钉 SDK,其 Maven 坐标中的 groupId
、artifactId
、version
可能会发生变化,此时只需要将上面对应的参数值替换掉即可。
生产环境扩展建议
上述给出的是 Spring Boot Admin 集成钉钉群机器人消息通知的 Demo 代码,生产环境下还需要考虑到如下的实际问题:
报警消息重复发送
:若 Admin 应用以集群的方式部署,当 A 应用 DOWN 掉后,那么钉钉群成员将会收到多条 A 应用服务状态变更的报警消息报警消息的持久化
:若大量报警消息积压在 Admin 应用里,但还没来得及发送,此时如果 Admin 应用挂掉,那么报警消息将会丢失,建议使用消息中间件
的持久化特性来解决报警消息的发送频率
:每个钉钉群机器人每分钟最多发送 20 条,如果超过 20 条,会限流 10 分钟;这里建议利用任务调度线程池
来实现报警消息的调度发送,同时考虑将多条报警消息合并后再发送,以此来解决报警消息发送频率受限制的问题