共用方式為


將 Spring Boot 應用程式遷移至 Azure App Service

本指南說明當您想要將現有的 Spring Boot 應用程式移轉至 Azure App Service 時應該注意的事項。

移轉前

為確保成功移轉,在開始之前,請先完成下列各節中所述的評量和清查步驟。

切換至支持的平臺

App Service 提供特定版本的 Java SE。 若要確保相容性,請先將應用程式移轉至其目前環境的其中一個支援版本,再繼續進行其餘步驟。 請務必完整測試產生的組態。 在這類測試中使用Linux發行版的最新穩定版本。

備註

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

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

java -version

在 Azure App 服務,Java 8 的二進位檔會從 Eclipse Temurin 提供。 針對 Java 11、17 和所有未來的 JAVA LTS 版本,App Service 會提供 OpenJDK 的Microsoft組建。 這些二進位檔可在下列網站免費下載:

清查外部資源

識別外部資源,例如數據源、JMS 訊息代理程式和其他服務的URL。 在 Spring Boot 應用程式中,您通常會在 src/main/directory 資料夾中、通常稱為 application.propertiesapplication.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 快取(在 JavaXML 中)。

身份提供者

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

所有其他外部資源

在本指南中記載每個可能的外部相依性並不可行。 您的小組有責任在App Service 移轉之後確認應用程式的每個外部相依性都能滿足。

清查秘密

密碼和安全字串

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

清查憑證

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

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

判斷檔案系統是否被使用及如何使用

每當使用應用程式伺服器上的檔案系統時,都必須重新設定,或在罕見的情況下,還需要進行架構變更。 您可以識別下列部分或所有案例。

只讀靜態內容

如果您的應用程式目前提供靜態內容,您需要替代位置。 您應該考慮將靜態內容移至 Azure Blob 記憶體,並新增 Azure Front Door 以全域快速下載。 如需詳細資訊,請參閱 Azure 儲存體中的靜態網站裝載將 Azure 儲存體帳戶與 Azure Front Door 整合

特殊案例

某些生產案例可能需要額外的變更,或施加額外的限制。 雖然這類案例可能不常發生,但請務必確保它們無法套用至您的應用程式或正確解決。

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

無法搭配 App Service 使用排程器工作或 cron 作業等排程工作。 App Service 不會防止您在內部部署包含排程工作的應用程式。 不過,如果您的應用程式擴充,則相同的排程工作在排程的時間段內可能會執行多次。 這種情況可能會導致非預期的後果。

清查應用程式進程內外的任何排程工作。

判斷您的應用程式是否包含 OS 特定程式代碼

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

識別在生產伺服器上執行的所有外部進程/精靈

在應用程式伺服器外部執行的進程,例如監視精靈,必須在其他地方移轉或消除。

識別處理非 HTTP 請求或多個端口

App Service 僅支援單一埠上的單一 HTTP 端點。 如果您的應用程式接聽多個埠,或使用 HTTP 以外的通訊協定接受要求,請勿使用 Azure App Service。

遷移

參數化組態

請確定可以從環境變數讀取所有外部資源座標(例如資料庫連接字串)和其他可自定義的設定。 如果您要移轉 Spring Boot 應用程式,則所有組態設定都應該已可外部設定。 如需詳細資訊,請參閱 Spring Boot 檔中 的外部化組態

以下是從 SERVICEBUS_CONNECTION_STRING 檔案參考環境變數的範例:

spring.jms.servicebus.connection-string=${SERVICEBUS_CONNECTION_STRING}
spring.jms.servicebus.topic-client-id=contoso1
spring.jms.servicebus.idle-timeout=10000

佈建 App Service 方案

可用的服務方案清單中,選取其規格符合或超過目前生產硬體的方案。

備註

如果您打算執行預備/Canary 部署或使用 部署位置,App Service 方案必須包含該額外的容量。 我們建議針對 Java 應用程式使用進階或更高方案。

建立 App Service 方案

建立及部署 Web 應用程式(s)

