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

注意

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

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

移轉前

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

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

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

檢查應用程式元件

判斷文件系統是否使用和方式

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

注意

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 中部署。

識別 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 版本一節。

識別 Spring Cloud 版本

檢查您要移轉的每個應用程式的相依性,以判斷其所使用的 Spring Cloud 元件版本。

Maven

在 Maven 專案中,Spring Cloud 版本通常會在 屬性中 spring-cloud.version 設定:

  <properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>2021.0.6</spring-cloud.version>
  </properties>
Gradle (英文)

在 Gradle 專案中,Spring Cloud 版本通常會在「額外屬性」區塊中設定:

ext {
  set('springCloudVersion', "2021.0.6")
}

您必須更新所有應用程式,才能使用支援的 Spring Cloud 版本。 如需支援的版本清單,請參閱準備應用程式以在 Azure Spring Apps 中部署的 Spring Boot 和 Spring Cloud 版本一節。

識別記錄匯總解決方案

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

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

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

識別 Zipkin 相依性

判斷您的應用程式是否具有 Zipkin 的相依性。 請更新應用程式以改用 Application Insights。 如需詳細資訊,請參閱 在 Azure Spring Apps 中使用 Application Insights Java In-Process Agent 和 轉後一節。

清查外部資源

識別外部資源,例如數據源、JMS 訊息代理程式和其他服務的URL。 在 Spring Cloud 應用程式中,您通常會在下列其中一個位置找到這類資源的設定:

  • src/main/directory 資料夾中,檔案中通常稱為 application.propertiesapplication.yml
  • 在您在上一個步驟中識別的 Spring Cloud Config 存放庫。

資料庫

針對任何 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 Cloud 應用程式中,您通常會在 application.properties 中尋找它們,並在 應用程式目錄中或 Spring Cloud Config 伺服器存放庫中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 快取(在 JavaXML 中)。

身分識別提供者

識別需要驗證和/或授權的所有身分識別提供者和所有 Spring Cloud 應用程式。 如需如何設定識別提供者的資訊,請參閱下列資源:

透過 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 存放庫中application.yml 檔案中找到這類字串。

清查憑證

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

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

判斷是否使用 Spring Cloud Vault

如果您使用 Spring Cloud Vault 來儲存和存取秘密,請識別支援秘密存放區(例如 HashiCorp Vault 或 CredHub)。 然後識別應用程式程式代碼所使用的所有秘密。

找出組態伺服器來源

如果您的應用程式使用 Spring Cloud Config 伺服器,請識別設定的儲存位置。 您通常會在 bootstrap.yml 或 bootstrap.properties 檔案中找到此設定,或有時位於 application.ymlapplication.properties 檔案中 此設定看起來會像下列範例:

spring.cloud.config.server.git.uri: file://${user.home}/spring-cloud-config-repo

雖然 git 最常用來作為 Spring Cloud Config 的備份數據存放區,如先前所示,其他可能的後端之一可能正在使用中。 如需其他後端的相關信息,請參閱 Spring Cloud Config 檔,例如關係資料庫(JDBC)SVN本機文件系統

注意

如果您的組態伺服器資料儲存在內部部署,例如 GitHub Enterprise,您必須透過 Git 存放庫將它提供給 Azure Spring Apps。

檢查部署架構

記載每個服務的硬體需求

針對每個 Spring Cloud 服務(不包括組態伺服器、登錄或閘道),記載下列資訊:

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

檔異地復寫/散發

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

識別略過服務登錄的用戶端

識別叫用任何要移轉之服務的用戶端應用程式,而不需使用 Spring Cloud Service Registry。 移轉之後,將無法再進行這類調用。 更新這類用戶端以在移轉之前使用 Spring Cloud OpenFeign

遷移

拿掉受限制的組態

在您要移轉的服務中,尋找並移除下列限制設定的任何明確指派。 這些屬性會自動插入您的應用程式環境,以存取 Config Server 和服務探索。 如果這些屬性位於您的 Config Server 應用程式檔案中,您可能會遇到衝突和非預期的行為。 如需詳細資訊,請參閱在 Azure Spring Apps 中設定受控 Spring Cloud Config Server 的限制一節

  • eureka.client.service-url.defaultZone
  • eureka.client.tls.keystore
  • eureka.instance.preferIpAddress
  • eureka.instance.instance-id
  • server.port
  • spring.cloud.config.tls.keystore
  • spring.config.import
  • spring.application.name
  • spring.jmx.enabled
  • management.endpoints.jmx.exposure.include

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

在您的 Azure 訂用帳戶中布建 Azure Spring Apps 實例。 然後,為您要移轉的每個服務布建應用程式。 請勿包含 Spring Cloud 登錄和組態伺服器。 請包含 Spring Cloud Gateway 服務。 如需指示,請參閱 快速入門:將第一個應用程式部署至 Azure Spring Apps

