通过


你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 Spring Cloud 应用程序迁移到 Azure Container Apps

本指南介绍在迁移现有 Spring Cloud 应用程序以在 Azure 容器应用上运行时应注意的内容。

迁移前

若要确保迁移成功,请在开始之前完成以下部分中所述的评估和清单步骤。

如果无法满足任何预迁移要求,请参阅以下伴随迁移指南:

  • 将可执行 JAR 应用程序迁移到Azure Kubernetes Service上的容器(计划指南)
  • 将可执行 JAR 应用程序迁移到 Azure 虚拟机(计划指南)

检查应用程序组件

确定文件系统是否被使用以及如何使用

标识服务从本地文件系统读取或写入到的任何实例。 请注意哪些文件是短期或临时文件,哪些文件是长期存在的。

Azure Container Apps提供多种类型的存储。 通过使用临时存储,可以在正在运行的容器或副本中读取和写入临时数据。 通过使用 Azure 文件存储,可以提供多个容器可以共享的永久存储。 有关详细信息,请参阅 在 Azure 容器应用中使用存储挂载

如果应用程序提供 只读静态内容,请考虑将其移动到 Azure Blob 存储并添加用于全局分发的 Azure CDN。 有关详细信息,请参阅 Azure Storage 中的静态网站托管快速入门:将 Azure 存储帐户与 Azure CDN 集成

如果应用程序处理 动态发布的静态内容 (在创建后上传或生成的内容不会更改),则可以集成 Azure Blob 存储和 Azure CDN。 还可以使用 Azure 函数来管理上传和触发 CDN 刷新。 有关示例实现,请参阅 使用 Azure Functions 上传和 CDN 预加载静态内容

确定是否有服务包含特定于 OS 的代码

如果应用程序包含具有主机 OS 依赖项的代码,请重构它以删除这些依赖项。 例如,将文件系统路径中/\的任何用法替换为File.SeparatorPaths.get

切换到受支持的平台

如果手动创建 Dockerfile 并将容器化应用程序部署到 Azure 容器应用,则可以完全控制部署,包括 JRE/JDK 版本。

对于从项目部署,Azure 容器应用提供特定版本的 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 容器应用上的 Java 概述

确定 Spring Boot 版本

检查要迁移的每个应用程序的依赖项以确定其 Spring Boot 版本。

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 项目中,在 plugins 部分查找 Spring 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 3.0 迁移指南 更新到受支持的版本。 有关支持的版本,请参阅 Spring Boot 和 Spring Cloud 版本

确定 Spring Cloud 版本

检查要迁移的每个应用程序的依赖项,以确定其使用的 Spring Cloud 组件的版本。

Maven

在 Maven 项目中,在属性中 spring-cloud.version 设置 Spring Cloud 版本:

  <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 容器应用不提供对 APM 集成的内置支持。 需要准备好容器镜像或将 APM 工具直接集成到代码中。 若要衡量应用程序的性能,但尚未集成任何 APM,请考虑使用 Azure Application Insights。 有关详细信息,请参阅 “迁移 ”部分。

清点外部资源

标识外部资源,如数据源、JMS 消息代理和其他服务的 URL。 在 Spring Cloud 应用程序中,通常会在以下位置之一中找到此类资源的配置:

  • src/main/resources 文件夹中,文件通常称为 application.propertiesapplication.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.xmlbuild.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")
      ...
    }

确定使用的代理后,找到相应设置。 通常可在 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 组件文档

标识外部缓存

确定正在使用的任何外部缓存。 在很多情况下,你会通过 Spring Data Redis 来使用 Redis。 有关配置信息,请参阅 Spring Data Redis 文档。

通过搜索相应的配置(在 JavaXML 中)来确定是否通过 Spring Session 缓存会话数据。

身份提供者

确定需要身份验证和授权的所有标识提供者和所有 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.propertiesapplication.yml 文件中查找单个服务或 Spring Cloud 配置服务器存储库中的这些字符串。

清单证书

记录用于公共 SSL 终结点或与后端数据库和其他系统的通信的所有证书。 可以通过运行以下命令来查看生产服务器上的所有证书:

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

确定是否使用 Spring Cloud Vault

如果使用 Spring Cloud Vault 存储和访问机密,请标识后盾机密存储 ,例如 HashiCorp Vault 或 CredHub。 然后标识应用程序代码使用的所有机密。

查找配置服务器源

