Поделиться через


Перенос приложений Spring Cloud в Azure Container Apps

В этом руководстве описывается, что следует учитывать при переносе существующего приложения Spring Cloud для запуска в Azure Container Apps.

Подготовка к миграции

Чтобы обеспечить успешную миграцию, перед ее началом выполните шаги оценки и инвентаризации, описанные в следующих разделах.

Если вы не можете выполнить какие-либо требования для подготовки к миграции, ознакомьтесь со следующими дополнительными руководствами по переносу:

  • Перенос исполняемых JAR-приложений в контейнеры на Azure Kubernetes Service (руководство запланировано)
  • Перенос исполняемых JAR-приложений в Azure Virtual Machines (запланированное руководство).

Проверка компонентов приложения

Определение того, используется ли файловая система и как именно она используется

Найдите все случаи, когда ваши услуги записывают в локальную файловую систему и/или читают из неё. Определите места, где записываются и считываются временные файлы, и места, где записываются и считываются файлы с длительным сроком хранения.

Azure Container Apps предлагает несколько типов хранилища. Эфемерное хранилище может считывать и записывать временные данные и быть доступно для запущенного контейнера или реплики. Azure Files предоставляет постоянное хранилище и может быть разделяемым между несколькими контейнерами. Дополнительные сведения см. в разделе Подключение хранилища в Azure Container Apps.

Статическое содержимое только для чтения

Если приложение в настоящее время обслуживает статическое содержимое, для него требуется альтернативное расположение. Вы можете рассмотреть возможность перемещения статического содержимого в Azure Blob Storage и добавления Azure CDN для молниеносных скачиваний глобально. Дополнительные сведения см. в разделе Статическое размещение веб-сайтов в Azure Storage и Quickstart: интеграция учетной записи Azure storage с Azure CDN.

Динамически опубликованное статическое содержимое

Если приложение поддерживает статическое содержимое, отправленное или созданное самим приложением, оно остается неизменным после его создания, можно интегрировать Azure Blob Storage и Azure CDN. Вы также можете использовать функцию Azure для управления отправкой и активацией обновлений CDN при необходимости. Мы предоставили пример реализации для вашего использования в разделе Загрузка и предварительная загрузка статического содержимого в CDN с помощью Azure Functions.

Определение того, содержат ли службы код, зависящий от ОС

Если ваше приложение содержит код с зависимостями от операционной системы хоста, необходимо произвести рефакторинг, чтобы удалить эти зависимости. Например, если ваше приложение работает на Windows, может быть необходимо заменить в путях файловой системы использование / или \ на File.Separator или Paths.get.

Переход на поддерживаемую платформу

Если вы создаете 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, а также инструкции по обновлению см. в разделе обзоре Java на Azure Container Apps.

Определение версий Spring Boot

Изучите зависимости каждого переносимого приложения, чтобы определить его версию Spring Boot.

Мейвен

В проектах Maven версия Spring Boot обычно находится в <parent> элементе POM-файла:

    <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 версия Spring Boot обычно будет указана в разделе plugins, как версия плагина org.springframework.boot.

plugins {
  id 'org.springframework.boot' version '3.3.3'
  id 'io.spring.dependency-management' version '1.1.6'
  id 'java'
}

Для любых приложений, использующих версии Spring Boot до 3.x, следуйте руководству по миграции Spring Boot 2.0 или руководству по миграции Spring Boot 3.0 , чтобы обновить их до поддерживаемой версии Spring Boot. См. поддерживаемые версии в документации Spring Cloud.

Определение версий Spring Cloud

Изучите все зависимости каждого из переносимых приложений, чтобы определить используемые в них версии компонентов Spring Cloud.

Мейвен

В проектах Maven версия Spring Cloud обычно устанавливается в свойстве spring-cloud.version :

  <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.

Определите решения для агрегации журналов

Определите все решения агрегирования журналов, используемые приложениями, которые вы переносите. Необходимо настроить параметры диагностики в процессе миграции, чтобы сделать зафиксированные события доступными для потребления. Дополнительные сведения см. в разделе "Обеспечение ведения журнала консоли" и настройки параметров диагностики .

Определение агентов управления производительностью приложений

Определите все агенты управления производительностью приложений, используемые приложениями. Контейнерные приложения Azure не поддерживают встроенную интеграцию APM. Необходимо подготовить образ контейнера или интегрировать средство APM непосредственно в код. Если вы хотите измерить производительность приложения, но еще не интегрировать APM, рассмотрите возможность использования Azure Application Insights. Дополнительные сведения см. в разделе "Миграция ".

