Spring Cloud Admin健康检查 邮件、钉钉群通知

时间:2022-11-27 15:31:26

Spring Cloud Admin健康检查 邮件、钉钉群通知

源码地址:https://github.com/muxiaonong/Spring-Cloud/tree/master/cloudadmin

Admin 简介

 

官方文档:What is Spring Boot Admin?

SpringBootAdmin是一个用于管理和监控SpringBoot微服务的社区项目,可以使用客户端注册或者Eureka服务发现向服务端提供监控信息。注意,服务端相当于提供UI界面,实际的监控信息由客户端Actuator提供 通过SpringBootAdmin,你可以通过华丽大气的界面访问到整个微服务需要的监控信息,例如服务健康检查信息、CPU、内存、操作系统信息等等

本篇文章使用SpringBoot 2.3.3.RELEASE、SpringCloud Hoxton.SR6、SpringBoot Admin 2.2.3版本,此外,服务注册中心采用eureka

一、SpringCloud使用SpringBoot Admin

 

1.1 创建一个SpringBoot项目,命名为admin-test,引入如下依赖

  1. <!-- Admin 服务 --> 
  2.  <dependency> 
  3.      <groupId>de.codecentric</groupId> 
  4.      <artifactId>spring-boot-admin-starter-server</artifactId> 
  5.      <version>2.2.1</version> 
  6.  </dependency> 
  7.  <!-- Admin 界面 --> 
  8.  <dependency> 
  9.      <groupId>de.codecentric</groupId> 
  10.      <artifactId>spring-boot-admin-server-ui</artifactId> 
  11.      <version>2.2.1</version> 
  12.  </dependency> 

1.2 启动类

  1. @SpringBootApplication 
  2. @EnableAdminServer 
  3. public class AdminTestApplication { 
  4.  
  5.     public static void main(String[] args) { 
  6.         SpringApplication.run(AdminTestApplication.class, args); 
  7.     } 
  8.      
  9.   } 

1.3 配置文件

  1. spring.application.name=admin-test 
  2.  
  3. management.endpoints.jmx.exposure.include=* 
  4. management.endpoints.web.exposure.include=* 
  5. management.endpoint.health.show-details=always 
  6.  
  7. # spring cloud access&secret config 
  8. alibaba.cloud.access-key=**** 
  9. alibaba.cloud.secret-key=**** 

1.4 启动项目

输入项目地址:http://localhost:8080/applications

Spring Cloud Admin健康检查 邮件、钉钉群通知

二、配置邮件通知

 

2.1 pom

  1. <dependency> 
  2.   <groupId>org.springframework.boot</groupId> 
  3.   <artifactId>spring-boot-starter-mail</artifactId> 
  4. </dependency> 

2.2 邮件配置

  1. spring.mail.host=smtp.qq.com 
  2. spring.mail.username=单纯QQ号 
  3. spring.mail.password=授权码 
  4. spring.mail.properties.mail.smpt.auth=true 
  5. spring.mail.properties.mail.smpt.starttls.enable=true 
  6. spring.mail.properties.mail.smpt.starttls.required=true 
  7.  
  8. #收件邮箱 
  9. spring.boot.admin.notify.mail.to=xxxx@qq.com 
  10. # 发件邮箱 
  11. spring.boot.admin.notify.mail.from= xxxx@qq.com 

2.3 QQ邮箱设置

找到自己的QQ邮箱

QQ邮箱 》 设置 》 账户 》红框处获取 授权码

Spring Cloud Admin健康检查 邮件、钉钉群通知

我们将 consumer 服务下线后,

Spring Cloud Admin健康检查 邮件、钉钉群通知

接着我们就收到了邮件通知,告诉我们服务关闭了

Spring Cloud Admin健康检查 邮件、钉钉群通知

三、发送钉钉群通知

 

找到群里面的 群设置 》 智能群助手 》 添加机器人

Spring Cloud Admin健康检查 邮件、钉钉群通知

注意:这里的自定义关键词一定要和项目的关键字匹配

Spring Cloud Admin健康检查 邮件、钉钉群通知

Spring Cloud Admin健康检查 邮件、钉钉群通知

获取 Webhook 到项目中,这个是后面要使用到的

Spring Cloud Admin健康检查 邮件、钉钉群通知

