將 Spring Boot 應用程式遷移至 Azure Spring Apps

注意

Azure Spring Apps 是 Azure Spring Cloud 服務的新名稱。 雖然服務有新的名稱,但在我們努力更新資產,例如螢幕擷取畫面、影片和圖表時,您會在某些地方看到舊名稱一段時間。

本指南說明當您想要移轉現有的 Spring Boot 應用程式以在 Azure Spring Apps 上執行時應該注意的事項。

移轉前

若要確保成功移轉,請先完成下列各節所述的評量和清查步驟。

如果您無法符合上述任何預先移轉需求,請參閱下列隨附移轉指南:

  • 將可執行檔 JAR 應用程式遷移至 Azure Kubernetes Service 上的容器(已規劃指導方針)
  • 將可執行檔 JAR 應用程式移轉至 Azure 虛擬機器(已規劃指導方針)

檢查應用程式元件

識別本機狀態

在 PaaS 環境中,任何指定時間都保證不會完全執行任何應用程式。 即使您將應用程式設定為在單一實例中執行,在下列情況下也可以建立重複的實例:

  • 應用程式必須因為失敗或系統更新而重新放置到實體主機。
  • 正在更新應用程式。

在這些情況下,原始實例會繼續執行,直到新實例完成啟動為止。 這對您的應用程式有下列潛在重大影響:

  • 無法保證單 是真正單一的。
  • 任何未保存到外部儲存體的資料,可能會比單一實體伺服器或 VM 上的資料遺失得快得多。

在移轉至 Azure Spring Apps 之前,請確定您的程式碼不包含不得遺失或重複的本機狀態。 如果本機狀態存在,請變更程式碼以將該狀態儲存在應用程式外部。 雲端就緒應用程式通常會將應用程式狀態儲存在下列位置:

判斷檔案系統是否使用和方式

尋找服務寫入和/或從本機檔案系統讀取的任何實例。 識別短期/暫存檔的寫入和讀取位置,以及寫入和讀取長期檔的位置。

注意

Azure Spring Apps 提供每個 Azure Spring Apps 實例 5 GB 的暫存儲存體,掛接在 中 /tmp 。 如果暫存檔超過該限制或寫入不同的位置,則需要變更程式碼。

唯讀靜態內容

如果您的應用程式目前提供靜態內容,您將需要其替代位置。 您可能想要考慮將靜態內容移至Azure Blob 儲存體,並新增 Azure CDN 以進行全球閃電快速下載。 如需詳細資訊,請參閱 Azure 儲存體 中的靜態網站裝載和 快速入門:整合 Azure 儲存體帳戶與 Azure CDN

動態發佈的靜態內容

如果您的應用程式允許靜態內容由您的應用程式上傳/產生,但在建立後是不可變的,您可以使用如上所述Azure Blob 儲存體和 Azure CDN,搭配 Azure 函式來處理上傳和 CDN 重新整理。 我們在使用 Azure Functions 上傳和 CDN 預先載入靜態內容時 ,提供了範例實作。

判斷任何服務是否包含 OS 特定程式碼

如果您的應用程式包含主機 OS 上具有相依性的任何程式碼,則必須重構它以移除這些相依性。 例如,您可能需要以 或 \ 取代檔案系統路徑 File.Separator 中的任何 使用 /Paths.get

切換至支援的平臺

Azure Spring Apps 提供特定版本的 JAVA 和 Spring Boot 和 Spring Cloud 的特定版本。 為了確保相容性,請先將應用程式移轉至目前環境中的其中一個支援的 JAVA 版本,然後繼續進行其餘的移轉步驟。 請務必完整測試產生的組態。 在這類測試中使用 Linux 發行版本的最新穩定版本。

注意

如果您的目前伺服器是在不支援的 JDK 上執行,此驗證特別重要(例如 Oracle JDK 或 IBM OpenJ9)。

若要取得目前的 JAVA 版本,請登入您的生產伺服器,然後執行下列命令:

java -version

如需支援的 JAVA、Spring Boot 和 Spring Cloud 版本,以及更新的指示,請參閱 準備應用程式以在 Azure Spring Apps 中部署。

