最新要闻
- 环球快报:行走的救护员!凯迪拉克车主把AED放车上:还允许破窗使用
- 焦点!特斯拉自动辅助驾驶追尾事故车辆 前车车主当场被吓懵
- Win11 22H2又出新Bug:文件管理器随机“突然出现”
- 【独家焦点】动物也懂协同合作 两只雪豹一起偷鸡:一只踩点、一只放哨
- 天天播报:雷军:相信旗舰机会全部标配无线充电
- 快讯:上映仅半个月 《阿凡达2》拿下2022全球票房年度冠军:超越《壮志凌云2》
- 当前通讯!现货:抗原检测试剂盒3.9元/份(顺丰包邮)
- NVIDIA发布RTX视频超分辨率技术:看视频也有“DLSS”了
- 世界新资讯:时隔15年 Qi2无线充电标准官宣:基于苹果MagSafe打造 磁吸将降临安卓
- 世界讯息:电动车充电自燃一家4口不幸遇难 现场惨烈:网友感慨为何在家充电?
- 百事通!新势力年交付突破百万背后 谁得意 谁失意?
- 环球新消息丨安卓阵营绝无仅有!一加11屏幕体验最接近苹果iPhone ProMotion
- 全球焦点!售价或低于20万 特斯全新入门新车效果图曝光:颜值挺高
- 焦点要闻:祖传1200万像素要终结!曝苹果iPhone 15将配备4800万像素
- 滑雪不会刹车女生一路靠吼下坡 网友调侃练河东狮吼:医生科普受伤有多严重
- 环球新动态:一加11今天发!起步就是12GB+256GB 拒绝凑数卡价位
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
浅析 Dubbo 3.0 中接口级地址推送性能的优化
URL 简介
在阐述地址推送性能的具体优化之前,我们有必要先了解一下与之息息相关的内容 --- URL。
定义
在不谈及 dubbo 时,我们大多数人对 URL 这个概念并不会感到陌生。统一资源定位器 (RFC1738――Uniform Resource Locators (URL))应该是最广为人知的一个 RFC 规范,它的定义也非常简单。
(相关资料图)
因特网上的可用资源可以用简单字符串来表示,该文档就是描述了这种字符串的语法和语 义。而这些字符串则被称为:“统一资源定位器”(URL)
一个标准的 URL 格式至多可以包含如下的几个部分
protocol://username:password@host:port/path?key=value&key=value
一些典型 URL
http://www.facebook.com/friends?param1=value1¶m2=value2https://username:password@10.20.130.230:8080/list?version=1.0.0ftp://username:password@192.168.1.7:21/1/read.txt
当然,也有一些不太符合常规的 URL,也被归类到了 URL 之中
192.168.1.3:20880url protocol = null, url host = 192.168.1.3, port = 20880, url path = nullfile:///home/user1/router.js?type=scripturl protocol = file, url host = null, url path = home/user1/router.jsfile://home/user1/router.js?type=script
url protocol = file, url host = home, url path = user1/router.jsfile:///D:/1/router.js?type=scripturl protocol = file, url host = null, url path = D:/1/router.jsfile:/D:/1/router.js?type=script同上 file:///D:/1/router.js?type=script/home/user1/router.js?type=scripturl protocol = null, url host = null, url path = home/user1/router.jshome/user1/router.js?type=scripturl protocol = null, url host = home, url path = user1/router.js
Dubbo 中的 URL
在 dubbo 中,也使用了类似的 URL,主要用于在各个扩展点之间传递数据,组成此 URL 对象的具体参数如下:
protocol:一般是 dubbo 中的各种协议 如:dubbo thrift http zk
username/password:用户名/密码
host/port:主机/端口
path:接口名称
parameters:参数键值对
一些典型的 Dubbo URL
dubbo://192.168.1.6:20880/moe.cnkirito.sample.HelloService?timeout=3000描述一个 dubbo 协议的服务zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=demo-consumer&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=1214&qos.port=33333×tamp=1545721981946描述一个 zookeeper 注册中心consumer://30.5.120.217/org.apache.dubbo.demo.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.0.2&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=1209&qos.port=33333&side=consumer×tamp=1545721827784描述一个消费者
可以说,任意的一个领域中的一个实现都可以认为是一类 URL,dubbo 使用 URL 来统一描述了元数据,配置信息,贯穿在整个框架之中。
Dubbo 2.7
URL 结构
在 Dubbo 2.7 中,URL 的结构非常简单,一个类就涵盖了所有内容,如下图所示。
地址推送模型
接下来我们再来看看 Dubbo 2.7 中的地址推送模型方案,主要性能问题由下列过程引起。
上图中主要的流程为1、用户新增/删除DemoService的某个具体Provider实例(常见于扩容缩容、网络波动等原因)2、ZooKeeper将DemoService下所有实例推送给Consumer端3、Consumer端根据Zookeeper推送的数据重新全量生成URL根据该方案可以看出在Provider实例数量较小时,Consumer端的影响比较小,但当某个接口有大量Provider实例时,便会有大量不必要的URL创建过程。而Dubbo 3.0中则主要针对上述推送流程进行了一系列的优化,接下来我们便对其进行具体的讲解。
Dubbo 3.0
URL 结构
当然,地址推送模型的优化依然离不开 URL 的优化,下图是Dubbo 3.0中优化地址推送模型的过程中使用的新的URL结构。
根据上图我们可以看出,在 Dubbo 2.7 的 URL 中的几个重要属性在 Dubbo 3.0 中已经不存在了,取而代之的是 URLAddress 和 URLParam 两个类。原来的 parameters 属性被移动到了 URLParam 中的 params,其他的属性则移动到了 URLAddress 及其子类中。再来介绍 URL 新增的 3 个子类,其中 InstanceAddressURL 属于应用级接口地址,本篇章中不做介绍。而 ServiceConfigURL 及 ServiceAddressURL 主要的差别就是,ServiceConfigURL 是程序读取配置文件时生成的 URL。而 ServiceAddressURL 则是注册中心推送一些信息(如 providers)过来时生成的 URL。在这里我们顺便提一下为什么会有 DubboServiceAddressURL 这个子类,按照目前的结构来看,ServiceAddressURL 只有这一个子类,所以完全可以将他们两个的属性全都放到 ServiceAddressURL 中,那么为什么还要有这个子类呢?其实是 Dubbo 3.0 为了兼容 HSF 框架所设计的,抽象出了一个 ServiceAddressURL,而 HSF 框架则可以继承这个类,使用 HSFServiceAddressURL,当然,这个类目前没有体现出来,所以此处我们简单一提,不过多讲解。那么,我们接下来就讨论一下 Dubbo 3.0 为什么要改为此种数据结构,并且该结构和地址推送模型的优化有何关联性吧!
地址推送模型的优化
URL 结构上的优化
我们在上小节中的类图里看到虽然原来的属性都被移到了 URLAddress 和 URLParam 里,但是 URL 的子类依然多了几个属性,这几个属性自然也是为了优化而新增的,那么这里就讲讲这几个属性的作用。ServiceConfigURL:这个子类中新增了 attribute 这个属性,这个属性主要是针对 URLParam 的 params 做了冗余,仅仅只是将 value 的类型从 String 改为了 Object,减少了代码中每次获取 parameters 的格式转换消耗。ServiceAddressURL:这个子类及其对应的其他子类中则新增了 overrideURL 和 consumerURL 属性。其中 consumerURL 是针对 consumer 端的配置信息,overrideURL 则是在 Dubbo Admin 上进行动态配置时写入的值,当我们调用 URL 的 getParameter() 方法时,优先级为 overrideURL > consumerURL > urlParam
。在 Dubbo 2.7 时,动态配置属性会替换 URL 中的属性,及当你有大量 URL 时消耗也是不可忽视的,而此处的 overrideURL 则避免了这种消耗,因为所有 URL 都会共同使用同一个对象。
多级缓存
缓存是 Dubbo 3.0 在 URL 上做的优化的重点,同时这部分也是直接针对地址推送模型所做的优化,那么接下来我们就开始来介绍一下多级缓存的具体实现。首先,多级缓存主要体现在 CacheableFailbackRegistry 这个类之中,它直接继承于 FailbackRegistry,以 Zookeeper 为例,我们看看 Dubbo 2.7 和 Dubbo 3.0 继承结构的区别。
可以看到在 CacheableFailbackRegistry 缓存中,我们新增了 3 个缓存属性 stringAddress
,stringParam
和 stringUrls
。我们通过下图来描述这 3 个缓存的具体使用场景。
在该方案下,我们使用了 3 个纬度的缓存数据(URL 字符串缓存、URL 地址缓存、URL 参数缓存),这样一来,在大部分情况下都能有效利用到缓存中的数据,减少了 Zookeeper 重复通知的消耗。
延迟通知
除了上面提到的优化之外,其实另外还有两个小小的优化。第一个是解析 URL 时可以直接使用编码后的 URL 字符串字节进行解析,而在 Dubbo 2.7 中,所有编码后的 URL 字符串都需要经过解码才可以正常解析为 URL 对象。该方式也直接减少了 URL 解码过程的开销。第二个则是 URL 变更后的通知机制增加了延迟,下图以Zookeeper为例讲解了实现细节。
在该方案中,当 Consumer 接收 Zookeeper 的变更通知后会主动休眠一段时间,而这段时间内的变更在休眠结束后只会保留最后一次变更,Consumer 便会使用最后一次变更来进行监听实例的更新,以此方法来减少大量 URL 的创建开销。
字符串重用
在旧版本实现中,不同的 URL 中属性相同的字符串会存储在堆内不同的地址中,如 protocol、path 等,当有大量 provider 的情况下,Consumer 端的堆内会存在大量的重复字符串,导致内存利用率低下,所以此处提供了另一个优化方式,即字符串重用。而它的实现方式也非常的简单,让我们来看看对应的代码片段。
public class URLItemCache { private static final Map PATH_CACHE = new LRUCache<>(10000); private static final Map PROTOCOL_CACHE = new ConcurrentHashMap<>(); // 省略无关代码片段 public static String checkProtocol(String _protocol) { if (_protocol == null) { return _protocol; } String cachedProtocol = PROTOCOL_CACHE.putIfAbsent(_protocol, _protocol); if (cachedProtocol != null) { return cachedProtocol; } return _protocol; } public static String checkPath(String _path) { if (_path == null) { return _path; } String cachedPath = PATH_CACHE.putIfAbsent(_path, _path); if (cachedPath != null) { return cachedPath; } return _path; }}
由如上代码片段可以得知,字符串重用即为简单地使用了 Map 来存储对应的缓存值,当你使用了相同的字符串时,便会从 Map 中获取早已存在的对象返回给调用方,由此便可以减少堆内存中重复的字符串数以达到优化的效果。
优化结果
这里优化结果我引用了《Dubbo 3.0 前瞻:服务发现支持百万集群,带来可伸缩微服务架构》这篇文章中的两副图来说明,下图模拟了在220万个 Provider 接口的情况下,接口数据不断变更导致的 Consumer 端的消耗,我们看到整个 Consumer 端几乎被 Full GC 占满了,严重影响了性能。
那么我们再来看看 Dubbo 3.0 中对 URL 进行优化后同一个环境下的压测结果,如下图所示。
我们明显可以看到 Full GC 的频率减少到了只有 3 次,大大提升了性能。当然,该文章中还有其他方面的对比,此处便不一一引用了,感兴趣的读者可以自行去阅读该文章。
欢迎在 https://github.com/apache/dubbo 给 Dubbo Star。搜索关注官方微信公众号:Apache Dubbo,了解更多业界最新动态,掌握大厂面试必备 Dubbo 技能
浅析 Dubbo 3.0 中接口级地址推送性能的优化
环球快报:行走的救护员!凯迪拉克车主把AED放车上:还允许破窗使用
焦点!特斯拉自动辅助驾驶追尾事故车辆 前车车主当场被吓懵
Win11 22H2又出新Bug:文件管理器随机“突然出现”
【独家焦点】动物也懂协同合作 两只雪豹一起偷鸡:一只踩点、一只放哨
天天播报:雷军:相信旗舰机会全部标配无线充电
环球快资讯:实战Flink sql语法改造
快讯:上映仅半个月 《阿凡达2》拿下2022全球票房年度冠军:超越《壮志凌云2》
当前通讯!现货:抗原检测试剂盒3.9元/份(顺丰包邮)
NVIDIA发布RTX视频超分辨率技术:看视频也有“DLSS”了
世界新资讯:时隔15年 Qi2无线充电标准官宣:基于苹果MagSafe打造 磁吸将降临安卓
面试官:Docker 有几种网络模式?5 年工作经验都表示答不上来。。
梦想云图Node.JS服务 (网页CAD,在线CAD )
每日看点!upload-lab靶场
世界讯息:电动车充电自燃一家4口不幸遇难 现场惨烈:网友感慨为何在家充电?
百事通!新势力年交付突破百万背后 谁得意 谁失意?
环球新消息丨安卓阵营绝无仅有!一加11屏幕体验最接近苹果iPhone ProMotion
全球焦点!售价或低于20万 特斯全新入门新车效果图曝光:颜值挺高
焦点要闻:祖传1200万像素要终结!曝苹果iPhone 15将配备4800万像素
滑雪不会刹车女生一路靠吼下坡 网友调侃练河东狮吼:医生科普受伤有多严重
环球新动态:一加11今天发!起步就是12GB+256GB 拒绝凑数卡价位
PC主机消失不可避免:备胎随时上位
快看点丨华硕ROG发布首款四频Wi-Fi 7八爪鱼游戏路由:25Gbps、三万兆网口
天天实时:太突然!国产饮料巨头宣布破产:一代名饮国产可乐退场网友唏嘘
焦点播报:增程车是必然被淘汰的技术 谁买坑谁?理想、华为反驳
世界通讯!Spring IOC官方文档学习笔记(六)之自定义bean的特性
数据结构作业(三):直接插入排序 和 归并排序
当前信息:就因为一张朋友圈截图 全国的蒙脱石散都卖光了
只需钻入地下几千米 就有无穷能源!为啥没人干呢?
3000万用户数据泄露:这一次 我们的推荐翻车了
环球热消息:奇闻:为了保护疫苗 200多年前 竟然用孤儿活体运输
全球看热讯:VR:新一代年轻人的鸽王终结者
【前端调试】- 更好的调试方式 VSCode Debugger
世界观点:Python转义字符理解
全球微头条丨大疆官宣手持稳定器新品:RS 3 mini来了
消息!银白装甲!华硕ROG STRIX B760-G GAMING WIFI D4小吹雪主板图赏
微星发布全新B760系列主板:共四款 ITX刀锋小板来了
要闻速递:情侣在酒店电视机拆出针孔摄像头 已发出十几个TB的视频
[Computer Networks]一个http请求的完成的全过程
热消息:不愧最强AM5主板!技嘉X670E AORUS XTREME游戏测试:独门绝技降低内存延迟、提升带宽
Typora-博客园
头条焦点:使用SIPp进行压力测试
观焦点:【插入排序】详细讲解
每日热议!长城山海炮劲敌:国产福特中型皮卡Ranger谍照曝光
天天亮点!情何以堪:男性美甲风暴正席卷全球
今日热搜:荣耀声纹新专利公布:戴口罩依旧能让设备“听懂”
【世界播资讯】三星新款Flex Hybrid OLED屏幕曝光:折叠滑动二合一
【环球速看料】首架国产自主宽带卫星空地互联飞机试飞成功:下载200Mbps
全球观焦点:[概率论与数理统计]笔记:
全球今日报丨美国液化天然气出口量急速飙升:已与卡塔尔并列世界第一
新消息丨2022年中国铁路发送旅客16.1亿人次 全国1、2、3小时高铁出行圈加速形成
即将备战新主机!《塞尔达传说:王国之泪》或是Switch最后第一方大作
天天看点:一年发射61次火箭 马斯克的SpaceX公司更值钱了
最新资讯:AIRIOT答疑第4期|如何使用数据分析引擎?
环球视点!喜讯 | 热烈祝贺方正璞华入选苏州工业园区总部企业服务机构库
环球快讯:大巴司机开车不踩刹车漂移下山 乘客吓坏:我要下车
【天天热闻】OPPO推ColorOS for Pad全新控制中心:多设备管理一站式完成
世界热门:超标电动自行车过渡期能否延期?一地官方回应了
泥潭翻身 AMD x86市场份额逼近40%:重回19年前
全球观速讯丨小米品牌安全“贴心”分享案例:违法翻新倒卖小米电视后果很严重
滚动:记录--短视频滑动播放在 H5 下的实现
[概率论与数理统计]笔记:1.5 事件的独立性
【全球独家】13代酷睿/Zen4都靠边!AMD神U锐龙7 5800X3D卖爆 销量冠军不买能行?
微头条丨中国空间站拍2023年第一缕阳光!如此美景 一天能看16次
当前动态:2023上班第一天:女孩开工前后5分钟“变脸” 网友直呼“这不就是我自己”
90年后归来!方正宣布推出汉文正楷电脑字库:用时6年大量优化
男子买下废弃学校翻新成住宅 每年可收368万租金
【播资讯】2. 向线程函数传递参数
浅谈研发实践的技术债与效能提升
前沿资讯!2022年全国电影总票房超300亿!《长津湖之水门桥》夺冠
接盘暴雪玩家 网易《无尽战区》下周重新开服:首发上线29位英雄
240W超级闪充要来!realme暗示新机充满电不到10分钟
为庆祝传统新年 阿根廷民众烧梅西雕像:当地习俗、已延续66年
当前时讯:Apple Watch Ultra一周上手:不适合普通用户
当前报道:Linux的串口非标准波特率设置更改
最新消息:Go语言实现包的初始化控制器与流程控制器
世界速递!如何站在开发者的角度理解框架的设计思想?
每日热门:文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具
全球微资讯!python 中os和sys模块常用方法
与网易和好基无可能 魔兽关服倒计时:暴雪代理谈判进入第二阶段
120Hz自适应刷新0延迟:一加11成屏幕流畅体验天花板
环球速读:五月天版权回归网易云音乐 网友:糟糕的心情好了些
每日消息!俞敏洪给自己2022年打8分:没有欠员工一分钱工资
动态:4599元 雷军分享Redmi K60冠军版特写照:和跑车一样精致
世界视讯!什么是 A/B 实验,为什么要开 A/B 实验?
环球热文:IT 技术工作详解 -小马说工作
每日热文:SweetAlert让消息弹出窗口更加具有个性化!
Redmi K60素皮版本质感堪比手工!雷军:值得你细品
环球看热讯:健康速食!西安饭庄油泼biangbiang面大促:每盒6.66元
今日热门!罗永浩怎么看?西门子回应洗衣机10年包修为保证能修 洋品牌赤裸裸坑国人
Intel Unison正式上线:实现PC与安卓/iOS手机无缝连接
当前消息!你最想看哪个?2023春节档已官宣五部电影 《满江红》比拼《流浪地球2》
每日快看:建筑软件解决方案丨Bluebeam简介
头条:2022 倒带 - NutUI
环球简讯:面试官:为什么 wait/notify 必须与 synchronized 一起使用??
环球微头条丨销量甩Intel+Zen4全家!AMD神U锐龙7 5800X3D卖成年度处理器销冠
全球速递!等了7年!《大圣归来》导演新作《深海》定档 要做国漫里程碑、视觉突破极限
每日速看!10多万买“大路虎” 奇瑞旗舰SUV瑞虎9官图发布:霸气
全球要闻:最贵748元!苹果全系电池涨价 3月1日开始:非针对国人 成本增加所致
【焦点热闻】行驶中天窗可能会掉 奔驰再次召回超12万辆汽车