SpringCloud Admin添加钉钉通知
要想启用 钉钉 消息通知,需要创建并配置钉钉机器人的授权,并为 webhookUrl 和 secret 提供正确的配置。webhookUrl是钉钉提供的自定义接入服务,可以通过此url向钉钉发送消息。首先用钉钉客户端为要发送通知的群新建机器人。打开钉钉聊天右上角的群设置,找到下面的机器人。然后添加机器人。选择自定义通过webhook接入自定义服务
类型的机器人。点击下去,直到看到下面的图片:
输入机器人名字,选中自定义关键词并输入服务预警
。选中同意服务条款。
先将AdminServe中的邮件相关依赖和配置注释,AdminServe模块使用的spring-boot-admin-starter-server版本是2.6.6。已经提供了对钉钉消息通知的支持。提供了DingTalkNotifier发送钉钉通知。
DingTalkNotifier
public class DingTalkNotifier extends AbstractStatusChangeNotifier {
private static final String DEFAULT_MESSAGE = "#{instance.registration.name} #{instance.id} is #{event.statusInfo.status}";
private final SpelExpressionParser parser = new SpelExpressionParser();
private RestTemplate restTemplate;
private String webhookUrl;
@Nullable
private String secret;
private Expression message;
public DingTalkNotifier(InstanceRepository repository, RestTemplate restTemplate) {
super(repository);
this.restTemplate = restTemplate;
this.message = this.parser.parseExpression("#{instance.registration.name} #{instance.id} is #{event.statusInfo.status}", ParserContext.TEMPLATE_EXPRESSION);
}
protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
return Mono.fromRunnable(() -> {
this.restTemplate.postForEntity(this.buildUrl(), this.createMessage(event, instance), Void.class, new Object[0]);
});
}
private String buildUrl() {
Long timestamp = System.currentTimeMillis();
return String.format("%s×tamp=%s&sign=%s", this.webhookUrl, timestamp, this.getSign(timestamp));
}
protected Object createMessage(InstanceEvent event, Instance instance) {
Map<String, Object> messageJson = new HashMap();
messageJson.put("msgtype", "text");
Map<String, Object> content = new HashMap();
content.put("content", this.getText(event, instance));
messageJson.put("text", content);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return new HttpEntity(messageJson, headers);
}
private Object getText(InstanceEvent event, Instance instance) {
Map<String, Object> root = new HashMap();
root.put("event", event);
root.put("instance", instance);
root.put("lastStatus", this.getLastStatus(event.getInstance()));
StandardEvaluationContext context = new StandardEvaluationContext(root);
context.addPropertyAccessor(new MapAccessor());
return this.message.getValue(context, String.class);
}
private String getSign(Long timestamp) {
try {
String stringToSign = timestamp + "\n" + this.secret;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(this.secret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
return URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
} catch (Exception var5) {
var5.printStackTrace();
return "";
}
}
public void setRestTemplate(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String getWebhookUrl() {
return this.webhookUrl;
}
public void setWebhookUrl(String webhookUrl) {
this.webhookUrl = webhookUrl;
}
@Nullable
public String getSecret() {
return this.secret;
}
public void setSecret(@Nullable String secret) {
this.secret = secret;
}
public String getMessage() {
return this.message.getExpressionString();
}
public void setMessage(String message) {
this.message = this.parser.parseExpression(message, ParserContext.TEMPLATE_EXPRESSION);
}
}
主要看doNotify方法逻辑。createMessage创建出消息,通过restTemplate发送。如果要自定义通知的消息,可以继承DingTalkNotifier重写createMessage方法。
MyDingDingNotifier
public class MyDingDingNotifier extends DingTalkNotifier {
private ObjectMapper objectMapper = new ObjectMapper();
public MyDingDingNotifier(InstanceRepository repository, RestTemplate restTemplate) {
super(repository, restTemplate);
}
@Override
protected Object createMessage(InstanceEvent event, Instance instance) {
String serviceName = instance.getRegistration().getName();
String serviceUrl = instance.getRegistration().getServiceUrl();
String status = instance.getStatusInfo().getStatus();
Map<String, Object> details = instance.getStatusInfo().getDetails();
StringBuilder str = new StringBuilder();
str.append("服务预警 : 【" + serviceName + "】");
str.append("【服务地址】" + serviceUrl);
str.append("【状态】" + status);
try {
str.append("【详情】" + objectMapper.writeValueAsString(details));
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
Map<String, Object> messageJson = new HashMap();
messageJson.put("msgtype", "text");
Map<String, Object> content = new HashMap();
content.put("content", str.toString());
messageJson.put("text", content);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return new HttpEntity(messageJson, headers);
}
}
消息体要有服务预警
(钉钉机器人的关键词)才能让钉钉群的机器人处理到。
创建出MyDingDingNotifier Bean并设置你的钉钉群机器人的webhookUrl。
@Bean
public MyDingDingNotifier myDingDingNotifier0(InstanceRepository repository) {
MyDingDingNotifier myDingDingNotifier = new MyDingDingNotifier(repository, new RestTemplate());
myDingDingNotifier.setWebhookUrl("https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx");
return myDingDingNotifier;
}
关掉Producer服务,等几秒后可以看到:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!