记一次dubbo zk集群平滑迁移的操作方案,也可以用户dubbo双注册中心的实现方案。
准备
- zk 服务器版本:3.4.6
- dubbo 版本:2.7.3
- dubbo-spring-boot-starter 版本:2.7.3
技术方案
- 运维同学搭建好新的zk集群,保证高可用
- dubbo 服务提供者通过双注册中心的方式,将服务注册到new,old 两套集群上
- dubbo 消费者 通过配置双注册中心的方式,同时消费两个注册中心的服务
- 步骤2,步骤3可以同时进行,直到全部服务平滑注册到双注册中心
- 等全部到双中心后(需要运维同学确认),再次更改消费者配置,改为new 注册中心
- 关于即是生产者,又是消费者的项目,有两种方案:
- 等依赖上游切换后再切换,或者最后切换
- 差异化配置,消费者单注册中心,生产者双注册中心
- 消费者全部切换到新的zk 集群后,生产者逐步全部改为新的zk集群
- 关闭下线old zk 集群
关键配置
pom 依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
<exclusions>
<exclusion>
<artifactId>zookeeper</artifactId>
<groupId>org.apache.zookeeper</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
dubbo配置:
dubbo:
application:
name: zk-move-test
consumer:
registries:
- id: oldzk
protocol: zookeeper
address: 127.0.0.1:2181(此处随意配)
- id: newzk
protocol: zookeeper
address: 127.1.1.1:2181,127.2.2.2:2181(此处随意配)
然后就能正常启动了,通过日志,会发现正常注册了两个zk中心,并且zk上也能发现注册的服务。
技术验证点
- 某服务注册到old中心,new 中心没有,消费者双注册中心是否能发现?答:可以
- 某服务注册到new 中心,old中心没有,消费者双注册中心是否能发现?答:可以
- 某服务双注册中心,然后下线某注册中心,消费者双注册中心是否收影响,能否自动转移?
答:经测试,new中心全部挂掉后,服务依旧会从old服务发现,功能不受影响。
但是,dubbo客户端会一直尝试重新连接zk中心(可配置),直到new中心重启后,zk能够自动重连成功为止。所以,我们这个场景,需要生产、消费者全部迁移到new zk 上后才能下线old zk。
参考文章
http://dubbo.apache.org/zh-cn/docs/user/references/registry/zookeeper.html
文档信息
- 本文作者:寒澈
- 本文链接:https://www.hancher.top/2022/10/06/dubbo_zk_change/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)