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&timestamp=%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服务,等几秒后可以看到:

posted @   shigp1  阅读(257)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示