Проверка внешних ресурсов

Определите внешние ресурсы, в том числе источники данных, брокеры сообщений JMS и URL-адреса других служб. В приложениях Spring Cloud конфигурацию для таких ресурсов обычно можно найти в одном из следующих расположений:

  • В папке src/main/resources находится файл, который обычно называется application.properties или application.yml.
  • В репозитории сервера конфигурации Spring Cloud, который вы определили на предыдущем шаге.

Базы данных

Для приложения 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), для поиска соответствующих зависимостей.

Например, приложение Spring Boot с помощью ActiveMQ обычно будет содержать эту зависимость в файле 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 Cloud их обычно можно найти в файлах application.properties и application.yml в каталоге приложений или в репозитории Сервера конфигурации Spring Cloud.

Примечание.

Корпорация Майкрософт рекомендует использовать самый безопасный поток проверки подлинности. Поток проверки подлинности, описанный в этой процедуре, например для баз данных, кэшей, сообщений или служб ИИ, требует очень высокой степени доверия к приложению и несет риски, не присутствующих в других потоках. Используйте этот поток только в тех случаях, когда более безопасные варианты, такие как управляемые удостоверения для подключений без паролей или без ключей, не являются жизнеспособными. Для локальных операций машины предпочитайте идентификационные данные пользователей для подключений без пароля или ключа.

Ниже приведен пример ActiveMQ из файла application.properties :

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.

Ниже приведен пример IBM MQ из файла application.yaml :

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).

Поставщики идентификационных услуг

Идентифицируйте всех поставщиков удостоверений и все приложения Spring Cloud, которые требуют проверки подлинности и (или) авторизации. Сведения о настройке поставщиков удостоверений см. в следующих ресурсах:

Ресурсы, настроенные с помощью службы VMware Tanzu Application Service (TAS) (ранее — Pivotal Cloud Foundry)

Для приложений, управляемых через TAS, внешние ресурсы (включая описанные выше) часто настраиваются с помощью привязок службы TAS. Чтобы проверить конфигурацию таких ресурсов, используйте интерфейс командной строки TAS (Cloud Foundry) для просмотра 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 или application.yml в отдельных службах или в репозитории сервера конфигурации Spring Cloud.

Сертификаты складского учета

Определите все сертификаты, используемые для общедоступных конечных точек SSL или обмена данными с базами данных внутреннего сервера и другими системами. Вы можете просмотреть все сертификаты на рабочих серверах, выполнив следующую команду:

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

Определение использования Spring Cloud Vault

Если вы используете Spring Cloud Vault для хранения и доступа к секретам, определите резервное хранилище секретов, например HashiCorp Vault или CredHub. Затем укажите все секреты, которые используются в коде приложения.

Найдите источник сервера конфигурации

Если приложение использует сервер конфигурации Spring Cloud, определите, где хранится конфигурация. Обычно этот параметр можно найти в файле bootstrap.yml или bootstrap.properties или иногда в файле application.yml или application.properties . Этот параметр выглядит следующим образом:

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

Хотя git чаще всего используется в качестве хранилища данных для Spring Cloud Config Server, как показано ранее, также могут использоваться и другие возможные хранилища. Ознакомьтесь с документацией по серверу конфигурации Spring Cloud для получения сведений о других серверных службах, таких как реляционная база данных (JDBC),SVN и локальная файловая система.

Инспекция архитектуры развертывания

Документирование требований к оборудованию для каждой службы

Для каждой службы Spring Cloud (не включая сервер конфигурации, реестр или шлюз) задокументируйте следующие сведения:

  • Количество запущенных экземпляров.
  • Количество ЦП, выделенных для каждого экземпляра.
  • Объем RAM, выделенный для каждого экземпляра.

Документировать георепликацию и распределение

Определите, распределены ли приложения Spring Cloud между несколькими регионами или центрами обработки данных. Задокументируйте требования к бесперебойной работе или соглашение об уровне обслуживания для приложений, которые вы переносите.

Выявление клиентов, которые обходят реестр службы

Определите все клиентские приложения, которые вызывают любую службу, которую нужно перенести, не используя при этом реестр службы Spring Cloud. После миграции такие вызовы станут невозможны. Обновите такие клиенты, чтобы использовать Spring Cloud OpenFeign перед миграцией.

Миграция

Удаление ограниченных конфигураций

