基于zookeeper 监控dubbo provider 下线,提供dubbo 服务下线 邮箱预警

  • 由于JDK 使用1.7,案例中未使用1.8 新特性
  • 扫描dubbo 注册zookeeper 上的所有 /dubbo目录下的 provider目录节点
  •  public void getNode(CuratorFramework client, String parentNode) {
            try {
                List<String> nodeList =  ZKUtils.getChildren(client,parentNode);
    
                if (CollectionUtils.isEmpty(nodeList)) {
                    return;
                }
    
                for (String node : nodeList) {
                    // 完整node 节点路径
                    String childNode = parentNode.equals("/") ? parentNode + node : parentNode + "/" + node;
    
                    // 判断服务节点
                    if (node.equals(Constant.PROVIDERS)) {
                        //服务 provider
                        providersList.add(childNode);
    
                        List<String> providers = ZKUtils.getChildren(client,childNode);
                        for (String originalProvider : providers) {
                            String provider = null;
                            try {
                                provider = URLDecoder.decode(originalProvider, "UTF-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                            // log.info("转义的provider: {},真实的provider :{}", originalProvider, provider);
                            //服务目录
                            serverList.add(provider);
                        }
    
                        //break;
                    }
    
                    getNode(client, childNode);
                }
            } catch (Exception e) {
                log.error("遍历节点异常! e:{}", e);
            }
        }

     

  • 扫描出的 provider目录节点 ,纳入zookeeper 监控 
  •   /***
        * TODO: 监听provider 节点
        * @methodName  watchNodes
        * @param curatorFramework
         * @param providersList
        * @return void
        * @author gjt
        * @date 2020/9/16 0016 8:39
        */
        private void watchNodes(CuratorFramework curatorFramework, List<String> providersList) {
    
            if (CollectionUtils.isEmpty(providersList)) {
                log.info("-------------------->>>>>未发现需要监控的节点");
                return;
            }
    
            for (String providers : providersList) {
                try {
                    addListenerWithChild(curatorFramework, providers);
                } catch (Exception e) {
                    log.error("-------------------->>>>>监控的节点:{} 异常,e:{}", providers, e);
                }
    
            }
    
        }

     

  • 监控PathChildrenCacheEvent.Type 为“CHILD_REMOVED”的操作,解析
    PathChildrenCacheEvent 的data 信息,获取IP,端口,服务名称
  •  public void addListenerWithChild(CuratorFramework curatorFramework, String path) throws Exception {
            PathChildrenCache nodeCache = new PathChildrenCache(curatorFramework, path, true);
    
            PathChildrenCacheListener nodeCacheListener = new PathChildrenCacheListener() {
    
                public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
    
                    String operateType = pathChildrenCacheEvent.getType().toString();
                    log.info("type: " + operateType);
                    // 监控删除节点信息
                    if ("CHILD_REMOVED".equals(operateType)) {
                        StringBuilder stringBuilder = new StringBuilder();
                        ChildData childData = pathChildrenCacheEvent.getData();
    
                        try {
                            String pathDatas = URLDecoder.decode(pathChildrenCacheEvent.toString(), "UTF-8");
                            log.info("-------------------->>>>>pathChildrenCacheEvent:{} ", pathDatas);
                        } catch (UnsupportedEncodingException e) {
                        }
    
                        if (childData != null) {
                            // ip
                            String ip = null;
                            if (null != childData.getData()) {
                                ip = new String(childData.getData());
                            }
                            // 应用名称
                            String appName = "";
    
                            // dubbo 请求路径
                            String providerPath = null;
                            if (null != childData.getPath()) {
                                try {
                                    providerPath = URLDecoder.decode(childData.getPath(), "UTF-8");
                                } catch (UnsupportedEncodingException e) {
                                    e.printStackTrace();
                                }
    
                                log.info("-------------------->>>>>获取providerPath:{} ", providerPath);
    
                                if (StringUtils.isEmpty(ip)) {
                                    ip = ToolUtils.getIp(providerPath);
                                }
    
    
                                try {
                                    appName = ToolUtils.getApplicationName(providerPath);
                                } catch (Exception e) {
                                    log.error("-------------------->>>>>获取providerPath:{} 异常,e:{}", providerPath, e);
                                }
                            }
    
                            stringBuilder.append(ip).append(Constant.SEPARATOR).append(appName);
                            arraySet.add(stringBuilder.toString());
                        }
                    }
    
                }
    
    
            };
    
            nodeCache.getListenable().addListener(nodeCacheListener);
            nodeCache.start(PathChildrenCache.StartMode.NORMAL);
        }
    

     

  • dubbo 一个provider提供多个服务接口,provider 目录下出出现多个子目录,合并子目录事件触发结果,定时推送消息即可。使用CopyOnWriteArraySet

       完整代码参考 https://download.csdn.net/download/lovo1/12879057

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值