將 Spring Cloud 應用程式遷移至 Azure Container Apps
本指南說明當您想要移轉現有的 Spring Cloud 應用程式以在 Azure Container Apps 上執行時應該注意的事項。
移轉前
為確保成功移轉,在開始之前,請先完成下列各節中所述的評量和清查步驟。
如果您無法符合上述任何預先移轉需求,請參閱下列隨附移轉指南:
- 將可執行的 JAR 應用程式遷移至 Azure Kubernetes Service 上的容器(已規劃指導方針)
- 將可執行的 JAR 應用程式移至 Azure 虛擬機器(已規劃指導方針)
檢查應用程式元件
判斷是否要使用檔案系統及如何使用
尋找服務寫入和/或從本機文件系統讀取的任何實例。 識別短期/暫存盤的寫入和讀取位置,以及寫入和讀取長期檔的位置。
Azure Container Apps 提供數種類型的記憶體。 暫時記憶體可以讀取和寫入暫存數據,並可供執行中的容器或複本使用。 Azure 檔案提供永久記憶體,並可跨多個容器共用。 如需詳細資訊,請參閱 在 Azure Container Apps 中使用記憶體掛接。
唯讀靜態內容
如果您的應用程式目前提供靜態內容,您需要替代位置。 您可能想要考慮將靜態內容移至 Azure Blob 儲存體,並新增 Azure CDN 以進行全球閃電快速下載。 如需詳細資訊,請參閱 Azure 儲存體中的靜態網站裝載和快速入門:整合 Azure 儲存體帳戶與 Azure CDN。
動態發佈的靜態內容
如果您的應用程式支援靜態內容,無論是由應用程式本身上傳或產生,在建立后保持不變,您可以整合 Azure Blob 儲存體 和 Azure CDN。 您也可以使用 Azure 函式來管理上傳,並在必要時觸發 CDN 重新整理。 我們已在使用 Azure Functions 上傳和透過 CDN 預先載入靜態內容中提供範例實作供您使用。
判斷任何服務是否包含 OS 特定程式代碼
如果您的應用程式包含主機 OS 上具有相依性的任何程式代碼,則必須重構它以移除這些相依性。 例如,您可能需要使用 或 \
取代檔案系統路徑File.Separator
中的任何用法/
,或Paths.get
如果您的應用程式在 Windows 上執行。
切換至支持的平臺
如果您手動建立 Dockerfile 並將容器化應用程式部署至 Azure Container Apps,您可以完全掌控部署,包括 JRE/JDK 版本。
針對從成品進行部署,Azure Container Apps 也提供特定版本的 Java(8、11、17 和 21),以及 Spring Boot 和 Spring Cloud 元件的特定版本。 為了確保相容性,請先將應用程式移轉至目前環境中的其中一個支援的 Java 版本,然後繼續進行其餘的移轉步驟。 請務必完整測試產生的組態。 在這類測試中使用Linux發行版的最新穩定版本。
注意
如果您的目前伺服器是在不支援的 JDK 上執行,此驗證特別重要(例如 Oracle JDK 或 IBM OpenJ9)。
若要取得目前的 Java 版本,請登入您的生產伺服器,然後執行下列命令:
java -version
如需支援的 Java、Spring Boot 和 Spring Cloud 版本,以及更新的指示,請參閱 Azure Container Apps 上的 Java 概觀。
識別 Spring Boot 版本
檢查要移轉的每個應用程式的相依性,以判斷其 Spring Boot 版本。
Maven
在 Maven 專案中,通常可在 POM 檔案的 元素中找到 <parent>
Spring Boot 版本:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Gradle (英文)
在 Gradle 專案中,通常會在 plugins
區段中找到 Spring Boot 版本,作為外掛程式的版本 org.springframework.boot
:
plugins {
id 'org.springframework.boot' version '3.3.3'
id 'io.spring.dependency-management' version '1.1.6'
id 'java'
}
對於使用 3.x 之前的 Spring Boot 版本的任何應用程式,請遵循 Spring Boot 2.0 移轉指南 或 Spring Boot 3.0 移轉指南 ,將它們更新為支援的 Spring Boot 版本。 如需支援的版本,請參閱 Spring Cloud 檔。
識別 Spring Cloud 版本
檢查您要移轉的每個應用程式的相依性,以判斷其所使用的 Spring Cloud 元件版本。
Maven
在 Maven 專案中,Spring Cloud 版本通常會在 屬性中 spring-cloud.version
設定:
<properties>
<spring-cloud.version>2023.0.2</spring-cloud.version>
</properties>
Gradle (英文)
在 Gradle 專案中,Spring Cloud 版本通常會在「額外屬性」區塊中設定:
ext {
set('springCloudVersion', "2023.0.2")
}
您必須更新所有應用程式,才能使用支援的 Spring Cloud 版本。 如需支援的版本,請參閱 Spring Cloud 檔。
識別記錄匯總解決方案
識別您要移轉的應用程式正在使用的任何記錄匯總解決方案。 您必須在移轉中設定診斷設定,讓記錄的事件可供取用。 如需詳細資訊,請參閱 確定控制台記錄和設定診斷設定 一節。
識別應用程式效能管理 (APM) 代理程式
識別應用程式所使用的任何應用程式效能管理代理程式。 Azure Containers Apps 不提供 APM 整合的內建支援。 您需要準備容器映像,或將 APM 工具直接整合到程式代碼中。 如果您想要測量應用程式的效能,但尚未整合任何 APM,請考慮使用 Azure 應用程式 Insights。 如需詳細資訊,請參閱 移轉 一節。
清查外部資源
識別外部資源,例如數據源、JMS 訊息代理程式和其他服務的URL。 在 Spring Cloud 應用程式中,您通常會在下列其中一個位置找到這類資源的設定:
- 在 src/main/resources 資料夾中,檔案中通常稱為 application.properties 或 application.yml。
- 在您在上一個步驟中識別的 Spring Cloud Config Server 存放庫。
資料庫
針對 Spring Boot 應用程式,連接字串 通常會在相依於外部資料庫時出現在組態檔中。 以下是 application.properties 檔案的範例:
spring.datasource.url=jdbc:mysql://localhost:3306/mysql_db
spring.datasource.username=dbuser
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
以下是 application.yaml 檔案的範例:
spring:
data:
mongodb:
uri: mongodb://mongouser:deepsecret@mongoserver.contoso.com:27017
如需更多可能的設定案例,請參閱 Spring Data 檔:
JMS 訊息代理程式
在建置指令清單中尋找相關相依性的pom.xml或 build.gradle 檔案,以識別正在使用中的訊息代理程式或訊息代理程式。
例如,使用 ActiveMQ 的 Spring Boot 應用程式通常會在其pom.xml檔案中包含此相依性:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
使用商業代理程式的 Spring Boot 應用程式通常直接包含訊息代理程式 JMS 驅動程式連結庫的相依性。 以下是 build.gradle 檔案的範例:
dependencies {
...
compile("com.ibm.mq:com.ibm.mq.allclient:9.4.0.5")
...
}
識別使用中的訊息代理程式或訊息代理程序之後,請尋找對應的設定。 在 Spring Cloud 應用程式中,您通常會在 application.properties 和 應用程式目錄中application.yml 檔案,或在 Spring Cloud Config Server 存放庫中找到它們。
以下是 application.properties 檔案中的 ActiveMQ 範例:
spring.activemq.brokerurl=broker:(tcp://localhost:61616,network:static:tcp://remotehost:61616)?persistent=false&useJmx=true
spring.activemq.user=admin
spring.activemq.password=tryandguess
如需 ActiveMQ 設定的詳細資訊,請參閱 Spring Boot 傳訊檔。
以下是 application.yaml 檔案的 IBM MQ 範例:
ibm:
mq:
queueManager: qm1
channel: dev.ORDERS
connName: localhost(14)
user: admin
password: big$ecr3t
如需 IBM MQ 組態的詳細資訊,請參閱 IBM MQ Spring 元件檔。
識別外部快取
識別使用中的任何外部快取。 Redis 經常透過 Spring Data Redis 使用。 如需組態資訊,請參閱 Spring Data Redis 檔。
藉由搜尋個別的組態,以判斷會話數據是否透過 Spring Session 快取(在 Java 或 XML 中)。
身分識別提供者
識別需要驗證和/或授權的所有身分識別提供者和所有 Spring Cloud 應用程式。 如需如何設定識別提供者的資訊,請參閱下列資源:
- 如需 OAuth2 設定,請參閱 Spring Cloud Security 快速入門。
- 如需 Auth0 Spring Security 設定,請參閱 Auth0 Spring Security 檔。
- 如需 PingFederate Spring Security 設定,請參閱 Auth0 PingFederate 指示。
透過 VMware Tanzu 應用程式服務 (TAS) 設定的資源(先前稱為 Pivotal Cloud Foundry)
對於使用 TAS 管理的應用程式,外部資源,包括稍早所述的資源,通常會透過 TAS 服務系結來設定。 若要檢查這類資源的組態,請使用 TAS (Cloud Foundry) CLI 來檢視 VCAP_SERVICES
應用程式的變數。
# Log into TAS, if needed (enter credentials when prompted)
cf login -a <API endpoint>
# Set the organization and space containing the application, if not already selected during login.
cf target org <organization name>
cf target space <space name>
# Display variables for the application
cf env <Application Name>
檢查變數, VCAP_SERVICES
以取得系結至應用程式之外部服務的組態設定。 如需詳細資訊,請參閱 TAS (Cloud Foundry) 檔。
所有其他外部資源
本指南無法記錄每個可能的外部相依性。 移轉之後,您必須負責確認您可以滿足應用程式的每個外部相依性。
清查設定來源和秘密
清查密碼和安全字串
檢查生產部署上的所有屬性和組態檔和所有環境變數,以取得任何秘密字串和密碼。 在 Spring Cloud 應用程式中,您通常會在 application.properties 或個別服務或 Spring Cloud Config Server 存放庫中application.yml 檔案中找到這類字串。
清查憑證
記錄用於公用 SSL 端點或與後端資料庫和其他系統通訊的所有憑證。 您可以執行下列命令來檢視實際執行伺服器上的所有憑證:
keytool -list -v -keystore <path to keystore>
判斷是否使用 Spring Cloud Vault
如果您使用 Spring Cloud Vault 來儲存和存取秘密,請識別支援秘密存放區(例如 HashiCorp Vault 或 CredHub)。 然後識別應用程式程式代碼所使用的所有秘密。
找出組態伺服器來源
如果您的應用程式使用 Spring Cloud Config Server,請識別設定的儲存位置。 您通常會在 bootstrap.yml 或 bootstrap.properties 檔案中找到此設定,或有時位於 application.yml 或 application.properties 檔案中。 此設定看起來像下列範例:
spring.cloud.config.server.git.uri: file://${user.home}/spring-cloud-config-repo
雖然 git 最常用來作為 Spring Cloud Config Server 支援數據存放區,如先前所示,其他可能後端之一可能正在使用中。 如需其他後端的相關信息,請參閱 Spring Cloud Config Server 檔,例如關係資料庫(JDBC)、SVN 和本機文件系統。
檢查部署架構
記載每個服務的硬體需求
針對每個 Spring Cloud 服務(不包括組態伺服器、登錄或閘道),記載下列資訊:
- 執行中的實例數目。
- 配置給每個實例的CPU數目。
- 配置給每個實例的 RAM 數量。
檔異地復寫/散發
判斷 Spring Cloud 應用程式目前是否分散於數個區域或數據中心。 記錄您要移轉之應用程式的運行時間需求/SLA。
識別略過服務登錄的用戶端
識別叫用任何要移轉之服務的用戶端應用程式,而不需使用 Spring Cloud Service Registry。 移轉之後,將無法再進行這類調用。 更新這類用戶端以在移轉之前使用 Spring Cloud OpenFeign 。
遷移
拿掉受限制的組態
Azure Container Apps 環境提供受控的 Eureka 伺服器、Spring Cloud Config Server 和管理員。當應用程式系結至 Java 元件時,Azure Container Apps 會將相關的屬性插入為系統環境變數。 根據 Spring Boot 外部化組態 設計,系統環境變數會覆寫程式代碼或封裝在成品中的應用程式屬性。
如果您透過命令行自變數、Java 系統屬性或容器的環境變數來設定下列其中一個屬性,您必須將其移除,以避免衝突和非預期的行為:
SPRING_CLOUD_CONFIG_COMPONENT_URI
SPRING_CLOUD_CONFIG_URI
SPRING_CONFIG_IMPORT
eureka.client.fetch-registry
eureka.client.service-url.defaultZone
eureka.instance.prefer-ip-address
eureka.client.register-with-eureka
SPRING_BOOT_ADMIN_CLIENT_INSTANCE_PREFER-IP
SPRING_BOOT_ADMIN_CLIENT_URL
建立 Azure Container Apps 受控環境和應用程式
在現有的受控環境中,在您的 Azure 訂用帳戶中布建 Azure Container Apps 應用程式,或為您要移轉的每個服務建立新的應用程式。 您不需要建立以 Spring Cloud 登錄和組態伺服器身分執行的應用程式。 如需詳細資訊,請參閱快速入門:使用 Azure 入口網站部署您的第一個容器應用程式。
準備 Spring Cloud Config 伺服器
在適用於 Spring 的 Azure Container Apps 元件中設定組態伺服器。 如需詳細資訊,請參閱 在 Azure Container Apps 中設定 Spring 元件的 Config Server 設定。
注意
如果您目前的 Spring Cloud Config 存放庫位於本機文件系統或內部部署,您必須先將組態檔移轉至雲端式存放庫,例如 GitHub、Azure Repos 或 BitBucket。
確定主控台記錄並設定診斷設定
設定您的記錄,以確保所有輸出都會路由傳送至主控台,而不是路由傳送至檔案。
將應用程式部署至 Azure Container Apps 之後,您可以在 Container Apps 環境中設定記錄選項,以定義一或多個記錄的目的地。 這些目的地可以包含 Azure 監視器 Log Analytics、Azure 事件中樞,甚至是其他第三方監視解決方案。 您也可以選擇停用記錄數據,並只在運行時間檢視記錄。 如需詳細的設定指示,請參閱 Azure Container Apps 中的記錄記憶體和監視選項。
設定永續性記憶體
如果應用程式的任何部分讀取或寫入本機檔案系統,您需要設定永續性記憶體來取代本機檔案系統。 您可以指定要透過應用程式設定在容器中掛接的路徑,並將它與應用程式所使用的路徑對齊。 如需詳細資訊,請參閱 在 Azure Container Apps 中使用記憶體掛接。
將 Spring Cloud Vault 秘密遷移至 Azure KeyVault
您可以使用 Azure KeyVault Spring Boot Starter,透過 Spring 直接將秘密插入應用程式。 如需詳細資訊,請參閱如何使用適用於 Azure 的 Spring Boot Starter 金鑰保存庫。
注意
移轉可能需要重新命名某些秘密。 據以更新您的應用程式程序代碼。
將所有憑證移轉至 KeyVault
Azure Containers Apps 支援應用程式之間的安全通訊。 您的應用程式不需要管理建立安全通訊的程式。 您可以將私人憑證上傳至 Azure Container Apps,或使用 Azure Container Apps 所提供的免費受控憑證。 使用 Azure 金鑰保存庫 來管理憑證是建議的方法。 如需詳細資訊,請參閱 Azure Container Apps 中的憑證。
設定應用程式效能管理 (APM) 整合
如果您已在容器內設定 APM 相關變數,您只需要確定可以建立與目標 APM 平台的連線。 如果 APM 組態參考來自容器的環境變數,您必須根據 Azure Container Apps 來設定運行時間環境變數。 應安全地處理敏感性資訊,例如 連接字串。 您可以將它指定為秘密,或參考儲存在 Azure 金鑰保存庫 中的秘密。
設定個別服務秘密和外部化設定
您可以將組態設定插入每個容器作為環境變數。 變數中的任何變更會為現有的應用程式建立新的修訂。 秘密是索引鍵/值組,而且在所有修訂中保持有效。
移轉並啟用識別提供者
如果任何 Spring Cloud 應用程式需要驗證或授權,請使用下列指導方針來確保它們已設定為存取識別提供者:
- 如果識別提供者Microsoft Entra ID,就不需要變更。
- 如果識別提供者是 內部部署的 Active Directory 樹系,請考慮實作具有 Microsoft Entra ID 的混合式身分識別解決方案。 如需指引,請參閱 混合式身分識別檔。
- 如果識別提供者是另一個內部部署解決方案,例如 PingFederate,請參閱 Microsoft Entra Connect 的自定義安裝主題,以設定與 Microsoft Entra ID 的同盟。 或者,請考慮使用 Spring Security 透過 OAuth2/OpenID Connect 或 SAML 使用您的識別提供者。
更新用戶端應用程式
更新所有用戶端應用程式的設定,以針對已移轉的應用程式使用已發佈的 Azure Container Apps 端點。
移轉後
既然您已完成移轉,請確認應用程式如預期般運作。 接著,您可以使用下列建議,讓您的應用程式更具雲端原生。
請考慮讓應用程式使用 Spring Cloud Registry。 此元件可讓其他已部署的 Spring 應用程式和客戶端動態探索您的應用程式。 如需詳細資訊,請參閱 在 Azure Container Apps 中設定適用於 Spring 元件的 Eureka Server 設定。 然後,修改任何應用程式用戶端以使用 Spring Client Load Balancer。 Spring Client Load Balancer 可讓用戶端取得應用程式所有執行中實例的位址,並在另一個實例損毀或沒有回應時尋找可運作的實例。 如需詳細資訊,請參閱 Spring 部落格中的 Spring 秘訣:Spring Cloud Load Balancer 。
請考慮新增 Spring Cloud Gateway 實例,而不是將您的應用程式公開。 Spring Cloud Gateway 會為 Azure Container Apps 環境中部署的所有應用程式提供單一端點。 如果已部署 Spring Cloud Gateway,請確定路由規則已設定為將流量路由傳送至您新部署的應用程式。
請考慮新增 Spring Cloud Config Server,以集中管理和版本控制所有 Spring Cloud 應用程式的組態。 首先,建立 Git 存放庫來存放組態,並設定應用程式實例來使用它。 如需詳細資訊,請參閱 在 Azure Container Apps 中設定 Spring 元件的 Config Server 設定。 然後,使用下列步驟來移轉組態:
在應用程式的 src/main/resources 目錄中,使用下列內容建立 bootstrap.yml 檔案:
spring: application: name: <your-application-name>
在組態 Git 存放庫中,建立 <your-application-name>.yml 檔案,其中
your-application-name
與上一個步驟中相同。 將設定從 src/main/resources 中的 application.yml 檔案移至您建立的新檔案。 如果設定先前在 .properties 檔案中,請先將它們轉換成 YAML。 您可以找到線上工具或 IntelliJ 外掛程式來執行此轉換。在上述目錄中建立 application.yml 檔案。 您可以使用此檔案來定義在 Azure Container Apps 環境中所有應用程式之間共用的設定和資源。 這類設定通常包括數據源、記錄設定、Spring Boot 執行器設定,以及其他設定。
認可這些變更並將其推送至 Git 存放庫。
從應用程式移除 application.properties 或 application.yml 檔案。
請考慮新增 Spring 管理元件的管理員,以啟用公開執行器端點之 Spring Boot Web 應用程式的系統管理介面。 如需詳細資訊,請參閱 在 Azure Container Apps 中設定 Spring Boot Admin 元件。
請考慮新增部署管線以進行自動且一致的部署。 適用於 Azure Pipelines 和 GitHub Actions 的指示。
請考慮使用容器應用程式修訂、修訂標籤和輸入流量權數來啟用藍綠部署,這可讓您先在生產環境中測試程式代碼變更,再提供給部分或所有終端使用者使用。 如需詳細資訊,請參閱 Azure Container Apps 中的藍綠部署。
請考慮新增服務系結,以將應用程式連線至支援的 Azure 資料庫。 這些服務系結可讓您不需要將連線資訊,包括認證提供給 Spring Cloud 應用程式。
請考慮啟用 Java 開發堆疊來收集您應用程式的 JVM 核心計量。 如需詳細資訊,請參閱 Azure Container Apps 中 Java 應用程式的 Java 計量。
請考慮新增 Azure 監視器警示規則和動作群組,以快速偵測和解決異常狀況。 如需詳細資訊,請參閱 在 Azure Container Apps 中設定警示。
藉由啟用 Azure Container Apps 區域備援,請考慮在區域中跨區域複寫您的應用程式。 如果發生區域中斷,流量會進行負載平衡,並自動路由傳送至複本。 如需備援設定的詳細資訊,請參閱 Azure Container Apps 中的可靠性。
請考慮使用 應用程式閘道 上的 Web 應用程式防火牆,保護 Azure Container Apps 免於常見的惡意探索和弱點。 如需詳細資訊,請參閱使用 應用程式閘道 上的 Web 應用程式防火牆 保護 Azure Container Apps。
如果您的應用程式使用舊版 Spring Cloud Netflix 元件,請考慮將其取代為目前的替代方案,如下表所示:
舊版 目前 Spring Cloud Eureka Spring Cloud Service Registry Spring Cloud Netflix Zuul Spring Cloud 閘道 Spring Cloud Netflix Archaius Spring Cloud Config Server Spring Cloud Netflix 功能區 Spring Cloud Load Balancer (用戶端負載平衡器) Spring Cloud Hystrix Spring Cloud 斷路器 + Resilience4J Spring Cloud Netflix Turbine 微計 + Prometheus