平滑从Consul迁移到 Nacos,再也不用担心特朗普发疯了...

作者 l 张龙
来源 l Hollis(ID:hollischuang)

image

近日,国外的商业软件公司HashiCorp在官网宣布:不允许中国境内使用、部署和安装该企业旗下的【企业版】产品和软件。
image

PLEASE NOTE THAT THE SOFTWARE MAY NOT BE USED, DEPLOYED OR INSTALLED IN THE PEOPLE’S REPUBLIC OF CHINA.HashiCorp旗下的知名的开源软件有 Consul、Vagrant、Terraform等,虽然在最后官方立马对文章进行了修改和解释,指出只是因为国内管制,不允许使用其公司的 VAULT。但是通过这件事,还是建议已经在使用Consul的公司预防万一,今天这篇文章就是专门来解决大家可能担心的万一出现,通过Nacos-Sync 把 Consul 平滑迁移到 Nacos。迁移方案

方案一(双注册方案)

服务框架在过度期间将服务同时注册到 Consul 和 Nacos。过度完去掉对 Consul 的注册和消费。

image

方案二(Nacos-Sync同步方案)

Nacos-Sync是一个跨注册中心服务同步组件,支持Zookeeper/Eureka/Consul/Nacos等注册中心间服务同步和迁移。

下图展示通过Nacos Sync 完成 Consul 到 Nacos 服务迁移的过程。只需配置服务同步任务,过度期间服务双向同步,新版本升级连到Nacos即可。

image

方案选型

双注册方案相对更稳定,但是需要多次升级发布才能过度完成。相比之下Nacos-Sync侵入性更低,一次性迁移过度,也是我们推荐的一个方案。

Demo演示

下面我们通过一个简单的 Demo 介绍一下怎么用 Nacos-Sync 完成 Consul 到 Nacos 服务迁移。

环境准备

本例子包含 Spring-Cloud 将服务分别注册到Consul、Nacos 两个注册中心互相同步演示

  1. Spring-Cloud 注册到 Consul 的服务 同步到 Nacos

  2. Spring-Cloud 注册到 Nacos 的服务 同步到 Consul

| 服务 | 版本 |
| Consul | 1.7.3 |
| Nacos | 1.2.1 |
| Mysql | 5.7 |
| Nacos-Sync | 0.3.7 |

本文演示上面的中间件服务均使用的是Docker Image,下面是docker安装过程

1.Consul 启动,这里启动4个Consul Agent,3个Server(会选举出一个leader),1个Client.

#启动第1个Server节点,集群要求要有3个Server,将容器8500端口映射到主机8900端口,同时开启管理界面
docker run -d --name=consul1 -p 8900:8500 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui

#查看启动后的第一个consul 容器IP
docker exec -it consul1 cat /etc/hosts | grep 172

#启动第2个Server节点,并加入集群
docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 第一个容器ip

#启动第3个Server节点,并加入集群
docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 第一个容器ip

#启动第4个Client节点,并加入集群
docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 --join 第一个容器ip

2.启动Nacos server

$ docker run --name nacos-standalone -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:1.2.1

3.启动Mysql

$ docker run --name nacos-sync-db -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=nacos_sync -p 3306:3306 -d  mysql:5.7

4.启动Nacos-Sync

下载最新Nacos-Sync Release包,并解压,进入解压后的目录,并修改conf/application.properties中的mysql配置

server.port=8081
server.servlet.context-path=/

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.ddl-auto=update


spring.datasource.url=jdbc:mysql://127.0.0.1:3306/nacos_sync?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

5.执行启动脚本

$ ./bin/startup.sh restart

Nacos-Sync 添加集群

打开Nacos-Sync: localhost:8081

添加Consul集群

1.选择 集群配置->新增集群

image

添加Nacos集群

2.选择 集群配置->新增集群

image

添加完成效果

image

代码演示

创建两个Spring Cloud 应用分别向Consul和Nacos注册服务,并且通过上面的Nacos-Sync完成Consul和Nacos注册中心服务的相互同步.下面贴出一些关键代码,具体代码请参考:https://github.com/paderlol/nacos-sync-example

通过Consul注册Spring Cloud服务

创建一个Controller服务

下面的Controller中, /hello是注册在Consul的restful服务,/nacos-hello 是引用的在Nacos注册的服务

@RestController
public class HelloController {
    @GetMapping(value = "/hello")
    public String hello() {
        return "Hello World from Consul!";
    }
    @Autowired
    private HelloService helloService;
    // 注册在Nacos注册中心的服务
    @GetMapping(value = "/nacos-hello")
    public String hello2() {
        return helloService.hello();
    }
}
启动consul-provider-cloud应用

运行 consul-provider-cloud工程下面com.paderlol.nacos.consul.ConsulProviderApplication类, 应用端口为18089

@SpringBootApplication
@EnableFeignClients
public class ConsulProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsulProviderApplication.class, args);
    }
    // 引用Nacos同步过来的服务
    @FeignClient(name = "nacos-provider-cloud")
    public interface HelloService {
        @RequestMapping(value = "/hello", method = RequestMethod.GET)
        String hello();
    }
}
验证注册

1.可以看到我们的服务已经在Consul注册成功了

image

2.在浏览器输入: http://localhost:18089/hello 可以看到页面返回Hello World from Consul!

通过Nacos注册Spring Cloud服务

创建一个Controller服务

下面的Controller中, /hello是Nacos本身的restful服务,/consul-hello 是引用的在Consul注册的服务

@RestController
public class HelloController {
    @Autowired
    private HelloService helloService;
    @GetMapping(value = "/consul-hello")
    public String hello() {
        return helloService.hello();
    }
    @GetMapping(value = "/hello")
    public String hello2() {
        return "Hello World from Nacos!";
    }
}
启动nacos-provider-cloud

运行 nacos-provider-cloud工程下面com.example.NacosCloudConsulConsumerApplication类, 应用端口为18088

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosCloudConsulConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosCloudConsulConsumerApplication.class, args);
    }
    @FeignClient(name = "consul-provider-cloud")
    public interface HelloService {
        @RequestMapping(value = "/hello", method = RequestMethod.GET)
        String hello();
    }
}
验证注册

1.可以看到我们的服务已经在Nacos注册成功了

image

2.在浏览器输入: http://localhost:18088/hello 可以看到页面返回Hello World from Nacos!

添加同步任务

添加同步任务

1.打开Nacos-Sync 控制台,添加同步任务。
选择 服务同步 -> 新增同步, 如图

image
image

2.添加完成效果

image
打开Nacos 控制台 查看同步结果

打开Nacos 控制台: http://localhost:8848/nacos

选择 服务管理-> 服务列表 ,如图

image

打开浏览器: http://localhost:18088/consul-hello 如图

image

打开Consul 控制台 查看同步结果

打开Consul 控制台: http://localhost:8900/ui/dc1/services

image

打开浏览器: http://localhost:18089/nacos-hello 如图

image

总结

从上面的演示中,我们可以看到Nacos-Sync已经可以支持Nacos和Consul的Spring Cloud应用的双向同步,可以很好的在Spring Cloud中支持Consul平滑迁移到Nacos应用.

稍微美中不足的暂时还没支持一键批量迁移,现在的服务同步,基本都需要建立一个服务维度的服务,后面陆续也会支持,也欢迎社区的小伙伴一起参与共建。

尼采:那些杀不死你的,终将使你变得更强大!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351