中仑网络全站 Dubbo 2 迁移 Dubbo 3 总结

中仑网络在 2022 年完成了服务框架从 Dubbo 2 到 Dubbo 3 的全站升级,深度使用了应用级服务发现、Kubernetes 原生服务部署、服务治理等核心能力。来自中仑网络的技术负责人来彬彬对整个 Dubbo 3 的选型、升级过程及收益等做了深入总结。

来彬彬,2020 年加入苏州中仑网络科技有限公司,担任架构部负责人/高级架构师,十四年架构开发经验。曾任职于苏宁易购七年参与商户平台、物流四方服务平台等架构设计,为用户提供亿级 SaaS 服务。现重点保障中台化实施、性能优化、业务架构、稳定性等,专注零售行业、互联网、云计算、架构设计。

值得一提的是近期 Dubbo 3 官网文档 整体有了本质的提升,并且社区承诺短期内文档还会投入大量精力完善文档,这点对于 Dubbo 3 的使用和用户信心提升非常重要。

公司业务与技术架构简介

苏州中仑网络科技有限公司是一家“专注零售门店增收服务”的公司,一直以“解决中小零售门店经营难的问题”为初心,致力于为零售商户提供门店运营一体化解决方案,帮助零售门店实现增收。中仑网络以零售技术为核心,为零售商户打造出集收银系统、中仑掌柜、微商城、汇邻生活平台、大数据平台、移动支付、智慧农贸、汇邻门店运营服务等为一体的新零售生态体系,实现线上线下全方位融合,为零售商家赋能增收。技术团队在构建之初选取 Dubbo 2.5.3+Zookeeper 版本构建公司微服务基座支撑公司业务发展,后期同阿里云深度合作整体迁移使用阿里云,使用云原生基础设施 ACK(Kubernetes)+MSE(Zookeeper)+Dubbo+PolarDB 等构建,实现可动态缩扩容的服务能力。

伴随合作商扩展 3000+,市场遍及 300+城市,零售商户 30 万+,服务覆盖餐饮、茶饮、服装、母婴、烘焙、生鲜、商超、美业、美妆、宠物等多个行业。伴随着领域拓宽、商户量快速增长上升,系统数量和部署节点也迎来了暴增,随之在系统可用性上受到较大挑战:微服务治理能力、微服务地址注册发现,Kubernetes 平台服务的无损上下线顺滑度上问题与挑战越来越多。架构图见图一。

图一

Dubbo 3 升级总结

在升级微服务组件技术选型上主要考虑解决以前的痛点:服务治理能力、云原生友好性、服务注册发现,这几个制约业务发展的紧要问题。比较下来 Dubbo 3 架构设计理念与我们较为契合,能较好的满足我们业务发展要求。

1、服务治理能力

Dubbo 3 提供丰富的服务治理能力,可实现诸如服务发现、负载均衡、流量调度等服务治理诉求。在使用上我们有两种选择:

  • 使用 Dubbo 管理控制台管理配置
  • 集成相关 API 能力到系统

同时 Dubbo 扩展性较好,可以在很多功能点(见图二)去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。

Dubbo SPI ( Service Provider Interface)将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。基于此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能,如我们在此基础上实现了基于生产和消费者过滤器 Filter 实现全链路自定义的链路监控;基于路由扩展标签路由方式进行测试环境的隔离方便快速多版本服务测试验证。实操上我们基于生产者注册服务时打标,如原系统 A V1 版本部署在 fat 环境上,现在为了测试 V2 版本,我们将 V2 版本打标 tag=fat-v2;使用端在消费时指定 Invocation Attachment 参数,inv.setAttachment(TAG_KEY, routeTag);基于此我们可以方便自测试,同时生产上我们也可以做简单的生产灰度运用。

图二

2、云原生友好性

Dubbo 在设计上遵循云原生微服务开发理念,微服务支持 Kubernetes 平台调度,实现服务生命周期与容器生命周期的对齐,包括 Dubbo 的启动、销毁、服务注册等生命周期事件。中仑网络微服务管理使用的是 MSE(Zookeeper),因而我们服务暴露使用需与之对齐。具体操作上我们自定义 Startup 启动探针、 Liveness 存活探针、Readiness 就绪探针。项目的正常切换需要保障无损的上下线,在实施中无损上线相对于下线来说会更麻烦点,项目的发布上线过程大体会遵从如下流程(大致分成三个阶段):

第一阶段升级少量(如 20% )的实例,并切换少量流量到新版本,完成这个阶段后先暂停升级。

经过人工确认之后继续第二个阶段,升级更大比例(如 90% )的实例和流量,再次暂停等待人工确认。

