dubbo3 遇坑小结

news2024/10/7 4:36:52

 最近给一个dubbo3的应用改名字,发现消费者还是会请求以前的地址。

问题现象

 应用部署是k8s容器环境,dubbo版本是3.1.1,应用appA名字改成appB。改完名发现消费者应用appC请求还是会往以前的地址请求(当然是请求不通的)

问题分析

分析日志

 dubbo3的服务发现是应用级的,影响消费者的调用关系就两点:接口应用映射(zk节点:/dubbo/mapping)以及应用实例(zk节点:/services)。所以主要就是看这两个地方的日志,分析zk有没有正确下发信息。
首先,新应用appB启动后,消费者appC收到如下日志:
在这里插入图片描述
appC收到了mapping的变更消息。
 mapping变更主动拉取新应用的实例,触发实例变更信息:
在这里插入图片描述
上述两块日志均符合预期。接口有新的应用提供,下发MappingChangedEvent事件。mapping事件处理过程中将拉取新应用实例触发ServiceInstancesChangedEvent事件。

疑点显现

除了上述日志,还有以下日志:
在这里插入图片描述
顺着这个日志走查代码,原来dubbo3再收到新的mapping事件时创建新的ServiceInstancesChangedListener。老的ServiceInstancesChangedListener就会destroy。理论上也合理,挺正常。
不过,继续看代码发现销毁监听器时执行org.apache.dubbo.registry.client.ServiceDiscovery#removeServiceInstancesChangedListener,dubbo3.1.1版本实现如下:

public void removeServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws IllegalArgumentException {
        listener.getServiceNames().forEach(serviceName -> {
            ZookeeperServiceDiscoveryChangeWatcher watcher = watcherCaches.remove(buildServicePath(serviceName));
            if (watcher != null) {
                watcher.stopWatching();
            }
        });
    }

这里停止监听应用对应的路径/services/appA。虽然新的mapping包括appA,appB,会重新监听/services/appA,但是这里有可能出现谁先执行谁后执行的情况。可能导致后续appA下线时消费者无法感知。这样也就出现老的引用(invokers)始终还在。一旦机器重新被其他应用拉起,dubbo端口重新建立链接,就可能发请求过去。

如何解决

实际上就是删除zk节点监听路径时没有判断该节点是不是还有其他的ServiceInstanceChangedListener在监听。我们看到dubbo3.2.5已经做了这样的处理

