原生Nacos迁移至MSE
MSE Nacos相对于开源Nacos额外提供了配置加密、推送轨迹等功能,保障高可用,并提供了丰富的运维工具,操作十分方便。本节介绍从开源Nacos迁移到天翼云Nacos实例。
前提条件
- 已经创建Nacos实例,参考章节:创建Nacos实例
- 已经在Nacos实例上创建需要迁移的命名空间
迁移配置
- 在开源控制台导出需要迁移的配置
- 登陆开源Nacos自带的原生控制台
- 在配置列表页面选择命名空间,点击单选框选中需要迁移的配置
- 在配置列表下方点击导出,然后选择导出选中的配置。
- 然后在下载中可以看到导出的压缩包文件nacos_config_exportxxxxx.zip。
- 在MSE控制台页面导入配置
- 登录微服务引擎MSE注册配置中心管理控制台,选择资源池。
- 在左侧导航栏,选择注册配置中心 > 实例列表。
- 在实例列表页面,单击目标实例ID、实例名称或者目标行“管理”按钮均可跳转至实例基础信息页面。
- 在基础信息页面,点击配置管理>配置列表,选择命名空间。
- 点击导入配置,在弹出的导入配置框中确认目标命名空间,选择相同配置的处理策略(策略详细介绍见同步配置),点击上传配置文件,最后点击确定,即可开始导入文件。
- 导入后查看配置列表,可以看到配置已经导入成功。
- 在应用完成迁移以前,如果需要变更配置文件,则需要在两边同步更新,以避免业务出现不一致的情况。
修改业务配置参数
根据不同的应用和框架,需要修改的配置参数不完全相同。但总体来说最重要的四个字段是Nacos服务端访问地址,命名空间ID,用户名以及密码。
迁移Java应用
Java应用一般情况下是直接也来nacos-client。以pom.xml依赖文件为例:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version]</version>
</dependency>
如果是在代码中直接使用properties方式配置Nacos访问信息,则需要修改。
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "Nacos访问地址");
properties.put(PropertyKeyConst.NAMESPACE, “命名空间");
properties.put(PropertyKeyConst.USERNAME, "username);
properties.put(PropertyKeyConst.PASSWORD, “password");
迁移Spring Boot 应用
Spring boot应用一般情况下Nacos的相关配置在application.properties文件中。
同样是修改Nacos服务端访问地址,命名空间ID,用户名以及密码等字段。
properties.put(PropertyKeyConst.SERVER_ADDR, "Nacos访问地址");
nacos.config.server-addr=${Nacos的访问地址}
nacos.config.namespace=${命名空间ID}
nacos.config.username=${用户名}
nacos.config.password=${密码}
迁移spring-cloud-alibaba应用
Spring cloud应用一般情况下存在如下依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${spring-cloud-starter-alibaba.version}</version>
</dependency>
一般情况下Nacos配置文件包含在bootstrap.properties 或者bootstrap.yml文件中。需要修改的配置项如下所示:
spring:
cloud:
nacos:
config:
server-addr: ${_NACOS_SERVER_ADDRESS}
username: ${_NAOCS_USERNAME}
password: ${_NAOCS_PASSWORD}
namespace: ${_NACOS_CONFIG_NAMESPACE}
源配置中心下线
当配置迁移完毕且应用已经全部切换至目标配置中心后,可以停止更新源配置中心,确认没有连接或监听的情况下,可以将源注册中心停止,完全使用目标配置中心。
从Apollo迁移至MSE Nacos
本节内容介绍如何从Apollo迁移配置至MSE Nacos实例。
前提条件
- 已经创建Nacos实例,参考章节创建Nacos实例
- 已经在Nacos实例上创建需要迁移的命名空间
同步配置信息
- 登录原生的Apollo控制台,本文以Apollo官方demo地址为例。
- 在我的应用页面点击需要迁移配置的应用名称。
- 在右上角点击管理员工具> 配置导入导出 > 点击单选框选中选择需要导出的环境,然后点击导出按钮。
- 导出需要迁移的配置到本地后。按照Apollo和Nacos数据结构的对应关系,修改本地配置的存储结构。
Apollo和Nacos数据结构对应关系如下:
Apollo数据结构 | Nacos数据结构 |
---|---|
环境 | Namespace |
集群 | group |
Namespace | dataId |
-
导出需要迁移的配置到本地后。按照Apollo和Nacos数据结构的对应关系,进入到对应的环境目录,可以看到导出的配置形如: appId+集群名+配置名称.properties。
-
修改执行脚本的参数,配置导出文件的路径以及目标Nacos访问信息。然后执行迁移脚本。Apollo版本2.2.0.
import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.PropertyKeyConst; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.common.utils.JacksonUtils; import com.fasterxml.jackson.core.type.TypeReference; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; import java.util.Properties; import java.util.stream.Collectors; // 该类为2.2.0版本Apollo 迁移Nacks的脚本 public class ApolloTransNacos { static final Properties propertiesForMse= new Properties(); static final String NACOS_DEFAULT = "DEFAULT_GROUP"; static final String APOLLO_DEFAULT = "default"; static ConfigService configService = null; public static void main(String[] args) throws IOException, NacosException { // 期望发布配置的目标MSE地址 String mseServerAddr = "MSE访问地址"; // 传入NamespaceId,如果发布到public则将其namespaceId置为"" String namespaceId = "prod"; String rootPath = "PATH/TO/APOLLO/ENV/DIR"; propertiesForMse.put(PropertyKeyConst.USERNAME, "用户名"); propertiesForMse.put(PropertyKeyConst.PASSWORD, "密码"); propertiesForMse.put(PropertyKeyConst.SERVER_ADDR, mseServerAddr); propertiesForMse.put(PropertyKeyConst.NAMESPACE, namespaceId); configService = NacosFactory.createConfigService(propertiesForMse); File dir = new File(rootPath); String[] children = dir.list(); assert children != null; for (String child : children) { if (child.endsWith("properties")) { String[] array = child.split("\\+"); if (array.length==3) { String group = array[1]; String dataId = array[2]; //将apollo中的默认值default 转换为Nacos中的默认值DEFAULT_GROUP if (APOLLO_DEFAULT.equals(group)) { group = NACOS_DEFAULT; } byte[] bytes = Files.readAllBytes(Paths.get(dir.getAbsolutePath() +File.separator + child)); List<ApolloConfigLine> lines = JacksonUtils.toObj(bytes, new TypeReference<List<ApolloConfigLine>>() { }); if (lines!=null && !lines.isEmpty()) { String content = lines.stream().sorted(ApolloConfigLine::compareTo).map( line -> line.key.trim() +"=" + line.value.replace("\n","")).collect(Collectors.joining("\n")); System.out.println("group = " + group+" , dataId= " + dataId +" , content =\n" + content ); publishMSE(dataId,group,content); } } } } } public static void publishMSE(String dataId, String group, String content) throws NacosException { boolean result = configService.publishConfig(dataId, group, content); System.out.println("dataId: " + dataId + " group: " + group + "transfered" + ", result :" +result); } static class ApolloConfigLine implements Comparable<ApolloConfigLine> { private String key; private Integer type; private String value; private Integer lineNum; @Override public int compareTo(ApolloConfigLine o) { return this.lineNum-o.lineNum; } } }
-
执行完毕后,查看Nacos对应命名空间配置是否同步成功。
修改应用配置
- 修改依赖信息
将apollo-client客户端依赖改为nacos-client依赖,如下所示:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
- 修改代码
(1) 如果迁移的应用代码中使用了@EnableApolloConfig注解,需要将所有@EnableApolloConfig注解的类替换为@ConfigurationProperties注解。
(2) 如果迁移的应用代码中中使用了@ApolloConfig注解,将其修改为@ConfigurationProperties(prefix = "")注解,并且在bootstrap.properties中增加相关配置项。
(3) 使用的@ApolloConfigChangeListener可以使用nacos-sdk 中的中注册监听器代替。
(4) 代码中使用的@ApolloJsonValue 可以使用@Value替代,对应的 JsonBean类型使用String代替。
- 修改配置信息
将Apollo相关配置改为MSE Nacos相关的配置,实例如下:
application.yml文件中的Apollo配置:
apollo:
meta: http://81.68.181.139:8080
bootstrap:
enabled: true
eagerLoad:
enabled: true
namespaces: application,TEST1.C_DEMO
listeners: "application,TEST1.C_DEMO"
bootstrap.yml文件中的Nacos配置:
spring:
application:
name: TEST1.C_DEMO
cloud:
nacos:
config:
server-addr: Nacos访问地址
namespace: prod
- 重启服务
- 修改配置验证监听情况。修改配置后,可以在应用的INFO日志中看到INFO o.s.c.e.event.RefreshEventListener - Refresh keys changed:[] 等字样,说明应用监听配置正常。