背景
前些天的时候,保险组的开发JR老哥找我询问关于修数据的事情(中级数据修正工程师苦逼的日常🤣),期间他看了一下关于我所在项目组的某个功能模块的业务告警处理方式,给出了一些看法。
这个功能模块主要是用来给客户绑定一个负责用户(自动挂靠),如果因为某些原因绑定不上(自动挂靠失败),那么系统会通过邮件方式告知管理用户(好几个,其中涉及开发,业务方以及产品),让他们去处理。
JR老哥体验了一下,反馈说每次通过点击进入邮件的方式查看自动挂靠失败的原因会觉得有点麻烦,然后向我推荐了另外一种方式,通过企业微信群聊的机器人,把告警信息发到群上,这样便一目了然了。
创建企业微信群聊机器人

打开群聊,点击+,设置机器人的名字和头像

添加机器人后,点击复制地址,会得到如下的一串URL
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXX
Webhook地址是对应的使用文档
使用POSTMAN测试一下

通过POST方式请求发送一个text
类型的消息,消息内容为hello world

此时企业微信上已经接收到群聊机器人123
发送过来的hello world
消息了
除了text
类型的消息以外,群聊机器人还支持发送markdown
类型的消息
通过HttpClient做一个发送群消息的工具类
因为感觉
markdown
类型会比text
类型的消息要好看些,我就使用markdown
类型的消息了
public class EnterpriseWeChatUtils {
private final static String ROBOT_URI = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXX";
private final static String MESSAGE_TYPE = "markdown";
private static HttpClient client;
private final static String FORMAT = "CRM业务告警,请相关同事注意\n" +
"> 业务功能: %s\n" +
"> 告警原因: %s\n" +
"> 备注: \n%s";
static {
client = HttpClients.createDefault();
}
/**
* 发送告警信息
*
* @param function 涉及的业务功能
* @param reason 告警原因
*/
public static void sendWarning(String function, String reason) {
sendWarning(function, reason, "无");
}
/**
* 发送告警信息
*
* @param function 涉及的业务功能
* @param reason 告警原因
* @param memo 备注
*/
public static void sendWarning(String function, String reason, String memo) {
if (StringUtils.isBlank(function) || StringUtils.isBlank(reason) || StringUtils.isBlank(memo)) {
throw new CrmException(ErrorCode.PARAM_ILLEGAL, "发送企业微信告警信息参数为空");
}
HttpPost httpPost = new HttpPost(ROBOT_URI);
httpPost.setHeader("Content-Type", "application/json;charset=utf8");
String content = buildMessageContent(function, reason, memo);
StringEntity stringEntity = new StringEntity(content, Charset.forName("UTF-8"));
httpPost.setEntity(stringEntity);
try {
client.execute(httpPost);
} catch (IOException e) {
log.error("发送企业微信告警信息失败,content = {},e = {}", content, e);
}
}
private static String buildMessageContent(String function, String reason, String memo) {
String content = String.format(FORMAT, function, reason, memo);
HashMap<String, Object> subMap = Maps.newHashMap();
subMap.put("content", content);
HashMap<String, Object> map = Maps.newHashMap();
map.put("markdown", subMap);
map.put("msgtype", "markdown");
return JSON.toJSONString(map);
}
}
新建一个EnterpriseWeChatUtils
,对外提供两个发送告警信息的重载方法
/**
* 发送告警信息
*
* @param function 涉及的业务功能
* @param reason 告警原因
*/
public static void sendWarning(String function, String reason);
/**
* 发送告警信息
*
* @param function 涉及的业务功能
* @param reason 告警原因
* @param memo 备注
*/
public static void sendWarning(String function, String reason, String memo);
然后就可以直接使用EnterpriseWeChatUtils.sendWarning()
发送群消息

聊聊这种发送消息方式的优缺点
优点
- 通过企业微信的方式接收者的管理会更加灵活,随时可以通过添加/删除群成员来控制
- 成本更低,发邮件是要💰💰
- 内容更加直观
- 支持
@
群成员(仅限text
类型的消息) - 支持发送
markdown
类型、图片类型的消息
缺点
- 一定要使用企业微信😂
- 消息发送频率的限制,每个群最多支持3个机器人,每个机器人的消息发送频率最大为
20条/分钟
,也就是说,在合适的路由策略下,一个群接收业务告警信息的上限是60条/分钟
,不一定满足其他业务系统