本节内容介绍如何从Apollo迁移配置至MSE Nacos实例。
前提条件
1. 已经创建Nacos实例,参考#2.1.3 创建Nacos实例
2. 已经在Nacos实例上创建需要迁移的命名空间
同步配置信息
1. 登录原生的Apollo控制台,本文以Apollo官方demo地址为例。
2. 在我的应用页面点击需要迁移配置的应用名称。
3. 在右上角点击管理员工具 > 配置导入导出 > 点击单选框选中选择需要导出的环境,然后点击导出按钮。
4. 导出需要迁移的配置到本地后。按照Apollo和Nacos数据结构的对应关系,修改本地配置的存储结构。
Apollo和Nacos数据结构对应关系如下:
Apollo数据结构 | Nacos数据结构 |
环境 | Namespace |
集群 | group |
Namespace | Data ID |
5. 导出需要迁移的配置到本地后。按照Apollo和Nacos数据结构的对应关系,进入到对应的环境目录,可以看到导出的配置形如: appId+集群名+配置名称.properties。
6. 修改执行脚本的参数,配置导出文件的路径以及目标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; } } } |
7. 执行完毕后,查看Nacos对应命名空间配置是否同步成功。
修改应用配置
1. 修改依赖信息
将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> |
2. 修改代码
(1) 如果迁移的应用代码中使用了@EnableApolloConfig注解,需要将所有@EnableApolloConfig注解的类替换为@ConfigurationProperties注解。
(2) 如果迁移的应用代码中中使用了@ApolloConfig注解,将其修改为@ConfigurationProperties(prefix = "")注解,并且在bootstrap.properties中增加相关配置项。
(3) 使用的 @ApolloConfigChangeListener可以使用nacos-sdk 中的中注册监听器代替。
(4) 代码中使用的@ApolloJsonValue 可以使用@Value替代,对应的 JsonBean类型使用String代替。
3. 修改配置信息
将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 |
4. 重启服务
5. 修改配置验证监听情况。修改配置后,可以在应用的INFO日志中看到INFO o.s.c.e.event.RefreshEventListener - Refresh keys changed:[] 等字样,说明应用监听配置正常。