Среда Azure Container Apps предлагает управляемый сервер Eureka, сервер Spring Cloud Config и сервер администрирования. Когда приложение привязано к компоненту Java, Azure Container Apps внедряет связанные свойства в качестве системных переменных среды. Согласно структуре внешней конфигурации 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 Container Apps в подписке Azure в существующей управляемой среде или создайте новую для каждой службы, которую вы переносите. Вам не нужно создавать приложения, работающие как реестр Spring Cloud и серверы конфигурации. Дополнительные сведения см. в статье Quickstart: развертывание первого приложения контейнера с помощью портала Azure.

Подготовка сервера конфигурации Spring Cloud

Настройте сервер конфигураций в компоненте Spring для Azure Container Apps. Для получения дополнительной информации см. раздел Настройка параметров для компонента Config Server for Spring в Azure Container Apps.

Примечание.

Если текущий репозиторий конфигурации Spring Cloud находится в локальной файловой системе или локальной среде, сначала необходимо перенести или реплицировать файлы конфигурации в облачный репозиторий, например GitHub, Azure Repos или BitBucket.

Убедитесь в записи логов в консоль и настройте параметры диагностики

Настройте ведение журнала, чтобы убедиться, что все выходные данные направляются в консоль, а не в файлы.

После развертывания приложения в Azure Container Apps можно настроить параметры ведения журнала в среде "Приложения контейнеров" для определения одного или нескольких назначений журналов. Эти назначения могут включать Azure Monitor Log Analytics, концентратор событий Azure или даже другие сторонние решения для мониторинга. Кроме того, вы можете отключить данные журнала и просматривать журналы только во время выполнения. Подробные инструкции по настройке см. в разделе Log storage and monitoring options in Azure Container Apps.

Настройка постоянного хранилища

Если любая часть приложения считывает или записывает данные в локальную файловую систему, необходимо настроить постоянное хранилище для замены локальной файловой системы. Можно указать путь для монтирования в контейнере с помощью параметров приложения и сопоставить его с путем, который используется приложением. Дополнительные сведения см. в разделе Подключение хранилища в Azure Container Apps.

Перенос секретов Spring Cloud Vault в Azure KeyVault

Секреты можно внедрить непосредственно в приложения через Spring с помощью Azure KeyVault Spring Boot Starter. Дополнительные сведения см. в разделе Как использовать стартер Spring Boot для Azure Key Vault.

Примечание.

Для миграции может потребоваться изменить название некоторых секретных данных. Вместе с этим обновите код приложения.

Перенос всех сертификатов в Key Vault

Azure Container Apps поддерживает безопасную связь между приложениями. Приложению не нужно управлять процессом установления безопасного взаимодействия. Вы можете отправить частный сертификат в Azure Container Apps или использовать бесплатный управляемый сертификат, предоставленный Azure Container Apps. Использование Azure Key Vault для управления сертификатами — это рекомендуемый подход. Для получения дополнительной информации см. в разделе с названием Сертификаты в Azure Container Apps.

Настройка интеграции управления производительностью приложений (APM)

Если вы уже настроили переменные, связанные с APM в контейнере, необходимо убедиться, что подключение к целевой платформе APM можно установить. Если конфигурация APM ссылается на переменные среды из контейнера, необходимо задать переменные среды выполнения соответствующим образом в Azure Container Apps. Конфиденциальная информация, например connection string, должна обрабатываться безопасно. Его можно указать как секрет или ссылаться на секрет, хранящийся в Azure Key Vault.

Настройка секретов и внешних параметров для каждой службы

Параметры конфигурации можно внедрить в каждый контейнер в виде переменных среды. Все изменения в переменных создают новую редакцию для существующего приложения. Секреты являются парами "ключ-значение" и остаются действительными во всех редакциях.

Мигрировать и включить поставщика удостоверений

Если для любого из приложений 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 конечные точки для перенесенных приложений.

После миграции