您必須在 App Service 方案上建立 Web 應用程式(選擇 “Java SE” 作為運行時間堆棧),以取得您想要執行的每個可執行 JAR 檔案。

Maven 應用程式

如果您的應用程式是從 Maven POM 檔案建置的,請使用適用於 Maven 的 Webapp 外掛程式來建立 Web 應用程式並部署您的應用程式。 如需詳細資訊,請參閱快速入門:在 Azure App 服務 上建立Java應用程式。

非 Maven 應用程式

如果您無法使用 Maven 外掛程式,則必須透過其他機制布建 Web 應用程式,例如:

建立 Web 應用程式之後,請使用其中一個 可用的部署機制 來部署您的應用程式。 可能的話,您的應用程式應該上傳至 /home/site/wwwroot/app.jar。 如果您不想將 JAR 重新命名為 app.jar,您可以上傳包含執行 JAR 的指令的 Shell 腳本。 然後在入口網站的 [組態] 區段中的 [ 啟動檔案] 文本框中,貼上此腳本的完整路徑。 啟動指令碼不會從其放置所在的目錄來執行。 因此,請一律使用絕對路徑在啟動指令碼中參考檔案 (例如: java -jar /home/myapp/myapp.jar)。

移轉 JVM 執行時間選項

如果您的應用程式需要特定的運行時間選項, 請使用最適當的機制來指定它們

設定自訂網域和 SSL

如果您的應用程式將在自定義網域上顯示,您必須將 Web 應用程式對應至它。 如需詳細資訊,請參閱教學課程:將現有的自定義 DNS 名稱對應至 Azure App 服務

然後,您必須將該網域的 SSL 憑證系結至 App Service Web 應用程式。 如需詳細資訊,請參閱在 Azure App 服務 中使用SSL系結保護自定義 DNS 名稱。

匯入後端憑證

所有與後端系統通訊的憑證,例如資料庫,都必須提供給 App Service 使用。 如需詳細資訊,請參閱 在App Service中新增SSL憑證。

移轉外部資源座標和其他設定

請遵循 下列步驟來移轉連接字串和其他設定

備註

針對任何在參數化組態區段中透過變數參數化的 Spring Boot 應用程式設定,必須在應用程式組態中定義這些環境變數。 任何未使用環境變數明確參數化的 Spring Boot 應用程式設定,仍可透過應用程式組態加以覆寫。 例如:

spring.jms.servicebus.connection-string=${CUSTOMCONNSTR_SERVICE_BUS}
spring.jms.servicebus.topic-client-id=contoso1
spring.jms.servicebus.idle-timeout=1800000

App Service 應用程式組態

移轉排程的工作

若要在 Azure 上執行排程的工作,請考慮使用 Azure Functions 的定時器觸發程式。 您不需要將作業程式代碼本身移轉至函式。 函式可以直接叫用應用程式中的URL來觸發作業。 如果這類作業執行必須動態叫用和/或集中追蹤,請考慮使用 Spring Batch

或者,您可以使用循環觸發程式建立邏輯應用程式來叫用 URL,而不需在應用程式外部撰寫任何程式代碼。 如需詳細資訊,請參閱 概觀 - 什麼是 Azure Logic Apps?使用 Azure Logic Apps 中的週期性觸發程式建立、排程和執行週期性工作和工作流程。

備註

若要防止惡意使用,您可能需要確保作業調用端點需要認證。 在此情況下,觸發程式函式必須提供認證。

移轉並啟用識別提供者

如果您的應用程式需要驗證或授權,請確定它們已設定為使用下列指引來存取識別提供者:

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

重新啟動和抽煙測試

最後,您必須重新啟動 Web 應用程式,以套用所有設定變更。 重新啟動完成後,請確認您的應用程式正在正確執行。

移轉後

既然您的應用程式已移轉至 Azure App 服務 您應該確認它如預期般運作。 完成之後,我們有一些建議,可讓您的方案更符合雲端技術。

建議