最后阶段将全量升级到新版本并验证完毕,从而完成整个发布过程。如果升级期间发现包括业务指标在内的任何异常,例如 CPU 或 memory 异常使用率升高或请求 500 日志过多等情况,可以快速回滚。

因为我们使用的是 MSE(Zookeeper)服务,Dubbo 服务自注册在应用启动过程暴露不受 Kubernetes 生命周期的控制,出现项目未完全就绪部分服务可被提前可被访问问题。

图三

实施处理上我们主要利用 Dubbo Qos 指令,初始使用服务不暴露,在应用就绪后调用 Qos online 指令进行服务上线替换老节点,每次替换的节点数量基于发布策略来制定;下线过程针对需下线节点我们会先使用 Qos 指令进行下线 offline 操作等待应用执行完服务,从而进行优雅停机,从实践的效果来看能满足我们的生产需求。

3、实例级别升级切换

相比于 2.x 版本中的基于接口粒度的服务发现机制,3.x 引入了全新的基于应用粒度的服务发现机制,进一步提升了 Dubbo 3 在大规模集群实践中的性能与稳定性。此次升级过程中我们也同步引入了配置中心与原数据中心,即将图四置灰部分启用:

图四

采用实例级别注册管理,一个应用 N 个服务,接口级时 N 服务需监听推送,应用级只关注单实例相关信息。同时引入元数据中心后极大降低接口配置数据信息,减少接口数据传输大小,相关职责配置也更加清晰。根据测试新模型大幅提高系统资源利用率,降低 Dubbo 地址的单机内存消耗,大幅降低注册中心集群的存储与推送压力,上线后稳定性有较大的提升。

总结与展望

在中仑网络 Dubbo 2 升级 Dubbo 3 的过程中我们也有过一些迟疑,如把接口级换成应用级还是混合注册;Dubbo 3.0 新特性新技术在项目中引入的时机与范围。对公司来说大的升级意味风险和不可预知的问题,但同时也能为之带来资源利用率提升、基础功能的扩展与增强,作为技术人员我们需要反复谨慎评估与论证。现在我们已经完成切换所有的业务领域。

作者:刘军

原文链接

本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

hdu3526(最小费用流)

Description Xiao A isbecoming more and more unsatisfied with his computer since he is learninghacker(黑客技术) technologiesthese days but his computer always fails whenever he changes the configurationsof the NIC. He buys a new NIC but the motherboard doe…

hdu3530Subsequence【单调队列优化dp】2010多校联合

Description There is asequence(顺序,序列) of integers.Your task is to find the longest subsequence(子序列) that satisfies the following condition: the differencebetween the maximum element and the minimum element of the subsequence is nosmaller…

基于 OpenYurt 和 EdgeX 的云边端协同新可能

2022 EdgeX 中国挑战赛暨中关村国际前沿科技创新大赛 EdgeX 专题赛正式拉开帷幕。本次大赛分设两大赛道:医疗、教育、消费行业赛道和能源、工业、供应链赛道。大赛致力于构建一个物联网及边缘计算的学习和分享平台,基于 EdgeX Foundry、OpenYurt 等开源技…

OSCAR 2022 开源产业大会PolarDB-X、 PolarDB-PG获奖揭晓

9月16日,OSCAR 2022 开源产业大会在京召开,会议由中国信息通信研究院、中国通信标准化协会主办,中国通信标准化协会云计算标准和开源推进委员会承办。此次会议以“千行百业 可信开源”为主题,邀请上百位专家大咖和国内主流的开源社…

C链表(顺序表、静态链表区别)

#include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 1000 //线性表存储空间的初始分配量 #define LISTINCRESEMENT 100 //线性表存储空间的分配增量 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int elemType;//元素类型…

HDU3534 给你一个树让你找出其中最长路径以及个数数

Description In the Datastructure class of HEU, the teacher asks one problem: How to find the longestpath(路径) of one treeand the number of such longest path? Input There are several test cases. The firstline of each case contains only one integer N, m…

国庆训练赛

Description Consider the following programming language. This language contains only two types of statements: simple statements and compound statements. The simple statement is in the form “write (literal)”, where “write” is a key word indicating that …

App 隐私合规“免费”自动化检测

一、为什么要进行App隐私合规检测 2021年11月1日《个人信息保护法》正式生效&#xff1b;今年6月14日&#xff0c;国家互联网信息办公室公布《移动互联网应用程序信息服务管理规定》&#xff0c;这是针对App的最强监管新规&#xff0c;于8月1日起正式实施。新规要求应用程序提…

POJ3420 Quad Tiling(模板+矩阵快速幂)