Итак, вы завершили миграцию. Теперь убедитесь, что приложение работает правильно. Применив указанные ниже рекомендации, вы сможете сделать приложение более удобным для использования в облаке.

  • Оцените возможность настроить работу приложения с реестром Spring Cloud. Этот компонент позволяет вашему приложению быть динамически обнаруженным другими развернутыми приложениями Spring и клиентами. Дополнительные сведения см. в разделе Настройка параметров для компонента Eureka Server для Spring в Azure Container Apps. Затем измените все клиенты приложений, чтобы использовать Load Balancer Spring Client. Load Balancer Spring Client позволяет клиенту получать адреса всех запущенных экземпляров приложения и находить экземпляр, который работает, если другой экземпляр поврежден или не отвечает. Дополнительные сведения см. в разделе Spring Tips: Spring Cloud Load Balancer в блоге Spring.

  • Вместо того чтобы сделать приложение общедоступным, рекомендуется добавить экземпляр Шлюза Spring Cloud . Spring Cloud Gateway предоставляет одну конечную точку для всех приложений, развернутых в среде Azure Container Apps. Если шлюз Spring Cloud уже развернут, убедитесь, что правило маршрутизации настроено для маршрутизации трафика в только что развернутое приложение.

  • Попробуйте добавить сервер конфигурации Spring Cloud для централизованного управления конфигурацией и управления версиями для всех приложений Spring Cloud. Сначала создайте репозиторий Git для размещения конфигурации и настройки экземпляра приложения для его использования. Дополнительные сведения см. в разделе Настройка параметров для компонента Config Server for Spring в Azure Container Apps. Затем перенесите конфигурацию, выполнив следующие действия:

    1. В каталоге src/main/resources приложения создайте файл bootstrap.yml со следующим содержимым:

        spring:
          application:
            name: <your-application-name>
      
    2. В репозитории конфигурации Git создайте файл <your-application-name>.yml , где your-application-name соответствует тому же, что и на предыдущем шаге. Переместите параметры из файла application.yml в src/main/resources в созданный файл. Если параметры были ранее в файле СВОЙСТВ , сначала преобразуйте их в YAML. Можно найти веб-инструменты или подключаемые модули IntelliJ, которые помогут выполнить это преобразование.

    3. Создайте файл application.yml в приведенном выше каталоге. Этот файл можно использовать для определения параметров и ресурсов, общих для всех приложений в среде Azure Container Apps. К таким параметрам обычно относятся источники данных, параметры ведения журнала, конфигурация Spring Boot Actuator и др.

    4. Зафиксируйте эти изменения и отправьте их в репозиторий Git.

    5. Удалите файл application.properties или application.yml из приложения.

  • Рассмотрите возможность добавления компонента администрирования для Spring, чтобы включить административный интерфейс для веб-приложений Spring Boot, предоставляющих конечные точки актуатора. Дополнительные сведения см. в разделе Настройка компонента администратора Spring Boot в Azure Container Apps.

  • Обдумайте возможность добавить конвейер развертывания для автоматизации и обеспечения согласованности этого процесса. Инструкции доступны для Azure Pipelines и для GitHub Actions.

  • Рассмотрите возможность использования версий контейнерных приложений, меток версии и весов входящего трафика, чтобы обеспечить сине-зеленое развертывание, что даёт возможность протестировать изменения кода в продуктивной среде, прежде чем они будут доступны некоторым или всем пользователям. Дополнительные сведения см. в разделе Blue-Green Развертывание в Azure Container Apps.

  • Попробуйте добавить привязки служб для подключения приложения к поддерживаемым базам данных Azure. Такие привязки служб избавляют от необходимости предоставлять сведения о подключении, включая учетные данные, для приложений Spring Cloud.

  • Рекомендуется включить стек разработки Java для сбора основных метрик JVM для приложений. Дополнительные сведения см. в разделе метрики Java для приложений Java в Azure Container Apps.

  • Рассмотрите возможность добавления правил генерации оповещений и групп действий Azure Monitor для быстрого обнаружения и устранения аберрантных условий. Дополнительные сведения см. в разделе Настроить оповещения в Azure Container Apps.

  • Рассмотрите возможность репликации вашего приложения по зонам в регионе, включив зональную избыточность в Azure Container Apps. Трафик балансируется по нагрузке и автоматически направляется на реплики, если происходит сбой зоны обслуживания. Дополнительные сведения о избыточных параметрах см. в разделе Reliability в Azure Container Apps.

  • Рассмотрите возможность защиты Azure Container Apps от распространенных эксплойтов и уязвимостей с помощью Web Application Firewall в шлюзе приложений. Дополнительные сведения см. в разделе Защита Azure Container Apps с помощью брандмауэра веб-приложений на шлюзе приложений.

  • Если приложения используют устаревшие компоненты 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 Load Balancer (балансировщик нагрузки на стороне клиента)
    Spring Cloud Hystrix Spring Cloud Circuit Breaker и Resilience4J
    Spring Cloud Netflix Турбина Micrometer и Prometheus