写在前面

如题,这是一个真实存在的业务场景。在微服务体系的迭代过程中,会存在注册中心的切换,典型如从zookeeper迁移到nacos。
最近面试中,经常会用该场景来考察候选人(涉及RPC、分布式、场景也足够开放),结果能完整描述出来的人寥寥无几,于是整理一篇文章分享下。

遇到这类场景应该如何思考

首先要先弄清楚这道题要考的是什么?捋清楚思路。可以从几个角度来思考:
  1. 搞清楚Dubbo是什么。它是RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题。大部分人都能答出来。
  2. 搞清楚RPC是什么,以及它的核心框架是怎样的。应熟练掌握其核心的架构(如下图,甚至都没把心跳机制画出来),绝大多数人也能答上来。
接下来才是考虑注册中心的迁移。可重点从业务角度考虑:
  • 迁移过程中是否可以停机?也即服务的可用性要求是怎样的。
  • 服务体量有多大?比如提供者和服务消费者的数量分别有多少,是否需要分批迁移。
  • 是否有第三方服务依赖?若有,第三方是否可以支持新的注册中心,若不能,应该怎么办?
以上疑问,最好在回答前先确认清楚,因为在不同的业务背景下,技术方案的设计可能大相径庭。实际面试过程中发现大家很容易忽略这一点,尤其要注意。
另外,如果能够考虑到更细节的技术问题,比如“新旧注册中心支持的协议是否一致、元数据格式是否一致、新注册中心的容量是否充足、如何做监控维护”等问题,则会更加亮眼。

从业务角度谈谈如何迁移

如果迁移过程中允许停机,而且服务体量比较小,可以考虑“一把梭”,直接在停机期间把所有服务提供者和消费者的注册中心改为新的,比如游戏行业中经常遇到的停机维护。多提一句,现在游戏行业的复杂度基本转移到了客户端,服务端的架构往往比较简单,常见的“分区”等策略都是为了降低架构的复杂度。
但如果不允许停机,并且服务体量比较大,那就要考虑平滑迁移的方案了,互联网行业基本都是这一类。常用也稳妥的方案其实很简单,就4个步骤(建议先思考一下,再看答案):
 
1. 双注册(服务提供者同时注册到新旧注册中心):
 
2. 双消费(服务消费者同时拉取新旧注册中心的服务提供者元数据,做负载均衡调用,常用RoundRobin轮询策略):
 
3. 单消费(服务消费者不再连接旧注册中心,仅从新注册中心获取服务提供者元数据,并加以调用)
 
4. 单注册(服务提供者不再向旧注册中心注册服务。在做这一步前,必须确保旧注册中心中的服务消费者都不存在了)
 
通过这种方式,便可以在服务可用性不受影响的前提下切换注册中心(也就是平滑迁移),是不是很简单?
还有很多其他的方案,比如nacos-sync方案,其实本质也是类似的,不同的地方在于新旧注册中心本身做了元信息的同步,业务操作的负担更小些,这种方式在基础建设成熟的互联网企业中更为常用。
最后,如果还有第三方服务依赖,且对方的服务提供者不支持新注册中心,那么这个第三方服务要继续使用旧的注册中心(其他我们可以控制的服务,使用新的注册中心),一般会在大型公司中出现,这种情况下要考虑跨团队的协作和推动了。

扩展信息

Dubbo服务的多注册中心配置方式,可以参见https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/registry/multiple-registry/:

后记

好的架构一般都是简单的,大家遇到问题千万不要想得太复杂。如果一下子看不明白,就顺着最为本质的原理一步步捋,最终会豁然开朗,发现“不过如此”而已。