public void removeServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws IllegalArgumentException {
        if (!instanceListeners.remove(listener)) {
            return;
        }
        listener.getServiceNames().forEach(serviceName -> {
            ZookeeperServiceDiscoveryChangeWatcher watcher = watcherCaches.get(serviceName);
            if (watcher != null) {
                watcher.getListeners().remove(listener);
                //笔者注:判断是否有其他监听器还在监听
                if (watcher.getListeners().isEmpty()) {
                    watcherCaches.remove(serviceName);
                    try {
                        watcher.getCacheInstance().close();
                    } catch (IOException e) {
                        logger.error(REGISTRY_ZOOKEEPER_EXCEPTION, "curator stop watch failed", "",
                                "Curator Stop service discovery watch failed. Service Name: " + serviceName);
                    }
                }
            }
        });
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1015242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法|Day52 单调栈3

LeetCode 84.柱状图中最大的矩形 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目描述:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状…

【LeetCode-简单题 KMP匹配算法】28. 找出字符串中第一个匹配项的下标

文章目录 题目方法一:常规做法 一次一次截取再做比较方法二:KMP匹配算法 题目 方法一:常规做法 一次一次截取再做比较 class Solution {public int strStr(String haystack, String needle) {int haylen haystack.length();int neelen need…

【二叉树】的顺序存储(堆的实现)

📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

【学习笔记】各类基于决策单调性的dp优化

文章目录 对于决策单调性的一般解释关于决策单调性的证明四边形不等式一维dp区间dp一种二维dp一些满足四边形不等式的函数类 与图形相结合 决策单调性的常见优化手段二分队列二分栈分治类莫队做法 SMAWKWQS二分WQS多解情况满足四边形不等式的序列划分问题的答案凸性以及WQS二分…

老挝市场最全开发攻略

本文目录: 1.老挝国家概况 2.老挝节日与禁忌 3.老挝贸易现状与特点 4.老挝热销品类 5.老挝开发渠道 6.老挝注意事项 7.老挝国家冷知识 一、老挝国家概况 老挝人民民主共和国(The Lao People’s Democratic Republic),简称…

基于python求两个数最大公约数函数gcd

一、gcd函数 在Python中,可以使用math模块中的gcd()函数来求两个数的最大公约数。首先需要导入math模块,然后使用gcd()函数来计算最大公约数。 二、示例 以下是使用Python求两个数最大公约数的示例代码: import math # 定义两个数 a 36 …

20230916后台面经整理

1.面对抢优惠券这样的高负载场景,你从架构、负载均衡等方面说一下你的设计? 答了参考Nginx进行负载均衡,然后在每台服务器怎么怎么弄(架构每一层怎么设计) 参考https://toutiao.io/posts/6z3uu2m/preview,h…

go 1.18新特性(泛性 模糊测试 WorkSpace)

文章目录 泛型interface的功能扩展泛型使用 模糊测试模糊测试的使用模糊测试的缺点 Go WorkSpace 泛型 interface的功能扩展 在1.18之前,官方对interface的定义是方法的集合,可以存储实现该方法的任意类型。1.18对interface的定义改为类型集合。接口类…

前端实现打字效果

前端实现打字效果 不带光标 只一次播放 HTML <!-- 需要在初始化的时候不显示文字 --> <div id"typing"></div>CSS #typing {position: relative;font-size: 24px;font-family: Arial, sans-serif;padding: 10px; }JS const text "要显…

CocosCreator3.8研究笔记(十八)CocosCreator UI组件(二)

前面的文章已经介绍了Canvas 组件、UITransform 组件、Widget 组件 。 想了解的朋友&#xff0c;请查看 CocosCreator3.8研究笔记&#xff08;十七&#xff09;CocosCreator UI组件&#xff08;一&#xff09;。 今天我们主要介绍CocosCreator 常用容器组件&#xff1a;Layout …

JavaScript-Ajax-axios-Xhr

JS的异步请求 主要有xhr xmlHttpRequest 以及axios 下面给出代码以及详细用法&#xff0c;都写在了注释里 直接拿去用即可 测试中默认的密码为123456 账号admin 其他一律返回登录失败 代码实例 <!DOCTYPE html> <html lang"en"> <head><…

预编译为什么能防止SQL注入?一看你就明白了。预编译原理详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 预编译防止SQL注入 1、SQL执行过程2、预编译原理3、…

爬虫框架Scrapy学习笔记-1

前言 在现代互联网时代&#xff0c;网页数据获取和处理已经成为了重要的技能之一。无论是为了获取信息、做市场研究&#xff0c;还是进行数据分析&#xff0c;掌握网页爬取和数据处理技术都是非常有用的。本文将介绍从网页加载到数据存储的完整过程&#xff0c;包括网络请求、…

银河麒麟操作系统安装人大金仓数据库--九五小庞

一、环境要求 硬件&#xff1a;内存512M以上&#xff0c;磁盘空间10G以上软件&#xff1a;主流Linux操作系统&#xff0c;本机使用kylin-v10安装包准备&#xff1a;官网下载数据库文件镜像以及授权文件 https://www.kingbase.com.cn/rjcxxz/index.htm 二、配置内核参数 vim /e…

Windows11 环境安装Gradle

Gradle和maven对比 maven 经典好用&#xff0c;约定大于配置的方式&#xff0c;使其上手简单&#xff0c;但灵活性稍差。 使用xml配置方式管理依赖&#xff0c;看起来稍丑。 在大型项目上&#xff0c;每次编译都要重新执行所有步骤会导致耗时很长。 Gradle 更加现代的构建工具…

高阶数据结构(2)-----红黑树(未完成)

一)红黑树的基本概念和基本性质: 1)红黑树就是一种高度平衡的二叉搜索树&#xff0c;但是在每一个节点上面都增加了一个存储位来表示结点的颜色&#xff0c;可以是红色或者是黑色&#xff0c;通过对任何一条从根节点到叶子节点上面的路径各个节点着色方式的限制&#xff0c;红黑…

【LeetCode热题100】--283.移动零

283.移动零 使用双指针&#xff1a; class Solution {public void moveZeroes(int[] nums) {if(nums null){return ;}int j 0;for(int i 0;i<nums.length;i){//当前元素不为0时&#xff0c;就把其交换到左边&#xff0c;等于0的交换到右边if(nums[i] ! 0){int tmp nums…

在华为云服务器上安装单机版Redis

https://redis.io/是官网地址。 点击右上角的Download。 可以进入https://redis.io/download/——Redis官网下载最新版的网址。 然后在https://redis.io/download/页面往下拉&#xff0c;点击下图超链接这里。 进入https://download.redis.io/releases/下载自己需要的安装包…

4795-2023 船用舱底水处理装置 学习记录

声明 本文是学习GB-T 4795-2023 船用舱底水处理装置. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了船用舱底水处理装置(以下简称处理装置)中舱底水分离器(以下简称分离器)和舱底 水报警装置(以下简称报警装置)的要求、试验方法…

mysql 注入之权限

SQL注入之高权限注入 在数据库中区分有数据库系统用户与数据库普通用户,二者的划分主要体现在对一些高级函数与资源表的访问权限上。直白一些就是高权限系统用户拥有整个数据库的操作权限,而普通用户只拥有部分已配置的权限。 网站在创建的时候会调用数据库链接,会区分系统用…