判斷您的應用程式是否依賴排程的作業

排程的作業,例如[矽排程器工作] 或 [Unix cron] 作業,不應該與 Azure Spring Apps 搭配使用。 Azure Spring Apps 不會阻止您在內部部署包含排程工作的應用程式。 不過,如果您的應用程式相應放大,則每個排程期間,相同的排程工作可能會執行多次。 這種情況可能會導致非預期的後果。

清查在生產伺服器、應用程式程式碼內外執行的任何排程工作。

識別 Spring Boot 版本

檢查要移轉的每個應用程式的相依性,以判斷其 Spring Boot 版本。

Maven

在 Maven 專案中,通常可在 POM 檔案的 元素中找到 <parent> Spring Boot 版本:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.10</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
Gradle (英文)

在 Gradle 專案中,通常會在 plugins 區段中找到 Spring Boot 版本,作為外掛程式的版本 org.springframework.boot

plugins {
  id 'org.springframework.boot' version '2.7.10'
  id 'io.spring.dependency-management' version '1.0.15.RELEASE'
  id 'java'
}

針對任何使用 Spring Boot 1.x 的應用程式,請遵循 Spring Boot 2.0 移轉指南 ,將其更新為支援的 Spring Boot 版本。 如需支援的版本,請參閱 準備應用程式以在 Azure Spring Apps 中部署的 Spring Boot 和 Spring Cloud 版本 一節。

識別記錄匯總解決方案

識別您要移轉的應用程式正在使用的任何記錄匯總解決方案。 您必須在移轉中設定診斷設定,讓記錄的事件可供取用。 如需詳細資訊,請參閱 確定主控台記錄和設定診斷設定 一節。

識別應用程式效能管理 (APM) 代理程式

識別與您的應用程式搭配使用的任何應用程式效能監視代理程式。 Azure Spring Apps 支援與 Application Insights、New Relic、Elastic APM、Dynatrace 和 AppDynamics 整合。 如果應用程式使用支援的 APM,請設定移轉中的整合。 如果應用程式未使用支援的 APM,請考慮改用 Application Insights。 如需詳細資訊,請參閱 移轉 一節。

清查外部資源

識別外部資源,例如資料來源、JMS 訊息代理程式和其他服務的 URL。 在 Spring Boot 應用程式中,您通常會在名為 application.properties application.yml 的檔案 中找到 src/main/directory 資料夾中這類資源的組態。

資料庫

針對任何 SQL 資料庫,請識別連接字串。

針對 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.0.4.0")
      ...
    }

識別使用中的訊息代理程式或訊息代理程式之後,請尋找對應的設定。 在 Spring Boot 應用程式中,您通常會在應用程式目錄中的 application.properties application.yml 檔案中找到它們。

以下是 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 中 )。

身分識別提供者

識別應用程式所使用的任何識別提供者。 如需如何設定識別提供者的資訊,請參閱下列各項:

識別依賴非標準埠的任何用戶端

Azure Spring Apps 會 server.port 覆寫已部署應用程式中的設定。 如果用戶端的任何用戶端依賴 443 以外的埠可用的應用程式,您必須修改它們。

所有其他外部資源

本指南無法記錄每個可能的外部相依性。 移轉之後,您必須負責確認您可以滿足應用程式的每個外部相依性。

清查設定來源和秘密

清查密碼和安全字串

檢查生產部署上的所有屬性和組態檔和所有環境變數,以取得任何秘密字串和密碼。 在 Spring Boot 應用程式中,您通常會在 application.propertiesapplication.yml 檔案中找到這類字串。

清查憑證

記錄用於公用 SSL 端點或與後端資料庫和其他系統通訊的所有憑證。 您可以執行下列命令來檢視生產伺服器上的所有憑證:

keytool -list -v -keystore <path to keystore>

檢查部署架構

記載每個服務的硬體需求

記錄 Spring Boot 應用程式的下列資訊:

  • 執行中的實例數目。
  • 配置給每個實例的CPU數目。
  • 配置給每個實例的 RAM 數量。

檔異地復寫/散發

