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

Примечание.

Azure Spring Apps — это новое название службы Azure Spring Cloud. Старое название будет еще некоторое время встречаться в наших материалах, пока мы не обновим ресурсы, такие как снимки экрана, видео и схемы.

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

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

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

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

  • Перенос приложений на базе исполняемых JAR-файлов в контейнеры в Службе Azure Kubernetes (руководство ожидается)
  • Перенос приложений на базе исполняемых JAR-файлов в Виртуальные машины Azure (руководство ожидается)

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

Определение локального состояния

В средах PaaS не гарантируется, что в определенный момент времени какое-либо приложение будет выполняться только один раз. Даже если предложение настроено для запуска в одном экземпляре, в следующих ситуациях может быть создана копия экземпляра:

  • Приложение необходимо переместить на физический узел из-за ошибки или обновления системы.
  • Выполняется обновление приложения.

В обоих случаях исходный экземпляр будет выполняться, пока не будет запущен новый экземпляр. Это имеет следующие потенциально значимые последствия для вашего приложения:

  • Не гарантируется, что отдельный экземпляр будет действительно отдельным.
  • Все данные, которые не были сохранены во внешнем хранилище, с высокой вероятностью будут утеряны намного раньше, чем при работе с отдельным физическим сервером или виртуальной машиной.

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

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

Найдите все экземпляры, из которых выполняется чтение и (или) запись в локальной файловой системе. Найдите все фрагменты, из которых записываются и считываются временные файлы, файлы с коротким и длительным сроком хранения.

Примечание.

Azure Spring Apps предоставляет 5 ГБ временного хранилища для экземпляра Azure Spring Apps, подключенного в /tmp. Если объемы записи временных файлов превысят этот лимит или файлы сохраняются в другом расположении, придется изменить соответствующий код.

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

Если ваше приложение сейчас обслуживает статическое содержимое, вам потребуется альтернативное расположение для этого статического содержимого. Вы можете переместить статическое содержимое в хранилище BLOB-объектов Azure и включить Azure CDN для быстрого скачивания в глобальном масштабе. Дополнительные сведения см. в статье "Размещение статических веб-сайтов" в служба хранилища Azure и кратком руководстве. Интеграция учетной записи хранения Azure с Azure CDN.

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

Если приложение допускает использование статического содержимого, которое передается или создается приложением и после этого становится неизменяемым, вы можете использовать хранилище BLOB-объектов Azure и Azure CDN, как описано выше, с Функциями Azure для выполнения отправки и обновления CDN. Практический пример реализации см. в руководстве по отправке и предварительной загрузке статического содержимого CDN с помощью Функций Azure.

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

Если приложение содержит код, зависящий от ОС узла, вам нужно выполнить рефакторинг кода для удаления этих зависимостей. Например, вам нужно заменить все символы / или \, используемые в путях файловой системы, на 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 версию Spring Boot обычно можно узнать в элементе <parent> файл POM:

    <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 версию Spring Boot обычно можно узнать в элементе в разделе plugins. Она указана в качестве версии подключаемого модуля 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. Поддерживаемые версии см. в разделе "Версия Spring Boot и Spring Cloud " статьи "Подготовка приложения для развертывания в Azure Spring Apps".

Определение решений по объединению журналов

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

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

Определите все агенты мониторинга производительности приложений, используемые в приложениях. Azure Spring Apps поддерживает интеграцию с приложением Аналитика, New Relic, Elastic APM, Dynatrace и AppDynamics. Если приложение использует поддерживаемый APM, настройте интеграцию в миграции. Если приложение не использует поддерживаемый APM, рассмотрите возможность использования приложения Аналитика. Дополнительные сведения см. в разделе "Миграция ".

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

Определите внешние ресурсы, в том числе источники данных, брокеры сообщений JMS и URL-адреса других служб. В приложениях Spring Boot файл с конфигурацией этих ресурсов обычно размещается в каталоге src/main/directory и называется application.properties или application.yml.

Databases

Определите строки подключения ко всем базам данных 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.yml:

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

Когда вы найдете один или несколько используемых брокеров, получите их параметры. В приложениях Spring Boot они обычно размещаются в файле application.properties или application.yml в каталоге приложения.

Вот пример 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=tryandguess

Дополнительные сведения о конфигурации ActiveMQ см. в документации по сообщениям Spring Boot.

Вот пример IBM MQ из файла application.yaml:

ibm:
  mq:
    queueManager: qm1
    channel: dev.ORDERS
    connName: localhost(14)
    user: admin
    password: big$ecr3t

Дополнительные сведения о конфигурации IBM MQ см. в документации по компонентам Spring для IBM MQ.

Определение внешних кэшей

Определите все используемые внешние кэши. Redis часто используется через Spring Data Redis. Сведения о конфигурации см. в документации по Spring Data Redis.

Определите, кэшируются ли данные сеанса с помощью Spring Session путем поиска соответствующей конфигурации (в Java или XML).

Поставщики удостоверений

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

Поиск клиентов, которые используют нестандартный порт

Azure Spring Apps перезаписывает server.port параметр в развернутом приложении. Если клиенты ваших клиентов ожидают, что приложение будет доступно через порт, отличающийся от 443, их необходимо изменить.

Другие связанные внешние ресурсы

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

Источники и секреты конфигурации инвентаризации

Пароли и защищенные строки инвентаризации

