服务迁移
概述
如果你希望使用 Polaris 代替 Nacos 作为新的注册中心,Polaris 提供了两种服务迁移的方式
- polaris-sync方案:提供server-to-server的迁移方式,支持多语言应用的迁移,需额外部署polaris-sync迁移工具
- 双注册双发现方案:提供JavaAgent的迁移方式,用户代码无感的方式完成服务迁移,仅支持Java应用,无需额外部署polaris-sync迁移工具
在执行服务数据从一个注册中心迁移至另一个注册中心的过程中,往往需要双向访问:
- 迁移到新注册中心的服务,需要访问未迁移的服务。
- 未迁移至新注册中心的服务,需要访问已迁移的服务。
当前 Polaris 提供的两种服务迁移方式均能够满足该要求,接下来你可以通过以下内容了解如何通过服务数据同步或者多注册多发现进行服务迁移。
准备Polaris服务端
需要预先安装好Polaris服务端,安装方式可参考:集群版安装
服务数据同步
polaris-sync 提供server-to-server的迁移方式,支持 Nacos 和 Polaris 进行服务数据双向同步。你可以按照以下步骤编写 polaris-sync 服务迁移的任务配置。从而实现将服务数据从 Nacos 平稳的迁移至 Polaris。
准备 polaris-sync
polaris-sync 是基于 Java 编写的程序,如果你希望在 VM 上运行 polaris-sync,则需要在 VM 上安装相关 Java 运行环境。
Java 版本最低要求 JDK8
需要下载 polaris-sync 的最新 release 版本:下载地址。
下载完之后,将 polaris-sync-server-${version}.zip 进行解压
wget https://github.com/polarismesh/polaris-sync/releases/download/${version}/polaris-sync-server-${version}.zip
unzip polaris-sync-server-${version}.zip
完成上述步骤之后,进入 polaris-sync-server-${version}/conf 目录,可以看到两个配置文件,这里只需要关注 sync-registry.json
➜ conf tree
.
├── sync-config.json
└── sync-registry.json
sync-registry.json 配置
sync-registry.json 是服务同步任务的配置文件,polaris-sync 启动之后会自动加载该配置文件,从中获取服务数据同步任务配置信息,并根据该信息创建对应的服务同步任务执行。
sync-registry.json 配置文件的格式是 json,其配置内容主要由以下四个对象组成
- tasks: 数组形式,定义的服务数据同步任务信息,即设置服务数据从那个源注册中心同步到目标注册中心
- methods: 数组形式,定义服务数据同步的方式,当前支持 PULL 模式以及 WATCH 模式
- health_check: 对象形式,定义是否需要对源注册中心以及目标注册中心进行健康检查,探测注册中心是否存活
- report: 对象形式,定义 polaris-sync 在同步过程中产生的指标数据上报的目标位置
这里我们对 tasks 配置参数解析
参数 key | 类型 | 名称 | 示例| |
---|---|---|---|
name | string | 同步任务 ID,唯一标识 | nacos-to-polaris |
enable | bool | 同步任务是否开启 | true |
source | object | 源注册中心信息 | NULL |
source.name | string | 源注册中心实例别名 | nacos |
source.type | string | 注册中心类型 | nacos |
source.addresses | []string | 注册中心接入地址 | [“127.0.0.1:8848”] |
source.user | string | 注册中心用户信息 | nacos |
source.password | string | 注册中心用户密码信息 | nacos |
source.token | string | 注册中心用户访问凭据 token | token-123 |
destination | object | 目标注册中心信息 | NULL |
destination.name | string | 目标注册中心实例别名 | nacos |
destination.type | string | 注册中心类型 | nacos |
destination.addresses | []string | 目标注册中心接入地址 | [“127.0.0.1:8848”] |
destination.user | string | 目标注册中心用户信息 | nacos |
destination.password | string | 目标注册中心用户密码信息 | nacos |
destination.token | string | 目标注册中心用户访问凭据 token | token-123 |
match | []object | 设置待同步的服务数据匹配规则 | [{}] |
match[${index}].namespace | string | 待同步的服务命名空间的 | namespace |
match[${index}].service | string | 待同步的服务名称 | service |
这里你可以参考 sync-registry.json 的样例配置,根据你的实际情况进行调整 tasks 对象即可,examples/sync-registry.json
- nacos 默认命名空间下的服务数据,将同步到 polaris 中名称为
default
的命名空间 - 当 nacos 为服务数据同步的目标注册中心时,如果 nacos 开启了鉴权,则必须配置 nacos 的 admin 账户,因为在同步服务时,polaris-sync 会主动的在 nacos 创建对应的命名空间以完成服务同步任务。
启动 polaris-sync
完成 sync-registry.json 的配置之后,启动 polaris-sync 执行服务数据同步
➜ cd polaris-sync-server-0.3.0-beta
➜ bash bin/start.sh
验证
- 启动 polaris-sync 之后,查看日志 loggers/polaris-sync.log 观察到有以下日志则同步任务正常运行
[LOG] success to watch for service cn.polarismesh.polaris.sync.core.tasks.
[Core][Pull]prepare to update from registry source-nacos, type NACOS, service service='nacos.test.3'}, group default, instances []
[Core][Watch]prepare to update service Service{namespace='default', default instances []
[Core][Watch]prepare to update service Service{namespace='default', default instances []
[Polaris] service not found to discover service Service='nacos.test.3'} to http://127.0.0.1:8090/v1/Discover
[Polaris] service not found to discover service Service{namespace='default', service='nacos.test.3'} to http://127.0.0.1:8090/v1/Discover
- 登陆 nacos 控制台以及 polaris 控制台,查看服务以及服务下的实例是否同步成功,实例能够稳定维持健康状态。
何时结束
当你的所有应用均默认注册到 Polaris 之后,则可以关闭 polaris-sync 进程结束服务数据同步,然后便可以关停 Nacos 服务。至此完成服务数据从 Nacos 迁移至 Polaris。
多注册多发现
Polaris 提供 JavaAgent 的迁移方式,无需额外部署 polaris-sync 迁移工具,仅支持 Java 应用的迁移
准备 polaris-java-agent
需要下载 polaris-java-agent 的最新 release 版本:下载地址。
下载完之后,将 polaris-sync-server-${version}.zip 进行解压
wget https://github.com/polarismesh/polaris-java-agent/releases/download/${version}/polaris-java-agent-${version}.zip
unzip polaris-java-agent-${version}.zip
完成上述步骤之后,进入 polaris-java-agent-${version} 目录,先看下目录结构
➜ polaris-java-agent-1.3.0-beta tree
.
├── conf
│ └── plugin
│ └── springcloud2021
│ └── application.properties # Spring Cloud Java Agent 的插件配置
├── plugins
│ └── spring-cloud-2021-plugin-1.3.0-beta.jar # Spring Cloud 2021 的 Java Agent 插件支持
└── polaris-agent-core-bootstrap.jar # Polaris Java Agent 主程序
编辑 application.properties
# 配置服务名称
spring.application.name=${服务名称信息}
# 开启 polaris java agent 的服务注册发现能力
spring.cloud.discovery.enabled=true
# 设置北极星注册中心地址
spring.cloud.polaris.address=grpc\://127.0.0.1\:8091
# 设置注册的命名空间信息
# 注意:
# 1. 如果需要开启多注册能力,需要确保已经在 Polaris 上创建了原本应用在 Nacos 的命名空间
# 2. 北极星的默认命名空间 default 等同于 nacos 的默认命名空间
spring.cloud.polaris.namespace=default
# 开启双注册双发现到 nacos
spring.cloud.nacos.enabled=true
# 设置 nacos 服务注册中心的地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1\:8848
# 设置 nacos 的账户信息
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
# 是否开启从 nacos 拉取服务实例信息
spring.cloud.nacos.discovery.enabled=true
# 是否开启将服务注册到 nacos
spring.cloud.nacos.discovery.register=true
重启业务进程
重启业务进程时,需要设置 -javaagent 参数指定为 Polaris Java Agent 才能启用多注册多发现能力。
java -javaagent:xxx/polaris-agent-core-bootstrap.jar -jar {你的 Java 程序名称}.jar
验证
登陆 nacos 控制台以及 polaris 控制台,查看业务进程是否同时注册到 Nacos 以及 Polaris,并且实例均处于健康状态。
何时结束
当你的所有应用均通过 Polaris Java Agent 完成双注册双发现之后,可以通过调整 application.properties,设置 spring.cloud.nacos.enabled=false 禁止注册到 Nacos,或者调整业务进程逻辑使得默认注册到 Polaris,再逐步重启相关业务进程即可。