將 Spring Boot 應用程式遷移至 Azure Container Apps
本指南說明當您想要移轉現有的 Spring Boot 應用程式以在 Azure Container Apps 上執行時應該注意的事項。
移轉前
為確保成功移轉,在開始之前,請先完成下列各節中所述的評量和清查步驟。
如果您無法符合上述任何預先移轉需求,請參閱下列隨附移轉指南:
- 將可執行的 JAR 應用程式遷移至 Azure Kubernetes Service 上的容器(已規劃指導方針)
- 將可執行的 JAR 應用程式移至 Azure 虛擬機器(已規劃指導方針)
檢查應用程式元件
識別本機狀態
在 PaaS 環境中,任何指定時間都保證不會完全執行任何應用程式。 即使您將應用程式設定為在單一實例中執行,在下列情況下也可以建立重複的實例:
- 應用程式必須因為失敗或系統更新而重新放置到實體主機。
- 正在更新應用程式。
在這些情況下,原始實例會繼續執行,直到新實例完成啟動為止。 此模式可能會對您的應用程式造成下列潛在重大影響:
- 無法保證單 一 是真正單一的。
- 任何未保存到外部記憶體的數據,可能會比單一實體伺服器或 VM 上的資料更快遺失。
在移轉至 Azure Container Apps 之前,請確定您的程式代碼不包含不得遺失或重複的本機狀態。 如果本機狀態存在,請變更程式代碼以將該狀態儲存在應用程式外部。 雲端就緒應用程式通常會將應用程式狀態儲存在位置,例如下列選項:
- Azure Cache for Redis
- Azure Cosmos DB
- 另一個外部資料庫,例如 Azure SQL、適用於 MySQL 的 Azure 資料庫 或 適用於 PostgreSQL 的 Azure 資料庫。
- 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 Batch 架構為基礎的暫時應用程式,例如 Unix cron 作業或短期應用程式,應該在 Azure Container Apps 上以作業的形式執行。 如需詳細資訊,請參閱 Azure Container Apps 中的作業。 如果您的應用程式是長時間執行的應用程式,並且會定期使用製片或 Spring Batch 等排程架構來執行工作,Azure Container Apps 可以裝載該應用程式。 不過,應用程式必須適當地處理調整,以避免在相應放大或滾動升級期間,相同應用程式實例執行多次的競爭狀況。
清查在生產伺服器上、應用程式程式碼內外執行的任何排程工作。
識別 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 Boot 和 Spring Cloud 版本。
識別記錄匯總解決方案
識別您要移轉的應用程式正在使用的任何記錄匯總解決方案。 您必須在移轉中設定診斷設定,讓記錄的事件可供取用。 如需詳細資訊,請參閱 確定控制台記錄和設定診斷設定 一節。
識別應用程式效能管理 (APM) 代理程式
識別應用程式所使用的任何應用程式效能管理代理程式。 Azure Containers Apps 不提供 APM 整合的內建支援。 您需要準備容器映像,或將 APM 工具直接整合到程式代碼中。 如果您想要測量應用程式的效能,但尚未整合任何 APM,請考慮使用 Azure 應用程式 Insights。 如需詳細資訊,請參閱 移轉 一節。
清查外部資源
識別外部資源,例如數據源、JMS 訊息代理程式和其他服務的URL。 在 Spring Boot 應用程式中,您通常會在 src/main/resources 資料夾中,在通常稱為 application.properties 或 application.yml 的檔案中找到這類資源的組態。
資料庫
針對 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 Boot 應用程式中,您通常會在 application.properties 中尋找它們,並在應用程式目錄中application.yml檔案。
注意
Microsoft 建議您使用最安全的可用驗證流程。 此程式中所述的驗證流程,例如資料庫、快取、傳訊或 AI 服務,在應用程式中需要高度的信任,而且不會在其他流程中帶來風險。 只有在更安全的選項,例如無密碼或無密鑰連線的受控識別時,才能使用此流程。 針對本機計算機作業,偏好使用無密碼或無密鑰連線的使用者身分識別。
以下是 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=<password>
如需 ActiveMQ 設定的詳細資訊,請參閱 Spring Boot 傳訊檔。
以下是 application.yaml 檔案的 IBM MQ 範例:
ibm:
mq:
queueManager: qm1
channel: dev.ORDERS
connName: localhost(14)
user: admin
password: <password>
如需 IBM MQ 組態的詳細資訊,請參閱 IBM MQ Spring 元件檔。
識別外部快取
識別使用中的任何外部快取。 Redis 經常透過 Spring Data Redis 使用。 如需組態資訊,請參閱 Spring Data Redis 檔。
藉由搜尋個別的組態,以判斷會話數據是否透過 Spring Session 快取(在 Java 或 XML 中)。
身分識別提供者
識別應用程式所使用的任何識別提供者。 如需如何設定識別提供者的資訊,請參閱下列各項:
- 如需 OAuth2 組態,請參閱 Spring Security 參考。
- 如需 Auth0 Spring Security 設定,請參閱 Auth0 Spring Security 檔。
- 如需 PingFederate Spring Security 設定,請參閱 Auth0 PingFederate 指示。
識別依賴非標準埠的任何用戶端
Azure Container Apps 可讓您根據 Azure Container Apps 資源設定來公開埠。 例如,Spring Boot 應用程式預設會接聽 8080 的埠,但您可以視需要使用 server.port
或 環境變數 SERVER_PORT
進行設定。
所有其他外部資源
本指南無法記錄每個可能的外部相依性。 移轉之後,您必須負責確認您可以滿足應用程式的每個外部相依性。
清查設定來源和秘密
清查密碼和安全字串
檢查生產部署上的所有屬性和組態檔和所有環境變數,以取得任何秘密字串和密碼。 在 Spring Boot 應用程式中,您通常會在 application.properties 或 application.yml 檔案中找到這類字串。
清查憑證
記錄用於公用 SSL 端點或與後端資料庫和其他系統通訊的所有憑證。 您可以執行下列命令來檢視實際執行伺服器上的所有憑證:
keytool -list -v -keystore <path to keystore>
檢查部署架構
記載每個服務的硬體需求
記錄 Spring Boot 應用程式的下列資訊:
- 執行中的實例數目。
- 配置給每個實例的CPU數目。
- 配置給每個實例的 RAM 數量。
檔異地復寫/散發
判斷您的 Spring Boot 應用程式實例目前是否分散於數個區域或數據中心。 記錄您要移轉之應用程式的運行時間需求/SLA。
遷移
建立 Azure Container Apps 環境並部署應用程式
在您的 Azure 訂用帳戶中布建 Azure Container Apps 實例。 其安全裝載環境會連同它一起建立。 如需詳細資訊,請參閱快速入門:使用 Azure 入口網站部署您的第一個容器應用程式。
確定主控台記錄並設定診斷設定
設定您的記錄,以確保所有輸出都會路由傳送至主控台,而不是路由傳送至檔案。
將應用程式部署至 Azure Container Apps 之後,您可以在 Container Apps 環境中設定記錄選項,以定義一或多個記錄的目的地。 這些目的地可以包含 Azure 監視器 Log Analytics、Azure 事件中樞,甚至是其他第三方監視解決方案。 您也可以選擇停用記錄數據,並只在運行時間檢視記錄。 如需詳細的設定指示,請參閱 Azure Container Apps 中的記錄記憶體和監視選項。
設定永續性記憶體
如果應用程式的任何部分讀取或寫入本機檔案系統,您需要設定永續性記憶體來取代本機檔案系統。 您可以指定要透過應用程式設定在容器中掛接的路徑,並將它與應用程式所使用的路徑對齊。 如需詳細資訊,請參閱 在 Azure Container Apps 中使用記憶體掛接。
將所有憑證移轉至 KeyVault
Azure Containers Apps 支援應用程式之間的安全通訊。 您的應用程式不需要管理建立安全通訊的程式。 您可以將私人憑證上傳至 Azure Container Apps,或使用 Azure Container Apps 所提供的免費受控憑證。 建議使用 Azure 金鑰保存庫 來管理憑證。 如需詳細資訊,請參閱 Azure Container Apps 中的憑證。
設定應用程式效能管理 (APM) 整合
無論您的應用程式是從容器映像或程序代碼部署,Azure Container Apps 都不會干擾您的映像或程序代碼。 因此,將應用程式與 APM 工具整合取決於您自己的喜好設定和實作。
如果您的應用程式未使用支援的 APM,Azure 應用程式 Insights 是一個選項。 如需詳細資訊,請參閱將 Azure 監視器 Application Insights 與 Spring Boot 搭配使用。
部署應用程式
部署每個已移轉的微服務(不包括 Spring Cloud Config Server 和 Spring Cloud Service Registry),如使用 az containerapp up 命令部署 Azure Container Apps 中所述。
設定個別服務秘密和外部化設定
您可以將組態設定插入每個應用程式作為環境變數。 您可以將這些變數設定為手動專案或秘密的參考。 如需設定的詳細資訊,請參閱 管理 Azure Container Apps 上的環境變數。
移轉並啟用識別提供者
如果任何 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 的應用程式可透過應用程式 URL 存取。 如果您的應用程式部署在受控環境的內容中,且具有自己的虛擬網路,您必須判斷應用程式的輔助功能層級,以只允許來自虛擬網路的公用輸入或輸入。 如需詳細資訊,請參閱 Azure 容器應用程式環境中的網路功能。
移轉後
既然您已完成移轉,請確認應用程式如預期般運作。 接著,您可以使用下列建議,讓您的應用程式更具雲端原生。
請考慮讓應用程式使用 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。