判斷您的 Spring Boot 應用程式實例目前是否分散於數個區域或數據中心。 記錄您要移轉之應用程式的運行時間需求/SLA。

遷移

建立 Azure Spring Apps 實例和應用程式

如果您的 Azure 訂用帳戶中尚未布建 Azure Spring Apps 實例,則為 。 然後,在那裡建立應用程式。 如需詳細資訊,請參閱 快速入門:將第一個應用程式部署至 Azure Spring Apps

確定主控台記錄並設定診斷設定

設定您的記錄,讓所有輸出都路由傳送至主控台,而不是路由傳送至檔案。

將應用程式部署至 Azure Spring Apps 之後, 請新增診斷設定 ,讓記錄的事件可供取用,例如透過 Azure 監視器 Log Analytics。

LogStash/ELK 堆疊

如果您使用LogStash/ELK Stack 進行記錄匯總,請設定診斷設定,將控制台輸出串流至 Azure 事件中樞。 然後,使用 LogStash EventHub 外掛程式 將記錄的事件內嵌至 LogStash。

Splunk

如果您使用 Splunk 進行記錄匯總,請設定診斷設定,將控制台輸出串流至 Azure Blob 儲存體。 然後,使用適用於 Microsoft 的 Splunk 附加元件 雲端服務 將記錄的事件內嵌至 Splunk。

設定永續性記憶體

如果應用程式的任何部分讀取或寫入本機檔案系統,您必須設定永續性記憶體來取代本機檔案系統。 如需詳細資訊,請參閱 在 Azure Spring Apps 中使用內建永續性記憶體。

您應該將任何暫存盤 /tmp 寫入目錄。 針對 OS 獨立性,您可以使用 取得此目錄 System.getProperty("java.io.tmpdir")。 您也可以使用 java.nio.Files::createTempFile 來建立暫存盤。

將所有憑證移轉至 KeyVault

Azure Spring Apps 不提供 JRE 金鑰存放區的存取權,因此您必須將憑證移轉至 Azure KeyVault,並變更應用程式程式代碼以存取 KeyVault 中的憑證。 如需詳細資訊,請參閱開始使用 金鑰保存庫 憑證適用於Java的 Azure 金鑰保存庫 憑證用戶端連結庫。

設定應用程式效能管理 (APM) 整合

Azure Spring Apps 提供下列 APM 整合。 請遵循連結來啟用您需要的 APM。

如果您的應用程式未使用支援的 APM,請考慮改用 Application Insights。 Azure Spring Apps 提供與 Application Insights 的深入整合,以便進行效能管理和即時回應的調整。

停用應用程式中的計量用戶端和端點

拿掉使用的任何計量用戶端,或任何在您的應用程式中公開的計量端點。

部署應用程式

如快速入門:將第一個應用程式部署至 Azure Spring Apps 中所述,部署每個已移轉的微服務(不包括 Spring Cloud 設定和登錄伺服器)。

設定個別服務秘密和外部化設定

您可以將任何個別服務組態設定插入每個服務作為環境變數。 使用 Azure 入口網站 中的下列步驟:

  1. 流覽至 Azure Spring Apps 實例,然後選取 [ 應用程式]。
  2. 選取要設定的服務。
  3. 選取設定
  4. 輸入要設定的變數。
  5. 選取 [儲存]。

Spring Cloud App Configuration Settings

移轉並啟用識別提供者

如果任何 Spring Cloud 應用程式需要驗證或授權,請確定它們已設定為存取識別提供者:

  • 如果識別提供者是 Microsoft Entra ID,就不需要變更。
  • 如果識別提供者是 內部部署的 Active Directory 樹系,請考慮使用 Microsoft Entra ID 實作混合式身分識別解決方案。 如需詳細資訊,請參閱 混合式身分識別檔
  • 如果識別提供者是另一個內部部署解決方案,例如 PingFederate,請參閱 Microsoft Entra 的自定義安裝 連線 主題,以設定與 Microsoft Entra ID 的同盟。 或者,請考慮使用 Spring Security 透過 OAuth2/OpenID 連線SAML 使用您的識別提供者。

公開應用程式

根據預設,部署至 Azure Spring Apps 的應用程式不會在外部顯示。 您可以使用下列命令將應用程式公開:

