返回顶部
首页 > 资讯 > 前端开发 > html >如何排查Dubbo接口重复注销问题
  • 745
分享到

如何排查Dubbo接口重复注销问题

2024-04-02 19:04:59 745人浏览 泡泡鱼
摘要

本篇文章给大家分享的是有关如何排查dubbo接口重复注销问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我在公司内负责自研的dubbo注册中

本篇文章给大家分享的是有关如何排查dubbo接口重复注销问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

我在公司内负责自研的dubbo注册中心相关工作,群里经常接到业务方反馈dubbo接口注销报错。经排查,确定是同一个接口调用了两次注销接口导致,由于我们的注册中心注销接口不能重复调用,调用第二次会因为实例已经注销而报实例找不到的错误。

虽然这个报错仅会打印一条错误日志,不影响业务,但本着 follow  through的精神,我决定还是一探究竟,更何况重复注销也增加了应用的结束时间,影响了发布回滚速度。

问题复现

拿到业务方的dubbo版本,基于开源2.7.3内部定制的一个版本,该版本修改主要涉及安全漏洞修复以及一些业务适配,写了个demo跑起来,然后kill,发现果然报错了。

为了确定不是内部修改导致的问题,用开源的2.7.3版本再次测试,发现还是报错。

同时为了确定这是一个bug,我将dubbo版本修改为2.7.7做测试,发现该版本不再报错。

说明了重复注销至少是开源dubbo 2.7.3的一个bug,在更高的2.7.7版本中已经被修复。

于是有了解决方案:升级dubbo,但如果这么简单就没有这篇文章了。

内部的dubbo已经做了修改,想升级得把改动merge到新版本,比较费劲

就算升级了内部的dubbo版本,也不可能这么快速推动业务方升级

所以应该首先找到bug是哪里导致的,其次看注册中心的扩展是否可以修复这个问题,如果不能修复,就只能在内部的dubbo版本中修复该问题。

问题排查

怀疑ShutdownHook

由于这几天研究过ShutdownHook(点击查看原文跳转《ShutdownHook原理》),第一时间怀疑ShutdownHook可能有问题。

dubbo 2.7.3代码有关ShutdownHook的实现在DubboShutdownHook类,顺着代码梳理出如下关系

如何排查Dubbo接口重复注销问题

看到dubbo本身和spring都注册了ShutdownHook,更加怀疑这里是不是ShutdownHook注册重复了。于是debug看看是否是注册重复了,这里给一个小经验,Intelliidea调试ShutdownHook执行时,要手动kill进程才会触发debug,点IDE上的关闭按钮不会触发

如何排查Dubbo接口重复注销问题

在DubboShutdownHook.doDestroy打上断点,debug发现只会执行一次,这说明spring和dubbo的ShutdownHook只会注册一次,这是怎么实现的呢?经过很多次测试,发现了dubbo一个很牛逼的设计。

DubboShutdownHook中有reGISter和unregister方法,分别是注册和注销ShutdownHook,在这两个方法上都打上断点,在程序启动时发现这样一个有趣的执行顺序:

如何排查Dubbo接口重复注销问题

总结一下是dubbo本身注册了ShutdownHook,但如果用到了spring框架,spring框架在初始化时注销了dubbo注册的ShutdownHook,这样就只保留了spring的ShutdownHook,真是秒啊!实现的代码只有这短短几行

public static void addApplicationContext(ApplicationContext context) {     CONTEXTS.add(context);     if (context instanceof ConfigurableApplicationContext) {         ((ConfigurableApplicationContext) context).registerShutdownHook();         DubboShutdownHook.getDubboShutdownHook().unregister();     }     BeanFactoryUtils.addApplicationListener(context, SHUTDOWN_HOOK_LISTENER); }

于是怀疑的ShutdownHook问题被证明没有任何问题了。

从注销堆栈继续排查

能稳定复现的问题一定很好排查,借助IDE的debug来看两次注销的调用堆栈,在注册中心扩展的unregister方法处加断点,可以看到如下两次来源不同的堆栈信息

如何排查Dubbo接口重复注销问题

如何排查Dubbo接口重复注销问题

代码中体现是

如何排查Dubbo接口重复注销问题

也就是说一次ShutdownHook执行,触发了两次注销。

接下来就比较好排查了,一步一步debug,这里解释下

  • AbstractRegistryFactory.destroyAll()是销毁所有注册中心,销毁时会调研注册中心的注销接口

  • destroyProtocols是销毁所有的protocol,注册中心的protocol在销毁时拿到registry,然后调用了registry的注销接口

那么dubbo 2.7.7是如何避免这个问题的呢?

在dubbo 2.7.7的代码中,注册中心的protocol在销毁时获取注册中心稍微增加了点代码

如何排查Dubbo接口重复注销问题

原来在注册中心被销毁后,destroyed变量被置为true,从而在registry  protocol再次获取注册中心时,已经拿不到了原先的注册中心了,拿到的是一个空的注册中心,调用注销,自然没有什么效果。

追溯了下GitHub,这次PR是

https://github.com/apache/dubbo/pull/5450

这个修复在2.7.5就已经修复了

总结

  • dubbo重复注销问题存在于2.7.0 ~  2.7.4版本,2.7.5修复,zk注册中心不会报错,可能无法感知,但它确实存在,也会拖慢应用的关闭速度

  • 通过追查发现,其实该问题可以在注册中心的扩展中解决,让registry的destroy只能被调用一次

  • 遇到无论多小的问题,有空都去钻研下,你会收货一些新知识,比如这次dubbo中ShutdownHook如此巧妙的设计

以上就是如何排查Dubbo接口重复注销问题,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网html频道。

--结束END--

本文标题: 如何排查Dubbo接口重复注销问题