準備 Spring Cloud Config 伺服器

在 Azure Spring Apps 實例中設定組態伺服器。 如需詳細資訊,請參閱 為您的服務設定 Spring Cloud Config Server 實例。

注意

如果您目前的 Spring Cloud Config 存放庫位於本機文件系統或內部部署,您必須先將組態檔移轉至私人雲端式存放庫,例如 GitHub、Azure Repos 或 BitBucket。

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

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

將應用程式部署至 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 來建立暫存盤。

VMware Tanzu 元件

在企業層中,會提供 VMware Tanzu® 的應用程式組態服務,以支援應用程式的外部化組態。 受控 Spring Cloud Config Server 無法在企業層中使用,而且只能在 Azure Spring Apps 的標準和基本層中使用。

Tanzu 的應用程式組態服務

Tanzu 的應用程式組態服務是其中一個商業 VMware Tanzu 元件。 Tanzu 的應用程式組態服務是 Kubernetes 原生的,與 Spring Cloud Config Server 不同。 適用於 Tanzu 的應用程式組態服務可讓您管理 Kubernetes 原生 ConfigMap 資源,這些資源會從一或多個 Git 存放庫中定義的屬性填入。

在企業層中,沒有 Spring Cloud Config Server,但您可以使用 Tanzu 的應用程式設定服務來管理集中式設定。 如需詳細資訊,請參閱 使用 Tanzu 的應用程式組態服務

若要使用適用於 Tanzu 的應用程式組態服務,請針對每個應用程式執行下列步驟:

  1. 新增明確的應用程式系結,以宣告您的應用程式需要使用適用於 Tanzu 的應用程式組態服務。

    注意

    當您變更系結/解除系結狀態時,您必須重新啟動或重新部署應用程式,讓變更生效。

  2. 設定組態檔模式。 配置檔模式可讓您選擇應用程式所使用的應用程式和設定檔。 如需詳細資訊,請參閱使用 Tanzu 應用程式組態服務的模式一節。

    另一個選項是設定組態檔模式與您的應用程式部署同時,如下列範例所示:

    az spring app deploy \
        --name <app-name> \
        --artifact-path <path-to-your-JAR-file> \
        --config-file-pattern <config-file-pattern>
    

適用於 Tanzu 的應用程式組態服務會在 Kubernetes 上執行。 為了協助啟用透明的本機開發體驗,我們提供下列建議。

  • 如果您已經有 Git 存放庫來儲存外部化組態,您可以在本機將 Spring Cloud Config Server 設定為應用程式的集中式組態。 設定伺服器啟動之後,它會複製 Git 存放庫,並透過其 Web 控制器提供存放庫內容。 如需詳細資訊,請參閱 Spring 檔中的 Spring Cloud Configspring-cloud-config-client可讓您的應用程式從 Config Server 自動挑選外部組態。

  • 如果您沒有 Git 存放庫,或不想在本機設定 Config Server,則可以直接在專案中使用組態檔。 建議您使用配置檔來隔離組態檔,使其只在開發環境中使用。 例如,使用 dev 作為配置檔。 然後,您可以在 src/main/resource 資料夾中建立application-dev.yml檔案來儲存組態。 若要讓您的應用程式使用此設定,請使用 --spring.profiles.active=dev在本機啟動應用程式。

Tanzu Service Registry

VMware Tanzu® 服務登錄 是其中一個商業 VMware Tanzu 元件。 Tanzu Service Registry 為您的企業層應用程式提供服務探索模式的實作,這是微服務架構的主要原則之一。 您的應用程式可以使用 Tanzu 服務登錄來動態探索和呼叫已註冊的服務。 使用 Tanzu 服務登錄,最好是手動設定服務的每個用戶端,這可能會很困難,或採用某種形式的存取慣例,這在生產環境中可能會很脆弱。 如需詳細資訊,請參閱 使用 Tanzu 服務登錄

將 Spring Cloud Vault 秘密遷移至 Azure KeyVault

您可以使用 Azure KeyVault Spring Boot Starter,透過 Spring 直接將秘密插入應用程式。 如需詳細資訊,請參閱如何使用適用於 Azure 的 Spring Boot Starter 金鑰保存庫

注意

移轉可能需要重新命名某些秘密。 據以更新您的應用程式程序代碼。

將所有憑證移轉至 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 應用程式(不包括 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 端點。

移轉後

  • 請考慮新增部署管線以進行自動且一致的部署。 適用於 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 應用程式防火牆。

  • 如果您的應用程式使用舊版 Spring Cloud Netflix 元件,請考慮將其取代為目前的替代方案:

    舊版 目前
    Spring Cloud Eureka Spring Cloud Service Registry
    Spring Cloud Netflix Zuul Spring Cloud Gateway
    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