写在前面

如题,这是一个真实存在的业务场景。在微服务体系的迭代过程中,会存在注册中心的切换,典型如从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. Atcoder ABC216G 01Sequence 题解 [ 蓝 ] [ 差分约束 ]

    01Sequence:比较板的差分约束,但有一个很妙的转化. 朴素差分约束 设 \(x_i\) 表示第 \(i\) 位的前缀和. 我们要最小化 \(1\) 的个数,就要求最小解,就要求最长路.因为约束 ...

  2. JDK8到JDK17都升级了那些新特性?又有哪些能常用好用的?

    JDK8到JDK17都升级了那些新特性?又有哪些能常用好用的? 最近要做一个项目升级,因为之前的项目中有用到ElasticSearch 7.10.1版本,在之前的漏扫环节时会出现Tomcat渗透为问题 ...

  3. 永久解决VSCode终端中文乱码问题

    方法如下: 在VSCode中通过打开"文件"--"首选项"--"设置", 然后在"setting.json"中 添加以下 ...

  4. 普通人如何靠 AI 副业,1 个月实现月薪 3 万 +

    在物价飞涨.经济低迷的今天,仅靠死工资,却有着不固定的开销?房贷.车贷.孩子的教育费用-- 望着日益增长的开销,你是否也在夜深人静时,为钱包的羞涩而发愁?无数次幻想过拥有一份高收入的副业,却始终在迷茫 ...

  5. 记录一段mysql代码

    SELECT f . * , tmp.userid, tmp.cishu FROM fx_user f, ( SELECT a.id, b.userid AS userid, COUNT( * ) A ...

  6. 质数测试——Fermat素数测试和MillerRabin素数测试

    质数测试 今天我来填坑了,之前我在数学基础算法--质数篇这篇文章中提到我要单独讲一下MillerRabin算法,最近已经有许多粉丝在催了,所以我马不停蹄的来出这篇文章了,顺便把Fermat素数测试也讲 ...

  7. linux中如何判断一个rpm是手动安装还是通过yum安装的

    现状 对于一个不熟悉的服务器或者是虽然是自己的服务器,但历史比较久远,对于上面安装了的一些软件包,我们记忆都慢慢模糊了. 我今天遇到一个情况,在安装一个工具x2openEuler时,安装失败,提示依赖 ...

  8. mac 触控板 三指拖动

    1. 打开系统偏好设置 点击屏幕左上角的苹果图标(),选择"系统设置". 2. 打开指针控制 在系统偏好设置窗口左侧栏中,点击"辅助功能",然后在右侧列表中, ...

  9. 在Windows10中运行Unbuntu

    最近Windows 10 开始支持Ubuntu啦.而不是虚拟机,虚拟机太消耗资源啦. 评价还蛮高的,运行之后会出现跟Terminal 一模一样的终端,其实你已经在Linux的环境中啦. // 使用ro ...

  10. kubernetes 容器编排系统

    前言 docker解决了打包和隔离的问题,但是在docker集群中我们需要解决更多的问题,如调度(容器在哪运行).生命周期及健康状况(确保容器在无错的情况下运行).服务发现(容器所处位置,和容器通信) ...