- 由于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
基于zookeeper 监控dubbo provider 下线,提供dubbo 服务下线 邮箱预警
最新推荐文章于 2023-06-07 14:47:33 发布