微服务引擎MSE

从Apollo迁移至MSE Nacos

2025-06-16 03:22:42

本节内容介绍如何从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:[]  等字样,说明应用监听配置正常。


dTiOsIwqJpjP