如果应用程序使用 Spring Cloud 配置服务器,请确定配置的存储位置。 通常在 bootstrap.ymlbootstrap.properties 文件中或在 application.ymlapplication.properties 文件中查找此设置。 设置如下所示:

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

虽然 git 最常用作 Spring Cloud Config Server 的后盾数据存储,如前所述,但应用程序可能会使用其他可能的后端之一。 有关其他后端(例如关系数据库(JDBC)SVN本地文件系统的信息,请参阅 Spring Cloud 配置服务器文档

检查部署体系结构

记录每个服务的硬件要求

对于每个 Spring Cloud 服务(不包括配置服务器、注册表或网关),记录以下信息:

  • 正在运行的实例数。
  • 为每个实例分配的 CPU 数量。
  • 为每个实例分配的 RAM 量。

文档异地复制和分发

确定 Spring Cloud 应用程序当前是否分布在多个区域或数据中心。 记录要迁移的应用程序的运行时间要求和 SLA。

确定绕过服务注册表的客户端

确定调用任何要迁移的服务的客户端应用程序,而无需使用 Spring Cloud 服务注册表。 迁移后,无法再进行此类调用。 在迁移之前更新这些客户端以使用 Spring Cloud OpenFeign

Migration

删除受限配置

Azure 容器应用环境提供托管的 Eureka 服务器、Spring Cloud 配置服务器和管理员。将应用程序绑定到 Java 组件时,Azure 容器应用会将相关属性作为系统环境变量注入。 根据 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 注册表和配置服务器运行的应用。 有关详细信息,请参阅 Quickstart:使用 Azure 门户部署第一个容器应用

准备 Spring Cloud Config Server

在适用于 Spring 组件的 Azure Container Apps 中设置配置服务器。 有关详细信息,请参阅 Azure Container Apps0 中用于 Spring 组件的 Config Server 配置设置。

注释

如果当前的 Spring Cloud 配置存储库位于本地文件系统或本地,则首先需要将配置文件迁移到基于云的存储库,例如 GitHub、Azure Repos 或 BitBucket。

确保控制台日志记录并配置诊断设置

配置日志记录以确保所有输出都转到控制台而不是文件。

将应用程序部署到 Azure 容器应用后,可以在容器应用环境中配置日志记录选项,以定义日志的一个或多个目标。 这些目标可能包括 Azure Monitor Log Analytics、Azure 事件中心,甚至其他第三方监视解决方案。 您还可以禁用日志数据,并仅在运行时查看日志。 有关详细的配置说明,请参阅 Azure 容器应用中的日志存储和监视选项

配置持久性存储

如果应用程序的任何部分要读写本地文件系统,则需要配置持久性存储来替代本地文件系统。 可以通过应用程序设置指定装载到容器中的路径,并将其与应用正在使用的路径保持一致。 有关详细信息,请参阅 在 Azure 容器应用中使用存储挂载

将 Spring Cloud Vault 机密迁移到 Azure Key Vault

可以使用 Azure Key Vault Spring Boot Starter 将机密直接注入到应用程序中。 有关详细信息,请参阅 如何使用 Spring Boot Starter for Azure Key Vault

注释

迁移可能需要对一些机密重命名。 请相应地更新应用程序代码。

将所有证书迁移到 Key Vault

Azure 容器应用支持应用之间的安全通信。 应用程序无需管理建立安全通信的过程。 可以将专用证书上传到Azure Container Apps或使用Azure Container Apps提供的免费托管证书。 建议使用Azure Key Vault来管理证书。 有关详细信息,请参阅 Azure 容器应用中的证书

配置应用程序性能管理 (APM) 集成

如果已在容器中配置了 APM 相关变量,请确保可以连接到目标 APM 平台。 如果 APM 配置引用容器中的环境变量,请相应地在 Azure 容器应用上设置运行时环境变量。 安全地处理敏感信息,例如连接字符串。 你可以将其指定为机密,也可以引用存储在Azure Key Vault中的机密。

配置每个服务的机密和外部化设置

可以将配置设置作为环境变量注入每个容器。 变量中的任何更改都会为现有应用创建一个新版本。 机密是键值对,在所有版本中都有效。

迁移和启用标识提供者

如果有任何 Spring Cloud 应用程序需要身份验证或授权,请遵照以下指导原则确保它们已配置为访问标识提供程序:

  • 如果标识提供者是 Microsoft Entra ID,请不要进行任何更改。
  • 如果标识提供者是本地 Active Directory 林,请考虑使用 Microsoft Entra ID 实现混合标识解决方案。 有关指南,请参阅 混合标识文档
  • 如果标识提供者是另一个本地解决方案(如 PingFederate),请查阅 Microsoft Entra Connect 的自定义安装主题,以配置与 Microsoft Entra ID 的联合身份验证。 或者,考虑使用 Spring 安全性通过 OAuth2/OpenID ConnectSAML 来使用标识提供者。

更新客户端应用程序

更新所有客户端应用程序的配置,将已发布的 Azure 容器应用终结点用于迁移的应用程序。

迁移后

完成迁移后,请验证应用程序是否按预期工作。 以下部分介绍了有关使应用程序更具云原生性和可操作性的建议。

针对云原生模式进行优化

以下建议可帮助你采用 Spring Cloud 组件和 Azure 容器应用的 Java 组件,使应用程序更具云原生的特性。

服务发现和负载均衡

使应用程序能够使用 Spring Cloud 注册表组件,以便其他已部署的 Spring 应用程序和客户端可以动态发现它。 有关详细信息,请参阅 Azure Container Apps0 中用于 Spring 组件的 Eureka Server 的配置设置。

然后,修改任何应用程序客户端以使用 Spring Client Load Balancer。 使用 Spring Client 负载均衡器时,客户端会获取应用程序的所有正在运行实例的地址,并在另一个实例损坏或无响应时找到一个有效实例。 有关详细信息,请参阅 Spring Blog 中的 Spring 提示:Spring Cloud Load Balancer

API 网关

请考虑添加 Spring Cloud Gateway 实例。 Spring Cloud Gateway 为Azure Container Apps环境中部署的所有应用程序提供单个终结点。 如果已部署 Spring Cloud Gateway,请确保已配置路由规则以将流量路由到新部署的应用程序。

集中配置

考虑添加 Spring Cloud Config Server,以便集中管理所有 Spring Cloud 应用程序的配置并对其进行版本控制。 首先,创建 Git 存储库来容纳配置并配置应用实例以使用它。 有关详细信息,请参阅 Azure Container Apps0 中用于 Spring 组件的 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 Boot 执行器配置。

  4. 提交这些更改并将其推送到 Git 存储库。

  5. 从应用程序中删除 application.propertiesapplication.yml 文件。

管理

考虑添加 Admin for Spring 托管组件,为公开执行器终结点的 Spring Boot Web 应用程序启用管理界面。 有关详细信息,请参阅 在 Azure Container Apps

改进操作准备情况

以下建议可帮助你增强迁移应用程序的可靠性、可观测性和部署做法。

  • CI/CD 管道:添加一个用于自动且一致部署的管道。 可以查看有关 Azure PipelinesGitHub Actions 的说明。
  • 蓝绿部署:使用容器应用修订、修订标签和入口流量权重测试生产中的代码更改,然后再将其提供给最终用户。 有关详细信息,请参阅 Azure Container Apps 中的蓝绿部署
  • 服务绑定:添加服务绑定以将应用程序连接到受支持的 Azure 数据库。 服务绑定无需向 Spring Boot 应用程序提供连接信息(包括凭据)。
  • JVM 指标:启用 Java 开发堆栈以收集 JVM 核心指标。 有关详细信息,请参见 Azure Container Apps 中的 Java 应用程序的 Java 指标
  • 警报:添加 Azure Monitor 警报规则和操作组,以快速检测和解决异常情况。 有关详细信息,请参阅 在 Azure Container Apps
  • 区域冗余:通过启用区域冗余跨可用性区域复制应用。 如果发生区域中断,流量会负载均衡并自动路由到副本。 有关详细信息,请参阅 Azure 容器应用中的可靠性
  • Web 应用程序防火墙:在应用程序网关上使用 Web 应用程序防火墙保护容器应用免受常见攻击和漏洞的影响。 有关详细信息,请参阅通过应用程序网关上的网页应用防火墙保护Azure容器应用

替换旧版 Spring Cloud Netflix 组件

如果应用程序使用旧版 Spring Cloud Netflix 组件,请考虑将其替换为当前的替代组件,如下表所示:

遗留组件 当前替代项
Spring Cloud Eureka Spring Cloud 服务注册表
Spring Cloud Netflix Zuul Spring Cloud 网关
Spring Cloud Netflix Archaius Spring Cloud 配置服务器
Spring Cloud Netflix Ribbon Spring Cloud 负载均衡器(客户端负载均衡器)
Spring Cloud Hystrix Spring Cloud 断路器 + Resilience4J
Spring Cloud Netflix 涡轮机 微计 + Prometheus