全部產品
Search
文件中心

Microservices Engine:從Apollo遷移到MSE Nacos

更新時間:Dec 27, 2024

本文介紹自建Apollo配置中心如何遷移到MSE Nacos配置中心。

前提條件

已建立MSE Nacos叢集,且Nacos版本為專業版。具體操作,請參見建立Nacos引擎

遷移說明

Apollo的模型和MSE Nacos的模型如下:

Apollo模型

MSE Nacos模型

  • 環境(env)。

    說明

    不同的env對應不同的Apollo執行個體。

  • 應用(appId)。

  • 叢集(cluster)。

  • 命名空間(namespace)。

  • 格式(format)。

  • 執行個體(instance)。

  • 命名空間(namespace)。

  • 分組(group)。

  • 配置(dataId)。

本遷移文檔將單個Apollo環境中的所有配置以檔案的方式匯入到Nacos中的一個命名空間,將以如下規則進行映射:

  • 不同的Apollo環境可以映射為不同的Nacos執行個體,也可以映射到同一個Nacos執行個體下的不同命名空間之中,可自行選擇。

  • Apollo的cluster對應Nacos中的group,Apollo中的{appId}.{namespace}.{format}對應Nacos中的dataId

  • Apollo中的appId將映射為Nacos配置中的應用appName

步驟一:匯出Apollo配置

匯出工具匯出zip包

  1. 登入自建Apollo控制台。

    本文以官方Demo地址為例。

  2. 我的應用程式頁面,單擊目標應用程式名稱。

  3. 在目標應用詳情頁的右上方,選擇管理員工具 > 設定匯出匯入。在設定匯出匯入頁面,勾選選擇匯出的環境,然後單擊匯出

說明

不同的環境請分獨立匯出不同檔案,檔案名稱以.zip結尾。

SQL匯出檔案

低版本Apollo沒有檔案匯出功能,對於舊版本Apollo,可以從資料庫中直接將設定匯出,請按照以下SQL進行配置的匯出,可以選擇匯出為JSON格式,或者Excel格式,檔案名稱分別以.json.xlsx 結尾。

select distinct  a.NamespaceId,b.NamespaceName,c.`Comment` AS 'NamespaceDesc' ,b.AppId,b.ClusterName,a.Key,a.Type ,a.Value,a.Comment,a.LineNum from ITEM a left join Namespace b on a.NamespaceId=b.id  left join AppNamespace c on c.Name=b.NamespaceName where a.IsDeleted=0 order by a.NamespaceId,a.LineNum ;

步驟二:檔案轉換

對Apollo配置進行了匯出,可以獲得一個設定匯出檔案(檔案以.zip,.json,.xlsx結尾),需要將檔案轉換為可以直接在MSE Nacos控制台中進行匯入的檔案格式。

  1. 下載轉換工具:curl -O https://msesync.oss-cn-hangzhou.aliyuncs.com/ApolloConfigTransfer.jar

  2. 執行轉換程式:java -DsourceFilePath={apollo匯出檔案的完整路徑} -jar ApolloConfigTransfer.jar。

  3. 程式執行成功後,可以在目前的目錄下獲得一個名為nacos_config_import_{apollo檔案名稱}_{時間戳記}.zip的檔案。

步驟三:匯入Nacos配置

  1. 登入MSE管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇注册配置中心 > 实例列表。單擊目標執行個體名稱。

  3. 在基礎資訊頁面的左側導覽列選擇組態管理 > 配置列表

  4. 在配置列表頁面,選擇對應的命名空間,單擊匯入配置,在匯入配置頁面上傳步驟二的設定檔。

    說明

    至此,我們已經完成配置從Apllo到Nacos的遷移。

步驟四:更改依賴

在應用專案中將Apollo的依賴更改為Spring Cloud Alibaba的依賴。

修改前:

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>{apollo.version}</version>
</dependency>