az spring app update --name <application name> --is-public true

如果您使用或想要使用 Spring Cloud Gateway,請略過此步驟。 如需詳細資訊,請參閱下列章節。

移轉後

既然您已完成移轉,請確認應用程式如預期般運作。 接著,您可以使用下列建議,讓您的應用程式更具雲端原生。

  • 請考慮讓應用程式使用 Spring Cloud Registry。 這可讓其他已部署的 Spring 應用程式和用戶端動態探索您的應用程式。 如需詳細資訊,請參閱 準備應用程式以在 Azure Spring Apps 中部署。 然後,修改任何應用程式用戶端以使用 Spring Client Load Balancer。 這可讓用戶端取得應用程式所有執行中實例的位址,並在另一個實例損毀或沒有回應時尋找可運作的實例。 如需詳細資訊,請參閱 Spring 提示:Spring Blog 中的 Spring Cloud Load Balancer

  • 請考慮新增 Spring Cloud Gateway 實例,而不是將您的應用程式公開。 Spring Cloud Gateway 會為 Azure Spring Apps 實例中部署的所有應用程式提供單一端點。 如果已部署 Spring Cloud Gateway,請確定其已設定為將流量路由傳送至新部署的應用程式。

  • 請考慮新增 Spring Cloud Config 伺服器,以集中管理及控制所有 Spring Cloud 應用程式的版本控制設定。 首先,建立 Git 存放庫來存放組態,並設定 Azure Spring Apps 實例來使用它。 如需詳細資訊,請參閱 為您的服務設定 Spring Cloud Config Server 實例。 然後,使用下列步驟來移轉組態:

    1. 在應用程式的 src/main/resources 目錄中,建立 具有下列內容的 bootstrap.yml 檔案:

        spring:
          application:
            name: <your-application-name>
      
    2. 在組態 Git 存放庫中,建立 <your-application-name.yml> 檔案,其中 your-application-name 與上一個步驟相同。 將 src/main/resources 中的 application.yml 檔案中的設定移至您剛才建立的新檔案。 如果設定先前在 .properties 檔案中,請先將它們轉換成 YAML。 您可以找到線上工具或 IntelliJ 外掛程式來執行此轉換。

    3. 在上述目錄中建立 application.yml 檔案。 您可以使用此檔案來定義將在 Azure Spring Apps 實例上所有應用程式之間共用的設定和資源。 這類設定通常包括數據源、記錄設定、Spring Boot 執行器設定,以及其他設定。

    4. 認可這些變更並將其推送至 Git 存放庫。

    5. 從應用程式移除 application.propertiesapplication.yml 檔案。

  • 請考慮新增部署管線以進行自動且一致的部署。 適用於 Azure PipelinesGitHub ActionsJenkins 的指示。

  • 請考慮先使用預備部署來測試生產環境中的程式碼變更,然後再提供給部分或所有終端使用者使用。 如需詳細資訊,請參閱 在 Azure Spring Apps 中設定預備環境。

  • 請考慮新增服務系結,以將應用程式連線至支援的 Azure 資料庫。 這些服務系結可讓您不需要將連線資訊,包括認證提供給 Spring Cloud 應用程式。

  • 請考慮使用 Azure 應用程式 Insights 來監視應用程式的效能和互動。 如需詳細資訊,請參閱 Azure Spring Apps 中的 Application Insights Java In-Process Agent。

  • 請考慮新增 Azure 監視器警示規則和動作群組,以快速偵測和解決異常狀況。 如需詳細資訊,請參閱 教學課程:使用警示和動作群組監視 Spring Cloud 資源。

  • 請考慮在另一個區域中復寫 Azure Spring Apps 部署,以降低延遲和更高的可靠性和容錯能力。 使用 Azure 流量管理員 在部署之間進行負載平衡,或使用 Azure Front Door 新增 SSL 卸除和 Web 應用程式防火牆 與 DDoS 保護。

  • 如果不需要異地復寫,請考慮新增 Azure 應用程式閘道,以使用 DDoS 保護新增 SSL 卸除和 Web 應用程式防火牆。