如果您的Spring Cloud叢集(包含多個應用)已經部署在阿里雲上,您可以將應用遷移至Serverless 應用引擎 SAE(Serverless App Engine)。本文介紹如何將應用平滑遷移到SAE中,以及實現基本的服務註冊與發現。
遷移流程

必需:遷移應用
遷移的應用通常是無狀態的,需要先遷移應用。
可選:遷移SLB或修改網域名稱配置
在應用遷移完成後,您還需要遷移SLB或修改網域名稱配置。
SLB
如果您的應用在遷移之前已經使用SLB,應用遷移後可以複用該SLB。您可以根據您的實際需求選擇綁定SLB的策略,具體操作,請參見為應用綁定CLB並產生應用的公網或私網訪問IP。
如果您的應用在遷移之前沒有使用SLB,建議在遷移完入口應用(例如流程圖中所示的API Gateway)後,為該應用建立並綁定一個新SLB。
遷移方案中,推薦使用雙註冊和雙訂閱者案,以節約ECS成本。如果由於某種原因(例如原ECS連接埠被佔用)不能複用原ECS,則需要採用切流遷移方案,添加新的ECS用於應用遷移。在應用遷移完成後,依據遷移前應用是否使用SLB,選擇複用SLB或建立SLB並綁定到遷移後應用。
網域名稱
如果遷移後的應用可以複用SLB,則網域名稱配置無需修改。
如果遷移後的應用需要建立新的SLB並綁定,則需要在網域名稱中添加新的SLB配置,並刪除原來不再使用的SLB。具體操作,請參見修改DNS伺服器。
可選:遷移儲存和訊息佇列
如果應用遷移前已經部署在阿里雲上,同時儲存和訊息佇列同樣使用了阿里雲相關產品(例如RDS、MQ),那麼應用遷移完成後,遷移前的儲存和訊息佇列無需遷移。
如果應用遷移前沒有部署在阿里雲上,請加入釘群(釘群號:32874633),聯絡產品技術專家進行諮詢。
本文以Demo應用示範平滑遷移。關於Demo應用的下載地址,請參見Demo。
遷移方案
遷移應用有以下兩種方案,兩種方案均可保證應用正常運行不中斷情況下完成平滑遷移。
本文主要介紹雙註冊和雙訂閱者案。
切流遷移方案
使用Spring Cloud Alibaba將原有的服務註冊中心切換到Nacos。開發一套新的應用部署到SAE,最後通過SLB和網域名稱配置來進行切流。
如果選擇此方案,請參見將應用的服務註冊與發現中心更改為Nacos。
雙註冊和雙訂閱遷移方案
雙註冊和雙訂閱遷移方案指在應用遷移時同時接入兩個註冊中心(原有註冊中心和SAE註冊中心),以保證已遷移的應用和未遷移的應用之間可相互調用。
雙註冊和雙訂閱平滑遷移方案架構圖如下:
初始狀態
第一步
第二步
第三步
第四步
已遷移的應用和未遷移的應用之間可以互相發現,從而實現互相調用,保證了業務的連續性。
使用方式簡單,僅需要添加依賴,並修改極少代碼,實現雙註冊和雙訂閱。
支援查看消費者服務調用列表的詳情,即時地查看遷移的進度。
支援在不重啟應用的情況下,動態地變更服務註冊的策略和服務訂閱的策略,只需要重啟一次應用就可以完成遷移。
步驟一:遷移第一個應用
制定應用遷移優先順序。
選擇遷移需求優先順序高的應用,建議從最下層Provider開始遷移。如果調用鏈路太複雜,難以分析,可以任意選一應用進行遷移。
在應用程式中添加依賴並修改配置。
在pom.xml檔案中添加
spring-cloud-starter-alibaba-nacos-discovery依賴。<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>{相應的版本}</version> </dependency>在application.properties中添加nacos-server的IP地址。
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848添加多註冊中心依賴
edas-sc-migration-starter。Spring Cloud預設依賴中只能引入一個註冊中心,存在多個註冊中心時,啟動會異常。如果需要支援多個註冊中心,需要添加依賴
edas-sc-migration-starter。<dependency> <groupId>com.alibaba.edas</groupId> <artifactId>edas-sc-migration-starter</artifactId> <version>1.0.2</version> </dependency>
修改RibbonClients預設配置。
Ribbon是實現負載平衡組件,應用從多個註冊中心訂閱服務,需要修改Ribbon配置。在應用啟動的主類中,將RibbonClients預設配置修改為
MigrationRibbonConfiguration。假設原有的應用主類啟動代碼如下:
@SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }修改後應用主類啟動代碼如下:
@SpringBootApplication @RibbonClients(defaultConfiguration = MigrationRibbonConfiguration.class) public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }說明在本地修改應用或者應用部署到SAE後,如果對應用有其他控制需求,例如將應用註冊到某些註冊中心或從某些註冊中心訂閱,則可以通過Spring Cloud Config或Nacos Config動態地調整配置,而無需重啟應用。調整配置的方法,請參見動態調整服務註冊和訂閱者式。
要通過Spring Cloud Config或Nacos Config動態地調整配置,需要在應用中添加組態管理依賴並修改配置。如果使用Spring Cloud Config,請參見相應地開來源文件。如果使用Nacos Config,請參見實現組態管理。
將應用部署到SAE。
根據實際需求將應用部署到SAE。具體操作,請參見應用部署。
結果驗證。
觀察業務運行是否正常。
查看服務訂閱監控。
Spring Boot 1.x版本:http://ip:port/dubboRegistry
Spring Boot 2.x版本:http://ip:port/actuator/dubboRegistry
如果應用開啟了Spring Boot Actuator監控功能,請訪問Actuator查看此應用訂閱的各服務的RibbonServerList資訊。Actuator地址如下: metaInfo中
serverGroup欄位表示此節點的服務註冊中心。
步驟二:遷移其他所有應用
按照步驟一:遷移第一個應用的步驟,依次將所有應用遷移到SAE。
步驟三:清理遷移配置
遷移完成後,刪除原有的註冊中心配置和遷移過程專用的依賴edas-sc-migration-starter。
edas-sc-migration-starter遷移專用的starter,長期使用對業務的穩定性沒有影響,對於Ribbon負載平衡實現有一定的局限性,建議在遷移完畢後刪除,並在業務量較小的時間段內分批重啟應用。
動態調整服務註冊和訂閱者式
應用遷移過程中,可以通過SAE組態管理功能動態變更服務註冊和訂閱者式。
動態調整服務訂閱
系統預設的訂閱策略,是SAE從所有註冊中心訂閱服務資料,並對資料進行彙總。
您可以通過SAE的組態管理修改
spring.cloud.edas.migration.subscribes屬性,選擇具體的註冊中心訂閱資料。spring.cloud.edas.migration.subscribes=nacos,eureka # 同時從Eureka和Nacos訂閱服務。 spring.cloud.edas.migration.subscribes=nacos # 只從Nacos訂閱服務。動態變更服務註冊
系統預設的註冊策略,是SAE註冊到所有註冊中心。
您可以通過SAE的組態管理來調整服務註冊中心。
通過修改
spring.cloud.edas.migration.registry.excludes屬性關閉指定的註冊中心。spring.cloud.edas.migration.registry.excludes= # 預設值為空白,註冊到所有的服務註冊中心。 spring.cloud.edas.migration.registry.excludes=eureka # 關閉Eureka的註冊。 spring.cloud.edas.migration.registry.excludes=nacos,eureka # 關閉Nacos和Eureka的註冊。應用運行時,如果需要動態修改服務註冊策略,可以使用Spring Cloud組態管理功能在運行時修改此屬性。