修改後:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.10</version>
</dependency>
說明
  • 如果您使用的是Spring Cloud Alibaba 2023.x 系列需升級版本至2023.0.3.2。

  • 如果您使用的是Spring Cloud Alibaba 2022.x 系列需升級版本至2022.0.0.2。

  • 如果您使用的是Spring Cloud Alibaba 2021.x 系列需升級版本至2021.0.6.2。

  • 如果您使用的是Spring Cloud Alibaba 2.2.x 系列需升級至2.2.11。

步驟五:改造代碼

應用程式使用Apollo動態配置有以下幾種用法。

@Value註解

該種用法是在一個SpringBean中通過@Value註解引用一個屬性值,spring cloud alibaba架構可以平滑支援,無需代碼改動。

@RestController
@RefreshScope
public class DemoController {
    
    @Value("testKey")
    String testKey = "value";

    
    @RequestMapping("/valuekey")
    public String getNacosTestKey() {
        return testKey;
    }
}

@ApolloConfig註解

該種用法是通過@ApolloConfig,註冊一個SpringBean,並且將對象的欄位對應的屬性值自動注入該對象中,可以通過Spring的標準註解@ConfigurationProperties直接替換。

@Configuration
@ConfigurationProperties
public class CNStackInfoConfig {
    
    private String name;

    private int customerCount;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getCustomerCount() {
        return customerCount;
    }

    public void setCustomerCount(int customerCount) {
        this.customerCount = customerCount;
    }
}

Apollo Config API

該種用法是直接調用Apollo的API擷取某個指定namespace中的單個屬性值。

ConfigService.getAppConfig().getProperty("testkey", "defaulyv1");
ConfigService.getAppConfig("namespace").getProperty("testkey", "defaulyv1");

在Nacos中,可以通過二次封裝支援。樣本如下:

@NacosConfig(dataId="appId1.application.properties",group="group") 
Properties nacosConfigProperties;

private void method() {
    String value=nacosConfigProperties.getProperty("key","defaultValue");
}

ApolloConfigChangeListener回調

該種用法支援在Apollo中指定首碼的key發生變更時回調當前方法。

Apollo中的用法:

    /**
     * notify listener
     * @param configChangeEvent
     */
    @ApolloConfigChangeListener(interestedKeyPrefixes = {"data."})
    public void apolloNotify(ConfigChangeEvent configChangeEvent) {
        System.out.println(configChangeEvent.changedKeys());
    }
    

Nacos中的用法:

@NacosConfigKeysListener(dataId="appId1.application.properties",group="group",interestedKeyPrefixes = {"data."})
public void apolloNotify(ConfigChangeEvent configChangeEvent) {
    System.out.println(configChangeEvent.changedKeys()); 
}

關於Spring Cloud Alibaba Nacos配置中心註解的更多用法,可參見SpringCloud應用Nacos配置中心註解

步驟六:修改串連地址

  1. 引入Nacos配置

    ##原有apollo的配置 
    #環境-Dappllo.env={env}
    apollo.meta=http://127.0.0.1:8070
    apollo.bootstrap.enabled=true
    #指定引入的命名空間
    apollo.bootstrap.namespaces=application,namespace1
    #指定叢集
    apollo.bootstrap.cluster=default
    #指定應用的
    app.id=app1

    修改為Nacos的地址

    #指定載入的配置dataId及group
    spring.config.import[0]=nacos:app1.application.properties?group=default&refreshEnabled=true
    spring.config.import[1]=nacos:app1.namespace1.properties?group=default&refreshEnabled=true
    #指定MSE Nacos的地址
    spring.cloud.nacos.config.server-addr=mse-xxx-p.nacos-ans.mse.aliyuncs.com
    #指定MSE Nacos的命名空間
    spring.cloud.nacos.config.namespace={mse nacos中指定環境對應namespaceid,比如5babe1ee-1352-xxxx-bd7b-7e7ce892e2ab}
  2. 重啟服務。