Quad Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4107 Accepted: 1878 Description Tired of(厌烦) the Tri Tiling gamefinally, Michael turns to(转向) a morechallengeable game, Quad Tiling: In how many ways can you tile(铺瓷砖) a 4 …

跨模态学习能力再升级,EasyNLP 电商文图检索效果刷新 SOTA

导读 多模态内容&#xff08;例如图像、文本、语音、视频等&#xff09;在互联网上的爆炸性增长推动了各种跨模态模型的研究与发展&#xff0c;支持了多种跨模态内容理解任务。在这些跨模态模型中&#xff0c;CLIP&#xff08;Contrastive Language-Image Pre-training&#x…

EasyNLP 带你实现中英文机器阅读理解

导读 机器阅读理解是自然语言处理&#xff08;NLP&#xff09;&#xff0c;特别是自然语言理解&#xff08;NLU&#xff09;领域最重要的研究方向之一。自1977年首次被提出以来&#xff0c;机器阅读理解已有近50年的发展史&#xff0c;历经“人工规则”、“传统机器学习”、“…

开关问题(模板+高斯消元)

开关问题Time Limit: 1000MS Memory Limit: 30000KTotal Submissions: 7771 Accepted: 3058 Description 有N个相同的开关&#xff0c;每个开关都与某些开关有着联系&#xff0c;每当你打开或者关闭某个开关的时候&#xff0c;其他的与此开关相关联的开关也会相应地发生变化&am…

一文剖析 PolarDB HTAP 的列存数据压缩

前言 数据库迁移上云是大数据时代的一大趋势&#xff0c;PolarDB MySQL是阿里云自研的云原生数据库&#xff0c;主要处理在线事务负载(OLTP, OnLine Transactional Processing)&#xff0c;深受企业用户的青睐。当下&#xff0c;数据分析对于企业的重要性越发显著&#xff1a;…

技术解读:现代化工具链在大规模 C++ 项目中的运用

编者按&#xff1a;C 语言与编译器一直都在持续演进&#xff0c;出现了许多令人振奋的新特性&#xff0c;同时还有许多新特性在孵化阶。除此之外&#xff0c;还有许多小更改以提高运行效率与编程效率。本文整理自全球 C 及系统软件技术大会上的精彩分享&#xff0c;接下来由作者…

扩展的欧几里得算法

任务&#xff1a; 求出A,B的最大公约数&#xff0c;且求出X&#xff0c;Y满足AXBYGCD(A,B). 模板代码&#xff1a; int extendGcd(int a,int b,int &x,int &y) {if(!b){x1;y0;return a;}else{int rextendGcd(b,a%b,y,x);y-x*(a/b);return r;} }

Stein算法(求两个数最大公约数)

欧几里德算法是计算两个数最大公约数的传统算法&#xff0c;他无论从理论还是从效率上都是很好的。但是他有一个致命的缺陷&#xff0c;这个缺陷只有在大素数时才会显现出来。 考虑现在的硬件平台&#xff0c;一般整数最多也就是64位&#xff0c;对于这样的整数&#xff0c;计…

如何将传统 Web 框架迁移部署到 Serverless 架构?

与其说 Serverless 架构是一个新的概念&#xff0c;不如说它是一种全新的思路&#xff0c;一种新的编程范式。 但是原生的 Serverless 开发框架却非常少。以Web框架为例&#xff0c;目前主流的Web框架“均不支持Serverless模式部署”&#xff0c;因此我们一方面要尝试接触Serv…

中国剩余问题(简介+详解)

中国剩余定理 我国古代数学名著《孙子算经》载有一道数学问题&#xff1a;“今有物不知其数&#xff0c;三三数之剩二&#xff0c;五五数之剩三&#xff0c;七七数之剩二。问物几何&#xff1f;”这里的几何指多少的意思。翻译成数学语言就是&#xff1a;求正整数N&#xff0c;…

EasyNLP 发布融合语言学和事实知识的中文预训练模型 CKBERT

导读 预训练语言模型在NLP的各个应用中都有及其广泛的应用&#xff1b;然而&#xff0c;经典的预训练语言模型&#xff08;例如BERT&#xff09;缺乏对知识的理解&#xff0c;例如知识图谱中的关系三元组。知识增强预训练模型使用外部知识&#xff08;知识图谱&#xff0c;字典…

中国剩余定理(模板+代码)

#include<stdio.h> #include <iostream> using namespace std; //扩展欧几里得算法 int exgcd(int a,int b,int &x,int &y) {int d;if(b0){x1;y0;return a;}dexgcd(b,a%b,y,x);y-a/b*x;return d; }//中国剩余定理 ,r[]存放余数 ,prime[]存放两两互质的数 i…