Dubbo实战:四步实现注册中心平滑迁移原创的更多相关文章

  1. 说一下Dubbo 的工作原理?注册中心挂了可以继续通信吗?

    面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ.ES.Redis.Dubbo,上来先问你一些思考性的问题.原理,比如 kaf ...

  2. 1.说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程?

    作者:中华石杉 面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ.ES.Redis.Dubbo,上来先问你一些思考性的问题.原 ...

  3. DUBBO高级配置:多注册中心配置

    有时候我们需要的服务不在同一个 zookeeper 注册中心上,此时我们需要在 DUBBO 配置文件中配置多个注册中心. 下面我们在之前创建项目的基础上在 provider 模块中增加一个 IBook ...

  4. 说一下的dubbo的工作原理?注册中心挂了可以继续通信吗?

    (1)dubbo工作原理 第一层:service层,接口层,给服务提供者和消费者来实现的 第二层:config层,配置层,主要是对dubbo进行各种配置的 第三层:proxy层,服务代理层,透明生成客 ...

  5. Dubbo源代码实现三:注册中心Registry

    我们知道,对于服务治理框架来说,服务通信(RPC)和服务管理两部分必不可少,而服务管理又分为服务注册.服务发现和服务人工介入,我们来看看Dubbo框架的结构图(来源网络): 图中可以看出,服务提供者P ...

  6. dubbo服务治理中间件,zookeeper注册中心

    对传统项目架构进行拆分: 集群概念: 面向服务分布式架构: 服务层提供被注册的对象需要实现序列化接口Serializable: 配置表现层和服务层: 依赖包: 服务层: <!-- 定义dubbo ...

  7. dubbo服务治理中间件,zookeeper注册中心 安装配置

    对传统项目架构进行拆分: 集群概念: 面向服务分布式架构: 服务层提供被注册的对象需要实现序列化接口Serializable: 配置表现层和服务层: 依赖包: 服务层: <!-- 定义dubbo ...

  8. dubbo学习(五)注册中心zookeeper

    初识zookeeper 下载地址:https://archive.apache.org/dist/zookeeper/ 详细的ZooKeeper教程戳这里~ PS: 建议目前选择3.4的稳定版本进行使 ...

  9. Dubbo注册中心的四种配置方式详解

    Dubbo目前支持4种注册中心,(multicast,zookeeper,redis,simple) 推荐使用Zookeeper注册中心. 一.Multicast注册中心 不需要启动任何中心节点,只要 ...

  10. 如果有人问你 Dubbo 中注册中心工作原理,就把这篇文章给他

    注册中心作用 开篇首先想思考一个问题,没有注册中心 Dubbo 还能玩下去吗? 当然可以,只要知道服务提供者地址相关信息,消费者配置之后就可以调用.如果只有几个服务,这么玩当然没问题.但是生产服务动辄 ...

随机推荐

  1. .NET周刊【1月第4期 2025-01-26】

    国内文章 低成本高可用方案!Linux系统下SQL Server数据库镜像配置全流程详解 https://www.cnblogs.com/lyhabc/p/18660810/linux-sql-ser ...

  2. linux mint安装kafka,及flume与kafka整合

    需要软件 jdk1.8(jdk-8u131-linux-x64.rpm) zookeeper (zookeeper-3.4.10.tar.gz) kafka 2.11-2.0.0 flume1.8.0 ...

  3. Iceberg v2表写入和微批治理冲突,如何保证治理准确性

    一.背景 微批治理任务分多个job治理一张表,还有一个Flink程序每5分钟一次写入iceberg表,如治理任务划分了20个job治理一张表,在治理期间存在新的数据更新,如何保证治理准确性 二.治理时 ...

  4. DeepSeek-R1满血版性能飙升四倍,成本大降,竟是因为……

    近日,天翼云DeepSeek模型推理技术迎来重大升级!该技术不仅支撑DeepSeek-R1满血版模型实现性能的四倍提升,更将大规模部署模型的成本降至原来的25%以下,为AI应用落地铺就更为宽广的道路. ...

  5. 牛客题解 | 单组_spj判断数组之和

    题目 题目链接 解题思路 后台有spj代码,能对同学们的输出数据进行校验,符合条件即可通过. 附赠 spj 代码 #include <iostream> #include <fstr ...

  6. 当openlayers的地图所在的div的尺寸发生变化后,鼠标滚轮缩放地图发生偏移问题以及地图变形问题解决

    当地图的尺寸发生变化后,要调用map.updateSize()方法,强制使openlayers重新计算地图视口 updateSize() Force a recalculation of the ma ...

  7. 001.GItLab介绍及云原生部署

    目录 gitlab介绍 gitlab cicd简介 gitlab特点 git主要目录 版本区别 gitlab部署 Omnibus 部署 部署需求 安装依赖 导入软件源 正式安装 准备证书 配置SSL及 ...

  8. @autowired注解报错原因及解决办法

    @autowired 注入dao层的时候,标红报错,但不影响编译使用 按照严格的spring注解方式在dao层加入@Repository注解

  9. 「六」Goaccess实现可视化

    下载 apt install goaccess 使用goaccess进行监控 LANG="en_US.UTF-8" bash -c 'goaccess logs/access.lo ...

  10. 应急响应靶场之vulntarget-n

    vulntarget-n 用户名密码:root/Vulntarget@123 一.分析history命令 1.先将历史命令导出 history > 1.txt 2.分析history 1)篡改网 ...