启动类:

  1. import org.springframework.boot.SpringApplication; 
  2. import org.springframework.boot.autoconfigure.SpringBootApplication; 
  3. import org.springframework.context.annotation.Bean; 
  4.  
  5. import de.codecentric.boot.admin.server.config.EnableAdminServer; 
  6. import de.codecentric.boot.admin.server.domain.entities.InstanceRepository; 
  7.  
  8. @SpringBootApplication 
  9. @EnableAdminServer 
  10. public class AdminApplication { 
  11.  
  12.   public static void main(String[] args) { 
  13.     SpringApplication.run(AdminApplication.class, args); 
  14.   } 
  15.      @Bean 
  16.       public DingDingNotifier dingDingNotifier(InstanceRepository repository) { 
  17.           return new DingDingNotifier(repository); 
  18.       } 

 通知类:

  1. import java.util.Map; 
  2.  
  3. import com.alibaba.fastjson.JSONObject; 
  4.  
  5. import de.codecentric.boot.admin.server.domain.entities.Instance; 
  6. import de.codecentric.boot.admin.server.domain.entities.InstanceRepository; 
  7. import de.codecentric.boot.admin.server.domain.events.InstanceEvent; 
  8. import de.codecentric.boot.admin.server.notify.AbstractStatusChangeNotifier; 
  9. import reactor.core.publisher.Mono; 
  10.  
  11. public class DingDingNotifier extends AbstractStatusChangeNotifier  { 
  12.   public DingDingNotifier(InstanceRepository repository) { 
  13.         super(repository); 
  14.     } 
  15.     @Override 
  16.     protected Mono<Void> doNotify(InstanceEvent event, Instance instance) { 
  17.         String serviceName = instance.getRegistration().getName(); 
  18.         String serviceUrl = instance.getRegistration().getServiceUrl(); 
  19.         String status = instance.getStatusInfo().getStatus(); 
  20.         Map<String, Object> details = instance.getStatusInfo().getDetails(); 
  21.         StringBuilder str = new StringBuilder(); 
  22.         str.append("服务预警 : 【" + serviceName + "】"); 
  23.         str.append("【服务地址】" + serviceUrl); 
  24.         str.append("【状态】" + status); 
  25.         str.append("【详情】" + JSONObject.toJSONString(details)); 
  26.         return Mono.fromRunnable(() -> { 
  27.             DingDingMessageUtil.sendTextMessage(str.toString()); 
  28.         }); 
  29.     } 

发送工具类

  1. import java.io.InputStream; 
  2. import java.io.OutputStream; 
  3. import java.net.HttpURLConnection; 
  4. import java.net.URL; 
  5.  
  6. import com.alibaba.fastjson.JSONObject; 
  7.  
  8. public class DingDingMessageUtil { 
  9.   public static String access_token = "Token"
  10.     public static void sendTextMessage(String msg) { 
  11.         try { 
  12.             Message message = new Message(); 
  13.             message.setMsgtype("text"); 
  14.             message.setText(new MessageInfo(msg)); 
  15.             URL url = new URL("https://oapi.dingtalk.com/robot/send?access_token=" + access_token); 
  16.             // 建立 http 连接 
  17.             HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
  18.             conn.setDoOutput(true); 
  19.             conn.setDoInput(true); 
  20.             conn.setUseCaches(false); 
  21.             conn.setRequestMethod("POST"); 
  22.             conn.setRequestProperty("Charset""UTF-8"); 
  23.             conn.setRequestProperty("Content-Type""application/Json; charset=UTF-8"); 
  24.             conn.connect(); 
  25.             OutputStream out = conn.getOutputStream(); 
  26.             String textMessage = JSONObject.toJSONString(message); 
  27.             byte[] data = textMessage.getBytes(); 
  28.             out.write(data); 
  29.             out.flush(); 
  30.             out.close(); 
  31.             InputStream in = conn.getInputStream(); 
  32.             byte[] data1 = new byte[in.available()]; 
  33.             in.read(data1); 
  34.             System.out.println(new String(data1)); 
  35.         } catch (Exception e) { 
  36.             e.printStackTrace(); 
  37.         } 
  38.     } 

消息类:

  1. public class Message { 
  2.   private String msgtype; 
  3.     private MessageInfo text; 
  4.     public String getMsgtype() { 
  5.         return msgtype; 
  6.     } 
  7.     public void setMsgtype(String msgtype) { 
  8.         this.msgtype = msgtype; 
  9.     } 
  10.     public MessageInfo getText() { 
  11.         return text; 
  12.     } 
  13.     public void setText(MessageInfo text) { 
  14.         this.text = text; 
  15.     } 

  1. public class MessageInfo { 
  2.     private String content; 
  3.     public MessageInfo(String content) { 
  4.         this.content = content; 
  5.     } 
  6.     public String getContent() { 
  7.         return content; 
  8.     } 
  9.     public void setContent(String content) { 
  10.         this.content = content; 
  11.     } 

我们下线一个服务后,就可以看到钉钉群就发了消息的通知

Spring Cloud Admin健康检查 邮件、钉钉群通知

同时,当我们启动服务的时候,也会有消息通知我们服务启动了

 Spring Cloud Admin健康检查 邮件、钉钉群通知

Spring Cloud Admin健康检查 邮件、钉钉群通知

四 总结

 

上面就是我们对admin 健康检查的实际应用,在企业中一般会有短信通知+钉钉群通知和邮件,感兴趣的小伙伴可以去试试看,还是挺好玩的,还有一个就是微信通知,在服务号 模板消息感兴趣的小伙伴可以自行去研究看看,大家加油~

原文地址:https://mp.weixin.qq.com/s/n6INfg8ceEpRuxLGwzVlCw