关于监控nacos服务实例数量以及告警钉钉消息通知

需求:监控指定系统的实例数量,在有节点掉线时进行钉钉消息推送

监听代码:

 //相关依赖
		<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${nacos.version}</version>
        </dependency>
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.listener.NamingEvent;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.extrotec.entity.SendMessageIn;
import com.extrotec.utils.DingTalkUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;


@Slf4j
@Component
public class ServiceStatusListner {

    @Value("${dingtalk.webhook}")
    private String webhook;

    @Value("${dingtalk.secret}")
    private String secret;

    @Value("${dingtalk.userMobil}")
    private String[] userMobil;

    @Value("${spring.cloud.nacos.discovery.server-addr}")
    private String nacosUrl;

    private static Map<String, Integer> cache = new ConcurrentHashMap<>();
    //初始化监听服务上下线
    @PostConstruct
    public void init() throws Exception {
        List<String> mobileList = new ArrayList<>();
        for(String mobile : userMobil){
            mobileList.add(mobile);
        }

        Properties properties = System.getProperties();
        properties.setProperty("serverAddr", nacosUrl);
        properties.setProperty("namespace", "public");
        NamingService naming = NamingFactory.createNamingService(properties);
        List<String> serviceNames = new ArrayList<>();
        serviceNames.add("xxx");
        serviceNames.add("xxxcenter");
        serviceNames.add("xxxgateway");
        for(String service : serviceNames) {
            naming.subscribe(service, event -> {
                List<Instance> instances =  ((NamingEvent)event).getInstances();
                String serviceName = ((NamingEvent)event).getServiceName();
                cache.computeIfAbsent(serviceName, k -> instances.size());
                if(cache.get(serviceName) <instances.size()){
                    cache.put(serviceName, instances.size());
                }
                if(instances.size() <cache.get(serviceName)) {
                    SendMessageIn error = new SendMessageIn();
                    error.setAtAll(false);
                    error.setMsgType("text");
                    error.setSecret(secret);
                    error.setWebhook(webhook);
                    error.setMobileList(mobileList);
                    error.setText(serviceName +"服务下线,"+"服务异常下线告警,当前节点数:"+instances.size());
                    DingTalkUtil.sendMessage(error);
                    log.info("============服务下线"+ serviceName);
                    cache.put(serviceName, instances.size());
                }else {

                    log.info("============服务上线"+ serviceName+",当前节点数量:"+instances.size());

                }
            });
        }
    }
}

钉钉推送工具类:

//钉钉消息推送依赖
<dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
            <version>1.0.1</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
</dependency>
@Data
public class SendMessageIn {

    //消息类型
    private String msgType;
    //webhook
    private String webhook;
    //密钥
    private String secret;
    //文本
    private String text;
    //指定对象
    private List<String> mobileList;
    //是否推送所有人
    private boolean isAtAll;
}
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiRobotSendRequest;
import com.dingtalk.api.response.OapiRobotSendResponse;
import com.extrotec.entity.SendMessageIn;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class DingTalkUtil {
    //文本消息
    private static final String TEXT = "text";

    /**
     * @ModifyTime 2021/11/8
     * 钉钉发送消息
     **/
    public static void sendMessage(SendMessageIn in){
        try {
            log.info("开始推送钉钉消息:" + in);
            Long timestamp = System.currentTimeMillis();
            String secret = in.getSecret();

            String stringToSign = timestamp + "\n" + secret;
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
            byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
            String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");

            DingTalkClient client = new DefaultDingTalkClient(in.getWebhook() + "&timestamp=" + timestamp + "&sign=" + sign);
            OapiRobotSendRequest request = new OapiRobotSendRequest();

            OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
            if (in.isAtAll() || in.getMobileList() == null || in.getMobileList().size() == 0) {
                //推送所有人
                at.setIsAtAll(true);
            } else {
                //推送指定用户
                at.setAtMobiles(in.getMobileList());
                at.setIsAtAll(false);
            }
            request.setAt(at);

            //文本消息
            if (TEXT.equals(in.getMsgType())) {
                request.setMsgtype(TEXT);
                OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
                text.setContent(in.getText());
                request.setText(text);
            }

            OapiRobotSendResponse response = client.execute(request);
            log.info("钉钉推送返回结果:" + response);
        }catch (Exception e){
            log.error("钉钉通知异常");
        }
    }

    public static void main(String[] args){
        List<String> mobileList = new ArrayList<>();
        mobileList.add("1811111111");

        SendMessageIn in = new SendMessageIn();
        in.setMsgType(TEXT);
        in.setAtAll(false);
        in.setMobileList(mobileList);
        in.setWebhook("https://oapi.dingtalk.com/robot/send?access_token=9xxxxxxxx");
        in.setSecret("SEC2ca0e08d0b19");
        in.setText("桃花坞里桃花庵,桃花庵下桃花仙");
        sendMessage(in);
    }
}

结果

在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值