From 6b023a2b08118cdfed14b50dbcf5e975cfa3d8a9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <wangiegie@gmail.com>
Date: Sun, 22 Apr 2018 12:45:02 +0800
Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=92=89=E9=92=89=E7=9B=91?=
 =?UTF-8?q?=E6=8E=A7=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../pig/common/constant/MqQueueConstant.java  |  9 +-
 .../util/template/DingTalkMsgTemplate.java    | 52 ++++++++++++
 .../handler/PigAccessDeniedHandler.java       |  7 +-
 .../service/impl/PermissionServiceImpl.java   |  3 +
 .../github/pig/daemon/job/DemoSimpleJob.java  |  2 +-
 .../github/pig/daemon/job/PigDataflowJob.java |  2 +-
 .../github/pig/daemon/job/PigSimpleJob.java   |  2 +-
 pig-modules/pig-mc-service/pom.xml            | 33 ++------
 .../mc/config/DingTalkPropertiesConfig.java   | 21 +++++
 .../mc/handler/DingTalkMessageHandler.java    | 45 ++++++++++
 .../mc/handler/SmsAliyunMessageHandler.java   | 84 ++++++++++---------
 .../DingTalkServiceChangeReceiveListener.java | 32 +++++++
 ...> MobileServiceChangeReceiveListener.java} |  4 +-
 .../pig/admin/common/config/RabbitConfig.java |  9 +-
 .../MonitorDingTalkPropertiesConfig.java      | 20 +++++
 .../config/MonitorMobilePropertiesConfig.java | 20 ++---
 .../config/MonitorPropertiesConfig.java       | 25 ++++++
 .../config/PigNotifierConfiguration.java      |  8 +-
 ...otifier.java => StatusChangeNotifier.java} | 32 +++++--
 19 files changed, 306 insertions(+), 104 deletions(-)
 create mode 100644 pig-common/src/main/java/com/github/pig/common/util/template/DingTalkMsgTemplate.java
 create mode 100644 pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/config/DingTalkPropertiesConfig.java
 create mode 100644 pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/handler/DingTalkMessageHandler.java
 create mode 100644 pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/listener/DingTalkServiceChangeReceiveListener.java
 rename pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/listener/{ServiceChangeReceiveListener.java => MobileServiceChangeReceiveListener.java} (88%)
 create mode 100644 pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorDingTalkPropertiesConfig.java
 create mode 100644 pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorPropertiesConfig.java
 rename pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/filter/{MobileNotifier.java => StatusChangeNotifier.java} (66%)

