1、起因

新需求开发了一个新接口,在联调环境正常注册,到了测试环境,调用方找不到对应接口;

通过dubbo-admin,查看服务注册情况,发现以下情况:
  1、新接口 和 其他旧接口  均未在dubbo管理后台展示;
  2、日志输出显示,服务正在被正常调用;
  3、在dubbo管理后台操作禁用,启用等操作均不生效。

2、排查

2.1、重启

由于dubbo服务能正常使用,而dubbo-admin却不能及时的更新数据,怀疑是dubbo-admin服务问题,于是尝试重启dubbo-admin服务。

结果原先还能看到管理界面的dubbo-admin直接罢工,查看日志发现报了“数据包体过大,终止响应”的异常,从而导致dubbo-admin一直未能拉取到注册到zookeeper的dubbo服务信息,进而启动失败;

2.2、查看节点数据

既然是响应包体过大,于是便打算通过zookeeper的客户端直连查看dubbo节点数据都有啥,发现客户端也因为数据包体响应过大而不能连上

2.3、jute.maxbuffer

转换思路,既然是响应体过大,导致连接失败,那就尝试看能不能调整响应包的大小,于是求助度娘,搜索zoookeeper的相关参数,

发现通过修改“jute.maxbuffer” 的参数大小,可以调整zookeeper的对外响应包体大小。

3、尝试

3.1、发现异常节点

通过在启动命令后添加 “-Djute.maxbuffer=41943040” ;

果然没有再报响应包过大的异常,但是查看启动日志,却发现打印出了大量的不符合规范的 dubbo服务节点

并且最终由于过多的异常节点,导致内存溢出,宣导服务还是启动失败。

3.2、删除异常节点

既然发现了大量的异常节点,那么自然的就是通过遍历将其删除。

删除规则也相对简单,因为项目注册的服务均是以 com 开始的,因此一旦发现不是以 com开始的就直接将之删除。

PS:链接zookeeper的代码也需要设置参数“”,否则一样会包报“响应包”过大的异常。

运行代码后,发现在zookeeper中,一旦子节点有数据(官方解释为:不允许删除非叶子节点),是不允许直接对其进行删除动作的。通过递归函数将所有的不符合规范的节点删除。