本文链接: https://lsjlt.com/news/81646.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何排查Dubbo接口重复注销问题
    本篇文章给大家分享的是有关如何排查Dubbo接口重复注销问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我在公司内负责自研的dubbo注册中...
    99+
    2024-04-02
  • linux中如何排查Java问题
    小编给大家分享一下linux中如何排查Java问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linux命令类tail最常用的tail -fgrepawk1 基...
    99+
    2023-06-16
  • maven依赖问题如何排查
    在排查Maven依赖问题时,可以尝试以下几个步骤:1. 检查pom.xml文件:首先检查项目的pom.xml文件,确保依赖项正确地被...
    99+
    2023-09-17
    maven
  • mongo慢查询问题如何排查处理
    这篇文章主要介绍了mongo慢查询问题如何排查处理的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mongo慢查询问题如何排查处理文章都会有所收获,下面我们一起来看看吧。一、简单介绍mongo语句查询条件中出现n...
    99+
    2023-06-29
  • 如何进行Flink Checkpoint问题排查
    这篇文章给大家介绍如何进行Flink Checkpoint问题排查,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在 Flink 中,状态可靠性保证由 Checkpoint 支持,当作业...
    99+
    2024-04-02
  • kubernetes k8s常用问题如何排查
    这篇文章主要介绍了kubernetes k8s常用问题如何排查的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇kubernetes k8s常用问题如何排查文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-02
  • mysqlimport如何排查导入报错问题
    这篇文章给大家分享的是有关mysqlimport如何排查导入报错问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 之前有个同事问我一个mysqli...
    99+
    2024-04-02
  • 如何排查Kubernetes机器内核问题
    本篇内容主要讲解“如何排查Kubernetes机器内核问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何排查Kubernetes机器内核问题”吧!具体现象在...
    99+
    2024-04-02
  • java内存溢出问题如何排查
    Java内存溢出问题的排查可以按照以下步骤进行:1. 观察错误信息:当Java发生内存溢出时,通常会抛出`java.lang.Out...
    99+
    2023-09-29
    java
  • linux异常关机问题如何排查
    要排查Linux异常关机问题,可以按照以下步骤进行:1. 检查系统日志:查看/var/log目录下的日志文件,特别是syslog和k...
    99+
    2023-08-31
    linux
  • Node.js子线程Crash问题如何排查
    这篇文章主要介绍“Node.js子线程Crash问题如何排查”,在日常操作中,相信很多人在Node.js子线程Crash问题如何排查问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node.js子线程Crash...
    99+
    2023-07-02
  • sql运行缓慢问题如何排查
    要排查SQL运行缓慢的问题,可以尝试以下几个步骤:1. 检查查询语句:确保查询语句写得正确且优化良好。可以对查询进行优化,例如使用合...
    99+
    2023-10-21
    sql
  • java线程卡死问题如何排查
    java线程卡死问题的排查可以遵循以下步骤:1. 查看线程堆栈:使用jstack命令或者在IDE中查看线程堆栈,定位到卡死的线程。查...
    99+
    2023-08-24
    java
  • Elasticsearch常用查询过滤接口与值得注意的问题
    Elasticsearch常用查询过滤接口与值得注意的问题 简介 本文将介绍一些ES查询过滤的接口和一些值得问题。 在ES中主要是查询,并且只有在bool查询中才有过滤上下文,当然聚合函数中也可能出现过滤上下文。 过滤不计算相关性评分,并且...
    99+
    2018-06-29
    Elasticsearch常用查询过滤接口与值得注意的问题
  • ASP 重定向接口和 Laravel 的冲突问题,如何解决?
    在开发 Web 应用程序时,经常需要使用重定向接口来实现页面跳转和请求转发。ASP 是一种非常常见的 Web 应用程序框架,而 Laravel 是一种基于 PHP 的现代化 Web 应用程序框架。然而,在使用 ASP 重定向接口和 Lar...
    99+
    2023-06-23
    重定向 接口 laravel
  • Java 接口重定向和 JavaScript:如何解决兼容性问题?
    在开发 Web 应用程序时,我们经常会面临各种兼容性问题。其中一个常见的问题是不同浏览器对 Java 接口重定向和 JavaScript 的支持程度不同。本文将探讨如何解决这些兼容性问题。 Java 接口重定向 Java 接口重定向是一种...
    99+
    2023-07-10
    接口 重定向 javascript
  • tomcat启动时卡住问题如何排查
    本篇内容主要讲解“tomcat启动时卡住问题如何排查”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“tomcat启动时卡住问题如何排查”吧!正常项目无法访问(Linux 服务器),启动tomcat...
    99+
    2023-07-05
  • java8toMap问题(key重复如何解决)
    目录java8 toMap(key重复解决)Collectors.toMap的key重复解决方案一解决方案二java8 toMap(key重复解决) 使用stream的toMap()...
    99+
    2024-04-02
  • 如何解决重复内容问题
    重复内容是SEO中常见的问题,它可能影响搜索引擎排名和网站信誉。解决重复内容问题主要包括:1、内容审查和识别、2、使用Canonical标签、3、301重定向、4、添加无索引元标签、5、优化内部链接结构、6、利用搜索引擎控制台工具。定期检查...
    99+
    2023-10-29
    如何解决 内容
  • PHP 接口日志同步,如何避免数据冲突和重复同步的问题?
    在现代软件开发中,接口是不可或缺的一部分。在 PHP 开发中,我们经常需要使用接口来实现不同系统之间的数据传输。但是,接口日志同步问题却是一个常见的挑战,因为它可能导致数据冲突和重复同步的问题。 在本文中,我们将讨论如何通过 PHP 接口...
    99+
    2023-10-11
    接口 日志 同步
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作