Проверьте наличие секретных строк и паролей во всех свойствах и файлах конфигурации, а также всех переменных среды в рабочих развертываниях. В приложении Spring Boot такие строки обычно содержатся в файле application.properties или application.yml.

Проверка сертификатов

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

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

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

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

Задокументируйте следующие сведения о приложении Spring Boot:

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

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

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

Миграция

Создание экземпляра и приложений Azure Spring Apps

Подготовьте экземпляр Azure Spring Apps в подписке Azure, если он еще не существует. Затем создайте в нем приложение. Дополнительные сведения см. в статье Краткое руководство. Развертывание первого приложения Azure Spring Apps.

Настройка записи журналов в консоль и параметров диагностики

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

После развертывания приложения в Azure Spring Apps добавьте параметр диагностики, чтобы сделать зарегистрированные события доступными для использования, например с помощью Azure Monitor Log Analytics.

Стек LogStash/ELK

Если вы используете стек LogStash/ELK для объединения журналов, настройте параметр диагностики для потоковой передачи выходных данных консоли в концентратор событий Azure. Затем настройте подключаемый модуль LogStash EventHub для приема регистрируемых событий в LogStash.

Splunk

Если вы используете стек Splunk для объединения журналов, настройте потоковый вывод диагностики для передачи выходных данных консоли в хранилище BLOB-объектов Azure. Затем примените надстройку Splunk для облачных служб (Майкрософт) для приема событий в Splunk.

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

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

Все временные файлы должны быть в каталоге /tmp. Узнать его расположение в любой ОС можно с помощью System.getProperty("java.io.tmpdir"). Для создания временных файлов можно также использовать java.nio.Files::createTempFile.

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

Azure Spring Apps не предоставляет доступ к хранилищу ключей JRE, поэтому необходимо перенести сертификаты в Azure KeyVault и изменить код приложения для доступа к сертификатам в KeyVault. Дополнительные сведения см. в статьях Начало работы с сертификатами Key Vault и Клиентская библиотека сертификатов Azure Key Vault для Java.

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

Azure Spring Apps предлагает следующие интеграции APM. Перейдите по ссылкам, чтобы включить необходимый APM.

Если приложение не использует поддерживаемый APM, попробуйте использовать приложение Аналитика. Azure Spring Apps обеспечивает глубокую интеграцию с приложением Аналитика для управления производительностью и реагирования в режиме реального времени на аберрация.

Отключение клиентов и конечных точек метрик в приложениях

Удалите в приложениях все используемые клиенты метрик и предоставляемые конечные точки метрик.

Развертывание приложения

Разверните все перенесенные микрослужбы (не включая серверы конфигурации Spring Cloud и реестра), как описано в кратком руководстве. Развертывание первого приложения в Azure Spring Apps.

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

Вы можете добавить любые параметры конфигурации для каждой службы в виде переменных среды. Выполните следующие действия на портале Azure:

  1. Перейдите к экземпляру Azure Spring Apps и выберите "Приложения".
  2. Выберите службу для настройки.
  3. Выберите Конфигурация.
  4. Введите переменные для настройки.
  5. Выберите Сохранить.

Spring Cloud App Configuration Settings

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

Если какому-то из приложений Spring Cloud требуется проверка подлинности или авторизация, не забудьте настроить для них доступ к поставщику удостоверений:

  • Если поставщик удостоверений является идентификатором Microsoft Entra, изменения не должны быть необходимы.
  • Если поставщик удостоверений является лесом локальная служба Active Directory, рассмотрите возможность реализации решения гибридного удостоверения с идентификатором Microsoft Entra. Дополнительные сведения см. в документации по гибридной идентификации.
  • Если поставщик удостоверений является другим локальным решением, например PingFederate, обратитесь к разделу "Настраиваемая установка Microsoft Entra Подключение", чтобы настроить федерацию с идентификатором Microsoft Entra. Кроме того, вы можете применить Spring Security для работы с поставщиком удостоверений через OAuth2 и OpenID Connect или SAML.

Предоставление доступа к приложению

По умолчанию приложения, развернутые в Azure Spring Apps, не отображаются внешне. Вы можете сделать свое приложение доступным, т. е. открытым, с помощью следующей команды:

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

Пропустите этот шаг, если вы используете или планируете использовать шлюз Spring Cloud. Дополнительные сведения см. в следующем разделе.

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

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

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

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

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

    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 в новый файл, который вы только что создали. Если ранее параметры размещались в файле .properties, сначала преобразуйте их в формат YAML. Можно найти веб-инструменты или подключаемые модули IntelliJ, которые помогут выполнить это преобразование.

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

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

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

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

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

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

  • Рассмотрите возможность использования приложение Azure Аналитика для мониторинга производительности и взаимодействия приложений. Дополнительные сведения см. в статье Использование внутрипроцессного агента Java Application Insights в Azure Spring Apps

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

  • Рассмотрите возможность реплика развертывания Azure Spring Apps в другом регионе для снижения задержки и повышения надежности и отказоустойчивости. Примените Диспетчер трафика Azure для балансировки нагрузки между развертываниями или Azure Front Door для добавления разгрузки SSL и брандмауэра веб-приложения с защитой от атак DDoS.

  • Если георепликация не требуется, попробуйте добавить Шлюз приложений Azure для добавления разгрузки SSL и брандмауэра веб-приложения с защитой от атак DDoS.