diff --git a/pig-common/src/main/java/com/github/pig/common/constant/MqQueueConstant.java b/pig-common/src/main/java/com/github/pig/common/constant/MqQueueConstant.java
index 52a244f5..11467df9 100644
--- a/pig-common/src/main/java/com/github/pig/common/constant/MqQueueConstant.java
+++ b/pig-common/src/main/java/com/github/pig/common/constant/MqQueueConstant.java
@@ -17,9 +17,14 @@ public interface MqQueueConstant {
     String MOBILE_CODE_QUEUE = "mobile_code_queue";
 
     /**
-     * 服务状态队列
+     * 短信服务状态队列
      */
-    String SERVICE_STATUS_CHANGE = "service_status_change";
+    String MOBILE_SERVICE_STATUS_CHANGE = "mobile_service_status_change";
+
+    /**
+     * 钉钉服务状态队列
+     */
+    String DINGTALK_SERVICE_STATUS_CHANGE = "dingtalk_service_status_change";
 
     /**
      * zipkin 队列
diff --git a/pig-common/src/main/java/com/github/pig/common/util/template/DingTalkMsgTemplate.java b/pig-common/src/main/java/com/github/pig/common/util/template/DingTalkMsgTemplate.java
new file mode 100644
index 00000000..0c31dabf
--- /dev/null
+++ b/pig-common/src/main/java/com/github/pig/common/util/template/DingTalkMsgTemplate.java
@@ -0,0 +1,52 @@
+package com.github.pig.common.util.template;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * @author lengleng
+ * @date 2018/1/15
+ * 钉钉消息模板
+ * msgtype : text
+ * text : {"content":"服务: pig-upms-service 状态:UP"}
+ */
+@Data
+@ToString
+public class DingTalkMsgTemplate implements Serializable {
+    private String msgtype;
+    private TextBean text;
+
+    public String getMsgtype() {
+        return msgtype;
+    }
+
+    public void setMsgtype(String msgtype) {
+        this.msgtype = msgtype;
+    }
+
+    public TextBean getText() {
+        return text;
+    }
+
+    public void setText(TextBean text) {
+        this.text = text;
+    }
+
+    public static class TextBean {
+        /**
+         * content : 服务: pig-upms-service 状态:UP
+         */
+
+        private String content;
+
+        public String getContent() {
+            return content;
+        }
+
+        public void setContent(String content) {
+            this.content = content;
+        }
+    }
+}
diff --git a/pig-gateway/src/main/java/com/github/pig/gateway/componet/handler/PigAccessDeniedHandler.java b/pig-gateway/src/main/java/com/github/pig/gateway/componet/handler/PigAccessDeniedHandler.java
index 6c1676e0..abf800a5 100644
--- a/pig-gateway/src/main/java/com/github/pig/gateway/componet/handler/PigAccessDeniedHandler.java
+++ b/pig-gateway/src/main/java/com/github/pig/gateway/componet/handler/PigAccessDeniedHandler.java
@@ -4,6 +4,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.pig.common.constant.CommonConstant;
 import com.github.pig.common.util.R;
 import com.github.pig.common.util.exception.PigDeniedException;
+import com.xiaoleilu.hutool.http.HttpUtil;
+import com.xiaoleilu.hutool.util.URLUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -24,9 +27,9 @@ import java.io.PrintWriter;
  * 授权拒绝处理器,覆盖默认的OAuth2AccessDeniedHandler
  * 包装失败信息到PigDeniedException
  */
+@Slf4j
 @Component
 public class PigAccessDeniedHandler extends OAuth2AccessDeniedHandler {
-    private static Logger logger = LoggerFactory.getLogger(PigAccessDeniedHandler.class);
     @Autowired
     private ObjectMapper objectMapper;
 
@@ -41,7 +44,7 @@ public class PigAccessDeniedHandler extends OAuth2AccessDeniedHandler {
      */
     @Override
     public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException authException) throws IOException, ServletException {
-        logger.info("授权失败,禁止访问");
+        log.info("授权失败,禁止访问 {}", request.getRequestURI());
         response.setCharacterEncoding(CommonConstant.UTF8);
         response.setContentType(CommonConstant.CONTENT_TYPE);
         R<String> result = new R<>(new PigDeniedException("授权失败,禁止访问"));
diff --git a/pig-gateway/src/main/java/com/github/pig/gateway/service/impl/PermissionServiceImpl.java b/pig-gateway/src/main/java/com/github/pig/gateway/service/impl/PermissionServiceImpl.java
index 53c50ab4..4ce36ec3 100644
--- a/pig-gateway/src/main/java/com/github/pig/gateway/service/impl/PermissionServiceImpl.java
+++ b/pig-gateway/src/main/java/com/github/pig/gateway/service/impl/PermissionServiceImpl.java
@@ -5,6 +5,7 @@ import com.github.pig.common.vo.MenuVO;
 import com.github.pig.gateway.feign.MenuService;
 import com.github.pig.gateway.service.PermissionService;
 import com.xiaoleilu.hutool.collection.CollectionUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -20,6 +21,7 @@ import java.util.Set;
  * @author lengleng
  * @date 2017/10/28
  */
+@Slf4j
 @Service("permissionService")
 public class PermissionServiceImpl implements PermissionService {
     @Autowired
@@ -39,6 +41,7 @@ public class PermissionServiceImpl implements PermissionService {
 
         if (principal != null) {
             if (CollectionUtil.isEmpty(grantedAuthorityList)) {
+                log.warn("角色列表为空:{}",authentication.getPrincipal());
                 return hasPermission;
             }
 
diff --git a/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/DemoSimpleJob.java b/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/DemoSimpleJob.java
index 72e08d35..e8fe6392 100644
--- a/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/DemoSimpleJob.java
+++ b/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/DemoSimpleJob.java
@@ -11,7 +11,7 @@ import lombok.extern.slf4j.Slf4j;
  * 测试Job
  */
 @Slf4j
-@ElasticJobConfig(cron = "0/2 * * * * ?", shardingTotalCount = 3,
+@ElasticJobConfig(cron = "0 0 0/1 * * ?", shardingTotalCount = 3,
         shardingItemParameters = "0=pig1,1=pig2,2=pig3",
         startedTimeoutMilliseconds = 5000L,
         completedTimeoutMilliseconds = 10000L,
diff --git a/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/PigDataflowJob.java b/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/PigDataflowJob.java
index fe5dc30c..29592399 100644
--- a/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/PigDataflowJob.java
+++ b/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/PigDataflowJob.java
@@ -10,7 +10,7 @@ import java.util.List;
  * @author lengleng
  * @date 2018/2/8
  */
-@ElasticJobConfig(cron = "0/2 * * * * ?", shardingTotalCount = 3, shardingItemParameters = "0=Beijing,1=Shanghai,2=Guangzhou")
+@ElasticJobConfig(cron = "0 0 0/1 * * ? ", shardingTotalCount = 3, shardingItemParameters = "0=Beijing,1=Shanghai,2=Guangzhou")
 public class PigDataflowJob implements DataflowJob<Integer> {
 
 
diff --git a/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/PigSimpleJob.java b/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/PigSimpleJob.java
index 0857ea34..36140788 100644
--- a/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/PigSimpleJob.java
+++ b/pig-modules/pig-daemon-service/src/main/java/com/github/pig/daemon/job/PigSimpleJob.java
@@ -11,7 +11,7 @@ import lombok.extern.slf4j.Slf4j;
  * 测试Job
  */
 @Slf4j
-@ElasticJobConfig(cron = "0/2 * * * * ?", shardingTotalCount = 3,
+@ElasticJobConfig(cron = "0 0 0/1 * * ?", shardingTotalCount = 3,
         shardingItemParameters = "0=pig1,1=pig2,2=pig3",
         startedTimeoutMilliseconds = 5000L,
         completedTimeoutMilliseconds = 10000L,
diff --git a/pig-modules/pig-mc-service/pom.xml b/pig-modules/pig-mc-service/pom.xml
index aadde067..b892335a 100644
--- a/pig-modules/pig-mc-service/pom.xml
+++ b/pig-modules/pig-mc-service/pom.xml
@@ -30,11 +30,14 @@
         </dependency>
         <!--阿里大于-->
         <dependency>
-            <groupId>com.aliyun.taobao</groupId>
-            <artifactId>alidayu-sms</artifactId>
-            <version>1.0</version>
-            <scope>system</scope>
-            <systemPath>${basedir}/src/main/resources/lib/alidayu-sms-1.0.jar</systemPath>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>3.2.8</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>1.1.0</version>
         </dependency>
     </dependencies>
 
@@ -47,27 +50,7 @@
                     <finalName>${project.name}</finalName>
                 </configuration>
             </plugin>
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
-                    <encoding>UTF-8</encoding>
-                    <compilerArguments>
-                        <extdirs>${basedir}/src/main/resources/lib</extdirs>
-                    </compilerArguments>
-                </configuration>
-            </plugin>
         </plugins>
-        <resources>
-            <resource>
-                <targetPath>BOOT-INF/lib/</targetPath>
-                <directory>${basedir}/src/main/resources/lib/</directory>
-                <includes>
-                    <include>**/*.jar</include>
-                </includes>
-            </resource>
-        </resources>
     </build>
 
 </project>
diff --git a/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/config/DingTalkPropertiesConfig.java b/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/config/DingTalkPropertiesConfig.java
new file mode 100644
index 00000000..a1a1eef9
--- /dev/null
+++ b/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/config/DingTalkPropertiesConfig.java
@@ -0,0 +1,21 @@
+package com.github.pig.mc.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author lengleng
+ * @date 2018/4/2
+ * 钉钉服务配置
+ */
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "sms.dingtalk")
+public class DingTalkPropertiesConfig {
+    /**
+     * webhook
+     */
+    private String webhook;
+
+}
diff --git a/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/handler/DingTalkMessageHandler.java b/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/handler/DingTalkMessageHandler.java
new file mode 100644
index 00000000..95e0ce59
--- /dev/null
+++ b/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/handler/DingTalkMessageHandler.java
@@ -0,0 +1,45 @@
+package com.github.pig.mc.handler;
+
+import com.alibaba.fastjson.JSONObject;
+import com.github.pig.common.util.template.DingTalkMsgTemplate;
+import com.github.pig.mc.config.DingTalkPropertiesConfig;
+import com.xiaoleilu.hutool.http.HttpUtil;
+import com.xiaoleilu.hutool.util.StrUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author lengleng
+ * @date 2018/4/22
+ * 发送钉钉消息逻辑
+ */
+@Slf4j
+@Component
+public class DingTalkMessageHandler {
+    @Autowired
+    private DingTalkPropertiesConfig dingTalkPropertiesConfig;
+
+    /**
+     * 业务处理
+     *
+     * @param text 消息
+     */
+    public boolean process(String text) {
+        String webhook = dingTalkPropertiesConfig.getWebhook();
+        if (StrUtil.isBlank(webhook)) {
+            log.error("钉钉配置错误,webhook为空");
+            return false;
+        }
+
+        DingTalkMsgTemplate dingTalkMsgTemplate = new DingTalkMsgTemplate();
+        dingTalkMsgTemplate.setMsgtype("text");
+        DingTalkMsgTemplate.TextBean textBean = new DingTalkMsgTemplate.TextBean();
+        textBean.setContent(text);
+        dingTalkMsgTemplate.setText(textBean);
+        String result = HttpUtil.post(webhook, JSONObject.toJSONString(dingTalkMsgTemplate));
+        log.info("钉钉提醒成功,报文响应:{}", result);
+        return true;
+    }
+
+}
diff --git a/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/handler/SmsAliyunMessageHandler.java b/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/handler/SmsAliyunMessageHandler.java
index d66218e7..32412e03 100644
--- a/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/handler/SmsAliyunMessageHandler.java
+++ b/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/handler/SmsAliyunMessageHandler.java
@@ -1,16 +1,19 @@
 package com.github.pig.mc.handler;
 
 import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
 import com.github.pig.common.constant.CommonConstant;
 import com.github.pig.common.util.Assert;
 import com.github.pig.common.util.template.MobileMsgTemplate;
 import com.github.pig.mc.config.SmsAliyunPropertiesConfig;
 import com.github.pig.mc.utils.constant.SmsChannelTemplateConstant;
 import com.github.pig.mc.utils.sms.EnumSmsChannelTemplate;
-import com.taobao.api.DefaultTaobaoClient;
-import com.taobao.api.TaobaoClient;
-import com.taobao.api.request.AlibabaAliqinFcSmsNumSendRequest;
-import com.taobao.api.response.AlibabaAliqinFcSmsNumSendResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -25,7 +28,8 @@ import org.springframework.stereotype.Component;
 public class SmsAliyunMessageHandler extends AbstractMessageHandler {
     @Autowired
     private SmsAliyunPropertiesConfig smsAliyunPropertiesConfig;
-    private static final String URL = "http://gw.api.taobao.com/router/rest";
+    private static final String product = "Dysmsapi";
+    private static final String domain = "dysmsapi.aliyuncs.com";
 
     /**
      * 数据校验
@@ -45,43 +49,43 @@ public class SmsAliyunMessageHandler extends AbstractMessageHandler {
      */
     @Override
     public boolean process(MobileMsgTemplate mobileMsgTemplate) {
-        // 配置连接参数URL、KEY、SECRET
-        TaobaoClient taobaoClient = new DefaultTaobaoClient(URL, smsAliyunPropertiesConfig.getAccessKey(), smsAliyunPropertiesConfig.getSecretKey());
-        // 配置请求参数
-        AlibabaAliqinFcSmsNumSendRequest request = new AlibabaAliqinFcSmsNumSendRequest();
-        /**
-         * 公共回传参数,在“消息返回”中会透传回该参数;举例:用户可以传入自己下级的会员ID,在消息返回时,该会员ID会包含在内,用户可以根据该会员ID识别是哪位会员使用了你的应用
-         */
-        request.setExtend(mobileMsgTemplate.getMobile());
-        /**
-         * 短信接收号码。支持单个或多个手机号码,传入号码为11位手机号码,不能入加0或+86。群发短信需传多个号码,以英文逗号分隔,一次调用最多传入200个号码。示例:18600000000,13911111111,13322222222
-         */
-        request.setRecNum(mobileMsgTemplate.getMobile());
-        /**
-         * 短信签名,传入的短信签名必须是在阿里大鱼“管理中心-短信签名管理”中的可用签名。如“阿里大鱼”已在短信签名管理中通过审核,则可传入”阿里大鱼“(传参时去掉引号)作为短信签名。短信效果示例:【阿里大鱼】欢迎使用阿里大鱼服务。
-         */
-        request.setSmsFreeSignName(EnumSmsChannelTemplate.LOGIN_NAME_LOGIN.getDescription());
-        /**
-         * 短信模板变量,传参规则{"key":"value"},key的名字须和申请模板中的变量名一致,多个变量之间以逗号隔开。示例:针对模板“验证码${code},您正在进行${product}身份验证,打死不要告诉别人哦!”,传参时需传入{"code":"1234","product":"alidayu"}
-         */
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("product","pig_cloud");
-        jsonObject.put("code",mobileMsgTemplate.getText());
-        request.setSmsParamString(jsonObject.toString());
-        /**
-         * 短信模板ID,传入的模板必须是在阿里大鱼“管理中心-短信模板管理”中的可用模板。示例:SMS_585014
-         */
-        request.setSmsTemplateCode(smsAliyunPropertiesConfig.getChannels().get(SmsChannelTemplateConstant.LOGIN_NAME_LOGIN));
-        /**
-         * 短信类型,传入值请填写normal
-         */
-        request.setSmsType("normal");
+        //可自助调整超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+
+        //初始化acsClient,暂不支持region化
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", smsAliyunPropertiesConfig.getAccessKey(), smsAliyunPropertiesConfig.getSecretKey());
         try {
-            AlibabaAliqinFcSmsNumSendResponse response = taobaoClient.execute(request);
-            return response.getResult().getSuccess();
-        }catch (Exception e){
-            return false;
+            DefaultProfile.addEndpoint("cn-hou", "cn-hangzhou", product, domain);
+        } catch (ClientException e) {
+            log.error("初始化SDK 异常", e);
+            e.printStackTrace();
         }
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+
+        //组装请求对象-具体描述见控制台-文档部分内容
+        SendSmsRequest request = new SendSmsRequest();
+        //必填:待发送手机号
+        request.setPhoneNumbers(mobileMsgTemplate.getMobile());
+        //必填:短信签名-可在短信控制台中找到
+        request.setSignName(EnumSmsChannelTemplate.LOGIN_NAME_LOGIN.getDescription());
+        //必填:短信模板-可在短信控制台中找到
+        request.setTemplateCode(smsAliyunPropertiesConfig.getChannels().get(SmsChannelTemplateConstant.LOGIN_NAME_LOGIN));
+        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("product", "pig_cloud");
+        jsonObject.put("code", mobileMsgTemplate.getText());
+        request.setTemplateParam(jsonObject.toJSONString());
+        request.setOutId(mobileMsgTemplate.getMobile());
+
+        //hint 此处可能会抛出异常,注意catch
+        try {
+            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
+        } catch (ClientException e) {
+            log.error("发送异常");
+            e.printStackTrace();
+        }
+        return true;
     }
 
     /**
diff --git a/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/listener/DingTalkServiceChangeReceiveListener.java b/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/listener/DingTalkServiceChangeReceiveListener.java
new file mode 100644
index 00000000..1f3b59bf
--- /dev/null
+++ b/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/listener/DingTalkServiceChangeReceiveListener.java
@@ -0,0 +1,32 @@
+package com.github.pig.mc.listener;
+
+import com.github.pig.common.constant.MqQueueConstant;
+import com.github.pig.common.util.template.DingTalkMsgTemplate;
+import com.github.pig.mc.handler.DingTalkMessageHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author lengleng
+ * @date 2018/4/22
+ * 监听服务状态改变发送请求
+ */
+@Slf4j
+@Component
+@RabbitListener(queues = MqQueueConstant.DINGTALK_SERVICE_STATUS_CHANGE)
+public class DingTalkServiceChangeReceiveListener {
+    @Autowired
+    private DingTalkMessageHandler dingTalkMessageHandler;
+
+    @RabbitHandler
+    public void receive(String text) {
+        long startTime = System.currentTimeMillis();
+        log.info("消息中心接收到钉钉发送请求-> 内容:{} ", text);
+        dingTalkMessageHandler.process(text);
+        long useTime = System.currentTimeMillis() - startTime;
+        log.info("调用 钉钉网关处理完毕,耗时 {}毫秒", useTime);
+    }
+}
diff --git a/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/listener/ServiceChangeReceiveListener.java b/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/listener/MobileServiceChangeReceiveListener.java
similarity index 88%
rename from pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/listener/ServiceChangeReceiveListener.java
rename to pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/listener/MobileServiceChangeReceiveListener.java
index 9114d870..49911677 100644
--- a/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/listener/ServiceChangeReceiveListener.java
+++ b/pig-modules/pig-mc-service/src/main/java/com/github/pig/mc/listener/MobileServiceChangeReceiveListener.java
@@ -14,8 +14,8 @@ import org.springframework.stereotype.Component;
  */
 @Slf4j
 @Component
-@RabbitListener(queues = MqQueueConstant.SERVICE_STATUS_CHANGE)
-public class ServiceChangeReceiveListener {
+@RabbitListener(queues = MqQueueConstant.MOBILE_SERVICE_STATUS_CHANGE)
+public class MobileServiceChangeReceiveListener {
     @RabbitHandler
     public void receive(MobileMsgTemplate mobileMsgTemplate) {
         long startTime = System.currentTimeMillis();
diff --git a/pig-modules/pig-upms-service/src/main/java/com/github/pig/admin/common/config/RabbitConfig.java b/pig-modules/pig-upms-service/src/main/java/com/github/pig/admin/common/config/RabbitConfig.java
index 6d1fdb98..cbc78a80 100644
--- a/pig-modules/pig-upms-service/src/main/java/com/github/pig/admin/common/config/RabbitConfig.java
+++ b/pig-modules/pig-upms-service/src/main/java/com/github/pig/admin/common/config/RabbitConfig.java
@@ -38,8 +38,13 @@ public class RabbitConfig {
      * @return
      */
     @Bean
-    public Queue initServiceStatusChangeQueue() {
-        return new Queue(MqQueueConstant.SERVICE_STATUS_CHANGE);
+    public Queue initMobileServiceStatusChangeQueue() {
+        return new Queue(MqQueueConstant.MOBILE_SERVICE_STATUS_CHANGE);
+    }
+
+    @Bean
+    public Queue initDingTalkServiceStatusChangeQueue() {
+        return new Queue(MqQueueConstant.DINGTALK_SERVICE_STATUS_CHANGE);
     }
 
     @Bean
diff --git a/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorDingTalkPropertiesConfig.java b/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorDingTalkPropertiesConfig.java
new file mode 100644
index 00000000..d252bced
--- /dev/null
+++ b/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorDingTalkPropertiesConfig.java
@@ -0,0 +1,20 @@
+package com.github.pig.monitor.config;
+
+import lombok.Data;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author lengleng
+ * @date 2018/4/22
+ */
+@Data
+@ConditionalOnExpression("!'${webhook}'.isEmpty()")
+public class MonitorDingTalkPropertiesConfig {
+    /**
+     * 是否开启钉钉通知
+     */
+    private Boolean enabled;
+}
diff --git a/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorMobilePropertiesConfig.java b/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorMobilePropertiesConfig.java
index 9fb73f8c..575699a0 100644
--- a/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorMobilePropertiesConfig.java
+++ b/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorMobilePropertiesConfig.java
@@ -1,28 +1,18 @@
 package com.github.pig.monitor.config;
 
+import lombok.Data;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * @author lengleng
- * @date 2018/1/25
- * 监控短信接收者列表
+ * @date 2018/4/22
  */
-@Configuration
+@Data
 @ConditionalOnExpression("!'${mobiles}'.isEmpty()")
-@ConfigurationProperties(prefix = "mobiles")
 public class MonitorMobilePropertiesConfig {
-    private List<String> users = new ArrayList<>();
-
-    public List<String> getUsers() {
-        return users;
-    }
-
-    public void setUsers(List<String> users) {
-        this.users = users;
-    }
+    private Boolean enabled;
+    private List<String> mobiles = new ArrayList<>();
 }
diff --git a/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorPropertiesConfig.java b/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorPropertiesConfig.java
new file mode 100644
index 00000000..3575d167
--- /dev/null
+++ b/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/MonitorPropertiesConfig.java
@@ -0,0 +1,25 @@
+package com.github.pig.monitor.config;
+
+import lombok.Data;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author lengleng
+ * @date 2018/1/25
+ * 监控配置
+ */
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "notifier")
+public class MonitorPropertiesConfig {
+
+    private MonitorMobilePropertiesConfig mobile;
+
+    private MonitorDingTalkPropertiesConfig dingTalk;
+
+}
diff --git a/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/PigNotifierConfiguration.java b/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/PigNotifierConfiguration.java
index c52c0cbe..31adc318 100644
--- a/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/PigNotifierConfiguration.java
+++ b/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/config/PigNotifierConfiguration.java
@@ -1,6 +1,6 @@
 package com.github.pig.monitor.config;
 
-import com.github.pig.monitor.filter.MobileNotifier;
+import com.github.pig.monitor.filter.StatusChangeNotifier;
 import de.codecentric.boot.admin.notify.RemindingNotifier;
 import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,7 +23,7 @@ public class PigNotifierConfiguration {
     @Autowired
     private RabbitTemplate rabbitTemplate;
     @Autowired
-    private MonitorMobilePropertiesConfig monitorMobilePropertiesConfig;
+    private MonitorPropertiesConfig monitorPropertiesConfig;
     @Bean
     @Primary
     public RemindingNotifier remindingNotifier() {
@@ -33,8 +33,8 @@ public class PigNotifierConfiguration {
     }
 
     @Bean
-    public MobileNotifier mobileNotifier(){
-        return new MobileNotifier(monitorMobilePropertiesConfig,rabbitTemplate);
+    public StatusChangeNotifier mobileNotifier(){
+        return new StatusChangeNotifier(monitorPropertiesConfig,rabbitTemplate);
     }
 
     @Scheduled(fixedRate = 60_000L)
diff --git a/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/filter/MobileNotifier.java b/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/filter/StatusChangeNotifier.java
similarity index 66%
rename from pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/filter/MobileNotifier.java
rename to pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/filter/StatusChangeNotifier.java
index 45b2caf8..43e044dc 100644
--- a/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/filter/MobileNotifier.java
+++ b/pig-visual/pig-monitor/src/main/java/com/github/pig/monitor/filter/StatusChangeNotifier.java
@@ -1,9 +1,11 @@
 package com.github.pig.monitor.filter;
 
+import com.alibaba.fastjson.JSONObject;
 import com.github.pig.common.constant.MqQueueConstant;
 import com.github.pig.common.constant.enums.EnumSmsChannel;
+import com.github.pig.common.util.template.DingTalkMsgTemplate;
 import com.github.pig.common.util.template.MobileMsgTemplate;
-import com.github.pig.monitor.config.MonitorMobilePropertiesConfig;
+import com.github.pig.monitor.config.MonitorPropertiesConfig;
 import com.xiaoleilu.hutool.collection.CollectionUtil;
 import com.xiaoleilu.hutool.date.DateUtil;
 import de.codecentric.boot.admin.event.ClientApplicationEvent;
@@ -14,16 +16,16 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate;
 
 /**
  * @author lengleng
- * @date 2018/1/25
- * 服务下线手机短信通知
+ * @date 2018/4/22
+ * 服务下线通知
  */
 @Slf4j
-public class MobileNotifier extends AbstractStatusChangeNotifier {
+public class StatusChangeNotifier extends AbstractStatusChangeNotifier {
     public static final String STATUS_CHANGE = "STATUS_CHANGE";
     private RabbitTemplate rabbitTemplate;
-    private MonitorMobilePropertiesConfig monitorMobilePropertiesConfig;
+    private MonitorPropertiesConfig monitorMobilePropertiesConfig;
 
-    public MobileNotifier(MonitorMobilePropertiesConfig monitorMobilePropertiesConfig, RabbitTemplate rabbitTemplate) {
+    public StatusChangeNotifier(MonitorPropertiesConfig monitorMobilePropertiesConfig, RabbitTemplate rabbitTemplate) {
         this.rabbitTemplate = rabbitTemplate;
         this.monitorMobilePropertiesConfig = monitorMobilePropertiesConfig;
     }
@@ -57,9 +59,21 @@ public class MobileNotifier extends AbstractStatusChangeNotifier {
             log.info("Application {} ({}) is {}", event.getApplication().getName(),
                     event.getApplication().getId(), ((ClientApplicationStatusChangedEvent) event).getTo().getStatus());
             String text = String.format("应用:%s 服务ID:%s 下线,时间:%s", event.getApplication().getName(), event.getApplication().getId(), DateUtil.date(event.getTimestamp()).toString());
-            rabbitTemplate.convertAndSend(MqQueueConstant.SERVICE_STATUS_CHANGE,
-                    new MobileMsgTemplate(CollectionUtil.join(monitorMobilePropertiesConfig.getUsers(), ","),
-                            text, EnumSmsChannel.ALIYUN.getName()));
+
+            //开启短信通知
+            if (monitorMobilePropertiesConfig.getMobile().getEnabled()) {
+                log.info("开始短信通知,内容:{}", text);
+                rabbitTemplate.convertAndSend(MqQueueConstant.MOBILE_SERVICE_STATUS_CHANGE,
+                        new MobileMsgTemplate(CollectionUtil.join(monitorMobilePropertiesConfig.getMobile().getMobiles(), ","),
+                                text, EnumSmsChannel.ALIYUN.getName()));
+            }
+
+            if (monitorMobilePropertiesConfig.getDingTalk().getEnabled()) {
+                log.info("开始钉钉通知,内容:{}", text);
+                rabbitTemplate.convertAndSend(MqQueueConstant.DINGTALK_SERVICE_STATUS_CHANGE, text);
+            }
+
+
         } else {
             log.info("Application {} ({}) {}", event.getApplication().getName(),
                     event.getApplication().getId(), event.getType());