public class BaseZookeeper implements Watcher {private ZooKeeper zookeeper;/*** 超时时间*/private static final int SESSION_TIME_OUT = 20000;private CountDownLatch countDownLatch = new CountDownLatch(1);@Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {System.out.println("Watch received event");countDownLatch.countDown();}}/*** 连接zookeeper* * @param host* @throws Exception*/public void connectZookeeper(String host) throws Exception {zookeeper = new ZooKeeper(host, SESSION_TIME_OUT, this);countDownLatch.await();System.out.println("zookeeper connection success");}/*** 创建节点* * @param path* @param data* @throws Exception*/public String createNode(String path, String data) throws Exception {return this.zookeeper.create(path, data.getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}/*** 获取路径下所有子节点* * @param path* @return* @throws KeeperException* @throws InterruptedException*/public List<String> getChildren(String path) throws KeeperException,InterruptedException {List<String> children = zookeeper.getChildren(path, false);return children;}/*** 获取节点上面的数据* * @param path*            路径* @return* @throws KeeperException* @throws InterruptedException*/public String getData(String path) throws KeeperException,InterruptedException {byte[] data = zookeeper.getData(path, false, null);if (data == null) {return "";}return new String(data);}/*** 设置节点信息* * @param path*            路径* @param data*            数据* @return* @throws KeeperException* @throws InterruptedException*/public Stat setData(String path, String data) throws KeeperException,InterruptedException {Stat stat = zookeeper.setData(path, data.getBytes(), -1);return stat;}/*** 删除节点* * @param path* @throws InterruptedException* @throws KeeperException*/public void deleteNode(String path) throws InterruptedException,KeeperException {zookeeper.delete(path, -1);}/*** 获取创建时间* * @param path* @return* @throws KeeperException* @throws InterruptedException*/public String getCTime(String path) throws KeeperException,InterruptedException {Stat stat = zookeeper.exists(path, false);return String.valueOf(stat.getCtime());}/*** 获取某个路径下孩子的数量* * @param path* @return* @throws KeeperException* @throws InterruptedException*/public Integer getChildrenNum(String path) throws KeeperException,InterruptedException {int childenNum = zookeeper.getChildren(path, false).size();return childenNum;}/*** 关闭连接* * @throws InterruptedException*/public void closeConnection() throws InterruptedException {if (zookeeper != null) {zookeeper.close();}}}
 public static void main(String[] args) {BaseZookeeper zookeeper = new BaseZookeeper();try {// 链接zookeeperzookeeper.connectZookeeper("zookeeper.szy.com:2181");String path = "/dubbo";// 查询dubbo节点下的所有子节点List<String> children = zookeeper.getChildren(path);// 输出节点总长度System.out.println(children.size());// 遍历dubbo节点下的子节点for (int i = 0; i < children.size(); i++) {String childPath = children.get(i);System.out.println("遍历第"+i+"个");// 如果不是符合规范的dubbo节点则直接删除if(childPath.startsWith("com")){continue;}else{// 删除异常的dubbo子节点childDel(zookeeper,path+"/"+childPath);}}} catch (Exception e) {e.printStackTrace();}finally{try {// 关闭连接zookeeper.closeConnection();} catch (InterruptedException e) {e.printStackTrace();}}}/*** 方法描述:遍历删除子节点* @param zookeeper* @param childPath* @throws Exception*/private static void childDel(BaseZookeeper zookeeper,String childPath)throws Exception{// 获取当前节点路径下的所有子节点List<String> childs = zookeeper.getChildren(childPath);// 如果还有子节点,则继续遍历这些子节点if(childs.size()>0){for (String child : childs) {childDel(zookeeper, childPath+"/"+child);}}else{// 如果当前子节点(叶子节点),则执行删除动作zookeeper.deleteNode(childPath);System.out.println("删除节点-->"+childPath);                       }}

再次启动dubbo-admin项目,恢复正常。

4、关键

4.1、可以通过参数  jute.maxbuffer 来调整 zookeeper的写入和响应包大小

4.2、zookeeper不能直接删除父节点,需要将其子节点均删干净后才能删除父节点

4.3、jute.maxbuffer 的值不能被设置成过大,会影响zookeeper的数据写入和同步性能

5、待解决

由于没能及时打印异常dubbo接口的详细数据,无法准确分析其来源,只能等待后续再次出现类似数据时加以分析解决。

zookeeper中dubboo节点过多导致dubbo-admin启动失败排查相关推荐

  1. Ansible管理节点过多导致的超时问题解决方法

    管理节点过多导致的超时问题解决方法 默认情况下,Ansible将尝试并行管理playbook中所有的机器.对于滚动更新用例,可以使用serial关键字定义Ansible一次应管理多少主机,还可以将se ...

  2. Web.xml中配置监听器Listener导致Tomcat无法启动

    Web.xml中配置监听器Listener导致Tomcat无法启动 1.在pom.xml里导入 org.springframework spring-web 5.0.5.RELEASE 版本看你个人的 ...

  3. 下载丨10月数据库技术通讯:HAIP在两个私网网卡上发生互换,导致ASM实例启动失败...

    墨墨导读:为了及时共享行业案例,通知共性问题,达成共享和提前预防,我们整理和编辑了<云和恩墨技术通讯>,通过对过去一段时间的知识回顾,故障归纳,以期提供有价值的信息供大家参考.同时,我们也 ...

  4. Do not use “@ts-ignore“ because it alters compilation errors(ts严格模式未关闭导致的项目启动失败的解决方案)

    ts严格模式未关闭导致的项目启动失败解决方案 项目场景: 问题描述: 原因分析: 解决方案: 项目场景: 用ts搭建vue项目的时候用@ts-ignore来避免报错,结果编译时仍然出错导致无法启动服务 ...

  5. ipv6禁用导致rpcbind服务启动失败实例

    ipv6禁用导致rpcbind服务启动失败实例 昨天在做服务器磁盘分区扩容的时候出现过一个服务启动的问题,在此记录. 情景再现:前天晚上申请做磁盘扩容,得到批准后,昨天早上5点开始做停机调整维护,历经 ...

  6. 记一次磁盘挂载导致mysql服务启动失败的问题

    问题背景: 服务器某个目录(/data目录)磁盘空间已满,并且该目录下有个子目录还是mysql的数据存储目录(/data/mysql):采用额外新增一块数据盘,并将该数据盘挂载到/data目录下的方式 ...

  7. zookeeper启动失败排查

    最近开始实践搭建Linux下的集群环境,在搭建zookeeper的时候,出现了启动失败的情况,介绍下几种情况和解决方法. 首先,强烈建议新手刚开始搭建的时候关掉防火墙,否则可能出现很多奇怪的错误令人心 ...

  8. eclipse中tomcat提示404错误及tomcat启动失败(完美解决)

    404错误解决方案  在配置项目环境的时候遇到这么一个问题,在jdk maven tomcat都配置完成以后,在浏览器中输入:localhost:8080来准备启动tomcat的时候,提示404错误. ...

  9. android gradle resvalue,在插件中Gradle使用resValue在资源文件中添加信息,导致realease版本编译失败...

    问题详细描述 Detailed description of the problem 由于在插件中无法读取自身的meta-data,因此在资源文件中做一些分渠道分发的内容填充.但是使用resValue ...

最新文章

  1. Atomikos 中文说明文档【转】
  2. (jQuery,YUI)哪一个适合我?
  3. 【深度学习的数学】用神经网络进行图像分类时,为什么输出层的神经单元数量要跟分类数相同?可以采用二进制的表示方式么?
  4. 修改git commit默认触发的编辑器
  5. [C/C++]C++标准
  6. C++静态成员函数指针
  7. csds原装的Markdown文档
  8. CPUID — CPU Identification
  9. jmeter mysql driver_jmeter测试mysql数据库之JDBC请求
  10. 研发项目wbs分解简单案例_2013项目管理案例分析:工作分解结构(WBS)(精选五篇)...
  11. 书评:我看《软件开发沉思录ThoughtWorks文集》
  12. CSS学习21:fixed(固定定位)
  13. 移动硬盘无法退出终极解决方法
  14. 微软云服务器密码如何重置,微软云密码重置
  15. 分布式高频量化交易系统架构讲解(企业版,期货ctp,股票xtp,数字货币,附全部源码)(值得收藏)
  16. 软件测试工程师简历项目经验怎么写?--1000套软件测试工程师简历
  17. vue项目-element UI-NavMenu 导航菜单始终只展开一个
  18. Mybatis学习总结(结合个人理解)
  19. Hipo-iPod 处理对象
  20. 高仿人人车 范围选择器

热门文章

  1. 基于Hadoop的大数据平台实施
  2. 随身wifi改造打印盒子,支持安卓/IOS/Windows
  3. linux shmget ftok shmat shmdt shmctl函数
  4. java 发送企业邮箱_java 企业邮箱_java 企业邮箱群发邮件
  5. 基于FS4412的学习实验二
  6. Java继承关系中,父类不可以强制转换成子类
  7. 华南理工大学研究生宿舍一瞥
  8. 【100%通过率】华为OD机试真题 C 实现【密室逃生游戏】【2022 Q4 | 100分】
  9. hmr webpack 不编译_webpack - hmr热更新
  10. Dijkstra求单源最短路