Перенос приложений Spring Boot в Службу приложений Azure

Узнайте, что следует учитывать при переносе существующего приложения Spring Boot в Службу приложений Azure.

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

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

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

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

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

В Службе приложений доступны несколько версий Java SE. Чтобы обеспечить совместимость, перенесите приложение в одну из поддерживаемых версий текущей среды, прежде чем продолжать. Обязательно полностью протестируйте готовую конфигурацию. Используйте в этих тестах последний стабильный выпуск дистрибутива Linux.

Примечание

Эта проверка особенно важна, если на текущем сервере используется неподдерживаемая версия JDK (например, Oracle JDK или IBM OpenJ9).

Чтобы получить текущую версию Java, войдите на сервер в рабочей среде и выполните следующую команду:

java -version

Чтобы получить текущую версию, используемую в Службе приложений Azure, скачайте Zulu 8, если вы планируете использовать среду выполнения Java 8, или Zulu 11, если вы планируете использовать среду выполнения Java 11.

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

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

Базы данных

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Особые случаи

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

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

Запланированные задания, такие как задачи планировщика Quartz или задания Cron, нельзя использовать со Службой приложений. Служба приложений не будет препятствовать развертыванию приложения, содержащего запланированные внутренние задачи. Но если приложение масштабируется, одно запланированное задание может выполняться несколько раз в течение указанного периода. Это может привести к нежелательным последствиям.

Проверьте все запланированные задания, связанные с приложением (выполняющиеся и не выполняющиеся).

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

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

Определение всех внешних процессов и управляющих программ, запущенных на рабочих серверах

Все процессы (например, управляющие программы мониторинга), выполняющиеся за пределами сервера приложений, нужно перенести в другое расположение или завершить.

Определение обработки запросов, отличающихся от запросов HTTP или выполняющихся по нескольким портам

Служба приложений позволяет использовать только одну конечную точку HTTP и только один порт. Если приложение прослушивает несколько портов или принимает запросы, отличающиеся от запросов HTTP, не используйте Службу приложений Azure.

Миграция

Параметризация конфигурации

Убедитесь, что координаты всех внешних ресурсов (например, строк подключения к базам данных) и другие настраиваемые параметры считываются из переменных среды. В приложениях Spring Boot все параметры конфигурации должны поддерживать вынос во внешний код. Дополнительные сведения см. в разделе о вынесении конфигурации во внешних код в документации по Spring Boot.

Вот пример со ссылкой на переменную среды SERVICEBUS_CONNECTION_STRING из файла application.properties:

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

Подготовка плана службы приложений

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

Примечание

Если вы намерены использовать промежуточное или раннее развертывание либо слоты развертывания, план службы приложений должен учитывать эту дополнительную емкость. Для приложений Java рекомендуется использовать план уровня "Премиум" или выше.

Создайте план службы приложений.

Создание и развертывание веб-приложений

Вам нужно создать в плане службы приложений новое веб-приложение (со стеком времени выполнения Java SE) для каждого исполняемого JAR-файла, который вы хотите выполнить.

Приложения Maven

Если приложение создано на основе POM-файла Maven, используйте подключаемый модуль веб-приложения для Maven, чтобы создать и развернуть веб-приложение. Дополнительные сведения см. в кратком руководстве о создании приложения Java в Службе приложений Azure.

Приложения, отличающиеся от Maven

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

Создав веб-приложение, разверните его, используя один из доступных механизмов развертывания. Если это возможно, приложение нужно передать в файл /home/site/wwwroot/app.jar. Если вы не хотите переименовывать JAR-файл в app.jar, отправьте скрипт оболочки с командой для выполнения JAR-файла. Затем вставьте полный путь к этому скрипту в текстовое поле Файл запуска в разделе конфигурации на портале. Скрипт запуска выполняется не в том каталоге, в который он помещен. Поэтому всегда используйте абсолютные пути для создания ссылок на файлы в скрипте запуска (например, java -jar /home/myapp/myapp.jar).

Перенос параметров среды выполнения JVM

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

Настройка личного домена и SSL

Если приложение будет отображаться в личном домене, вам нужно будет сопоставить с ним веб-приложение. Дополнительные сведения см. в статье Сопоставление существующего настраиваемого DNS-имени со Службой приложений Azure.

После этого вам нужно будет привязать SSL-сертификат для этого домена к веб-приложению в Службе приложений. См. руководство по защите пользовательского DNS-имени с помощью привязки SSL в Службе приложений Azure.

Импорт сертификатов внутренних серверов

Все сертификаты для взаимодействия с системами внутренних серверов, такими как базы данных, необходимо сделать доступными для Службы приложений. См. руководство по добавлению 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

Конфигурация приложений Службы приложений

Перенос запланированных заданий

Для выполнения запланированных заданий в Azure рекомендуется использовать триггер таймера для Функций Azure. Переносить сам код задания в функцию не нужно. Функция может просто вызвать URL-адрес в приложении, чтобы активировать задание. Если такие выполнения заданий должны быть динамически вызываемыми и (или) централизованно отслеживаемыми, попробуйте использовать Spring Batch.

Либо создайте приложение логики с триггером повторения для вызова URL-адреса без необходимости писать код за пределами приложения. См. сведения об Azure Logic Apps, а также руководство по созданию, планированию и выполнению повторяющихся задач и рабочих процессов с помощью триггера повторения в Azure Logic Apps.

Примечание

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

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

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

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

Перезапуск и тест состояния

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

Действия после миграции

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

Рекомендации