Перейти к основному содержимому

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

· 9 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Введение

Microsoft Azure теперь имеет довольно надежную поддержку Java.

В этом руководстве мы шаг за шагом покажем, как заставить наше приложение Spring Boot работать на платформе Azure.

2. Зависимость и конфигурация Maven

Во- первых, нам нужна подписка Azure, чтобы использовать тамошние облачные службы ; в настоящее время мы можем зарегистрировать бесплатную учетную запись здесь .

Затем войдите на платформу и создайте субъект-службу с помощью Azure CLI :

> az login
To sign in, use a web browser to open the page \
https://microsoft.com/devicelogin and enter the code XXXXXXXX to authenticate.
> az ad sp create-for-rbac --name "app-name" --password "password"
{
"appId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
"displayName": "app-name",
"name": "http://app-name",
"password": "password",
"tenant": "tttttttt-tttt-tttt-tttt-tttttttttttt"
}

Теперь мы настраиваем параметры аутентификации субъекта-службы Azure в нашем Maven settings.xml с помощью следующего раздела в <servers> :

<server>
<id>azure-auth</id>
<configuration>
<client>aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa</client>
<tenant>tttttttt-tttt-tttt-tttt-tttttttttttt</tenant>
<key>password</key>
<environment>AZURE</environment>
</configuration>
</server>

Мы будем полагаться на приведенную выше конфигурацию аутентификации при загрузке нашего приложения Spring Boot на платформу Microsoft с помощью azure-webapp-maven-plugin .

Давайте добавим следующий плагин Maven в pom.xml :

<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-webapp-maven-plugin</artifactId>
<version>1.1.0</version>
<configuration>
<!-- ... -->
</configuration>
</plugin>

Мы можем проверить последнюю версию выпуска здесь .

У этого плагина есть ряд настраиваемых свойств, которые будут рассмотрены в следующем введении.

3. Разверните приложение Spring Boot в Azure.

Теперь, когда мы настроили среду, давайте попробуем развернуть наше приложение Spring Boot в Azure.

Наше приложение отвечает: « Привет, лазурь! », когда мы обращаемся к « /hello »:

@GetMapping("/hello")
public String hello() {
return "hello azure!";
}

Платформа теперь позволяет развертывать Java Web App как для Tomcat, так и для Jetty. С помощью azure-webapp-maven-plugin мы можем развернуть наше приложение непосредственно в поддерживаемых веб-контейнерах в качестве приложения по умолчанию (ROOT) или развернуть через FTP.

Обратите внимание, что поскольку мы собираемся развернуть приложение в веб-контейнерах, мы должны упаковать его в виде WAR-архива. В качестве быстрого напоминания у нас есть статья, в которой рассказывается, как развернуть Spring Boot WAR в Tomcat .

3.1. Развертывание веб-контейнера

Мы будем использовать следующую конфигурацию для azure-webapp-maven-plugin , если мы намерены выполнить развертывание на Tomcat в экземпляре Windows:

<configuration>
<javaVersion>1.8</javaVersion>
<javaWebContainer>tomcat 8.5</javaWebContainer>
<!-- ... -->
</configuration>

Для экземпляра Linux попробуйте следующую конфигурацию:

<configuration>
<linuxRuntime>tomcat 8.5-jre8</linuxRuntime>
<!-- ... -->
</configuration>

Не забываем про аутентификацию Azure:

<configuration>
<authentication>
<serverId>azure-auth</serverId>
</authentication>
<appName>spring-azure</appName>
<resourceGroup>foreach</resourceGroup>
<!-- ... -->
</configuration>

Когда мы развернем наше приложение в Azure, мы увидим, что оно отображается как служба приложений. Итак, здесь мы указали свойство <appName> , чтобы назвать службу приложений. Кроме того, служба приложений как ресурс должна храниться в контейнере группы ресурсов , поэтому <resourceGroup> также требуется.

Теперь мы готовы нажать на триггер с помощью azure-webapp:deploy Maven target и увидим результат:

> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App spring-foreach...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Target Web App doesn't exist. Creating a new one...
[INFO] Creating App Service Plan 'ServicePlanssssssss-bbbb-0000'...
[INFO] Successfully created App Service Plan.
[INFO] Successfully created Web App.
[INFO] Starting to deploy the war file...
[INFO] Successfully deployed Web App at \
https://spring-foreach.azurewebsites.net
...

Теперь мы можем получить доступ к https://spring-foreach.azurewebsites.net/hello и увидеть ответ: «hello azure!».

В процессе развертывания Azure автоматически создал для нас план службы приложений. Подробные сведения о планах службы приложений Azure см. в официальном документе . Если у нас уже есть план службы приложений, мы можем установить свойство <appServicePlanName> , чтобы избежать создания нового:

<configuration>
<!-- ... -->
<appServicePlanName>ServicePlanssssssss-bbbb-0000</appServicePlanName>
</configuration>

3.2. FTP-развертывание

Для развертывания через FTP мы можем использовать конфигурацию:

<configuration>
<authentication>
<serverId>azure-auth</serverId>
</authentication>
<appName>spring-foreach</appName>
<resourceGroup>foreach</resourceGroup>
<javaVersion>1.8</javaVersion>

<deploymentType>ftp</deploymentType>
<resources>
<resource>
<directory>${project.basedir}/target</directory>
<targetPath>webapps</targetPath>
<includes>
<include>*.war</include>
</includes>
</resource>
</resources>
</configuration>

В приведенной выше конфигурации мы заставляем плагин находить файл WAR в каталоге ${project.basedir}/target и развертывать его в каталоге веб-приложений контейнера Tomcat .

Скажем, наш последний артефакт называется azure-0.1.war, после начала развертывания мы увидим следующий вывод:

> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App spring-foreach...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Target Web App doesn't exist. Creating a new one...
[INFO] Creating App Service Plan 'ServicePlanxxxxxxxx-xxxx-xxxx'...
[INFO] Successfully created App Service Plan.
[INFO] Successfully created Web App.
...
[INFO] Finished uploading directory: \
/xxx/.../target/azure-webapps/spring-foreach --> /site/wwwroot
[INFO] Successfully uploaded files to FTP server: \
xxxx-xxxx-xxx-xxx.ftp.azurewebsites.windows.net
[INFO] Successfully deployed Web App at \
https://spring-foreach.azurewebsites.net

Обратите внимание, что здесь мы не развернули наше приложение в качестве веб-приложения по умолчанию для Tomcat, поэтому мы можем получить к нему доступ только через «https://spring-foreach.azurewebsites.net/azure-0.1/hello». Сервер ответит "привет, лазурь!" как и ожидалось.

4. Развертывание с пользовательскими настройками приложения

В большинстве случаев нашему приложению Spring Boot требуется доступ к данным для предоставления услуг. Теперь Azure поддерживает такие базы данных, как SQL Server, MySQL и PostgreSQL.

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

4.1. Включить MySQL в приложении в Azure

Поскольку для создания веб-приложения с включенным In-App MySQL не существует однострочного кода, мы должны сначала создать веб-приложение с помощью интерфейса командной строки:

az group create --location japanwest --name bealdung-group
az appservice plan create --name foreach-plan --resource-group bealdung-group --sku B1
az webapp create --name foreach-webapp --resource-group foreach-group \
--plan foreach-plan --runtime java|1.8|Tomcat|8.5

Затем включите MySQL в приложении на портале :

./cee14d452c6dabc92da533c4ed7b78c2.png

После включения MySQL в приложении мы можем найти базу данных по умолчанию, URL-адрес источника данных и информацию об учетной записи по умолчанию в файле с именем MYSQLCONNSTR_xxx.txt в каталоге /home/data/mysql файловой системы.

4.2. Приложение Spring Boot с использованием MySQL в приложении Azure

Здесь для демонстрации мы создаем сущность User и две конечные точки, используемые для регистрации и перечисления пользователей:

@PostMapping("/user")
public String register(@RequestParam String name) {
userRepository.save(userNamed(name));
return "registered";
}

@GetMapping("/user")
public Iterable<User> userlist() {
return userRepository.findAll();
}

Мы собираемся использовать базу данных H2 в нашей локальной среде и переключим ее на MySQL в Azure. Как правило, мы настраиваем свойства источника данных в файле application.properties :

spring.datasource.url=jdbc:h2:file:~/test
spring.datasource.username=sa
spring.datasource.password=

В то время как для развертывания Azure нам нужно настроить azure-webapp-maven-plugin в <appSettings> :

<configuration>
<authentication>
<serverId>azure-auth</serverId>
</authentication>
<javaVersion>1.8</javaVersion>
<resourceGroup>foreach-group</resourceGroup>
<appName>foreach-webapp</appName>
<appServicePlanName>bealdung-plan</appServicePlanName>
<appSettings>
<property>
<name>spring.datasource.url</name>
<value>jdbc:mysql://127.0.0.1:55738/localdb</value>
</property>
<property>
<name>spring.datasource.username</name>
<value>uuuuuu</value>
</property>
<property>
<name>spring.datasource.password</name>
<value>pppppp</value>
</property>
</appSettings>
</configuration>

Теперь мы можем приступить к развертыванию:

> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App custom-webapp...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Updating target Web App...
[INFO] Successfully updated Web App.
[INFO] Starting to deploy the war file...
[INFO] Successfully deployed Web App at \
https://foreach-webapp.azurewebsites.net

Из журнала мы видим, что развертывание завершено.

Давайте протестируем наши новые конечные точки:

> curl -d "" -X POST https://foreach-webapp.azurewebsites.net/user\?name\=foreach
registered

> curl https://foreach-webapp.azurewebsites.net/user
[{"id":1,"name":"foreach"}]

Ответ сервера говорит сам за себя. Оно работает!

5. Разверните контейнерное приложение Spring Boot в Azure.

В предыдущих разделах мы показали, как развертывать приложения в контейнерах сервлетов (в данном случае Tomcat). Как насчет развертывания в качестве автономного исполняемого jar-файла?

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

У нас уже есть статья о том, как докеризировать приложение Spring Boot , но здесь мы собираемся использовать другой плагин maven: docker-maven-plugin , чтобы автоматизировать докеризацию для нас:

<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<configuration>
<!-- ... -->
</configuration>
</plugin>

Последнюю версию можно найти здесь .

5.1. Реестр контейнеров Azure

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

Итак, давайте создадим его:

az acr create --admin-enabled --resource-group foreach-group \
--location japanwest --name foreachadr --sku Basic

Нам также понадобится информация аутентификации Container Registry, и ее можно запросить, используя:

> az acr credential show --name foreachadr --query passwords[0]
{
"additionalProperties": {},
"name": "password",
"value": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

Затем добавьте следующую конфигурацию аутентификации сервера в Maven settings.xml :

<server>
<id>foreachadr</id>
<username>foreachadr</username>
<password>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</password>
</server>

5.2. Конфигурация плагина Maven

Давайте добавим следующую конфигурацию плагина Maven в pom.xml :

<properties>
<!-- ... -->
<azure.containerRegistry>foreachadr</azure.containerRegistry>
<docker.image.prefix>${azure.containerRegistry}.azurecr.io</docker.image.prefix>
</properties>

<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<registryUrl>https://${docker.image.prefix}</registryUrl>
<serverId>${azure.containerRegistry}</serverId>
<dockerDirectory>docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- ... -->
</plugins>
</build>

В приведенной выше конфигурации мы указали имя образа докера, URL-адрес реестра и некоторые свойства, аналогичные свойствам FTP-развертывания.

Обратите внимание, что плагин будет использовать значения в <dockerDirectory> для поиска Dockerfile . Мы помещаем Dockerfile в каталог docker , и его содержимое:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD azure-0.1.jar app.jar
RUN sh -c 'touch /app.jar'
EXPOSE 8080
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

5.3. Запустите приложение Spring Boot в экземпляре Docker

Теперь мы можем создать образ Docker и отправить его в реестр Azure:

> mvn docker:build -DpushImage
...
[INFO] Building image foreachadr.azurecr.io/azure-0.1
...
Successfully built aaaaaaaaaaaa
Successfully tagged foreachadr.azurecr.io/azure-0.1:latest
[INFO] Built foreachadr.azurecr.io/azure-0.1
[INFO] Pushing foreachadr.azurecr.io/azure-0.1
The push refers to repository [foreachadr.azurecr.io/azure-0.1]
...
latest: digest: sha256:0f0f... size: 1375

После завершения загрузки давайте проверим реестр foreachadr . Мы увидим изображение в списке репозитория:

./85422be71fb9fc4a831e98a1e53b5f36.png

Теперь мы готовы запустить экземпляр образа:

./61a730296e3d989dfc170dbcb5bfa315.png

После загрузки экземпляра мы можем получить доступ к службам, предоставляемым нашим приложением, через его общедоступный IP-адрес:

> curl http://a.x.y.z:8080/hello
hello azure!

5.4. Развертывание контейнера Docker

Предположим, у нас есть реестр контейнеров, независимо от того, находится ли он в Azure, Docker Hub или в нашем частном реестре.

С помощью следующей конфигурации azure-webapp-maven-plugin мы также можем развернуть наше веб-приложение Spring Boot в контейнерах:

<configuration>
<containerSettings>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<registryUrl>https://${docker.image.prefix}</registryUrl>
<serverId>${azure.containerRegistry}</serverId>
</containerSettings>
<!-- ... -->
</configuration>

Как только мы запустим mvn azure-webapp:deploy , плагин поможет развернуть наш архив веб-приложения на экземпляр указанного образа.

Затем мы можем получить доступ к веб-службам через IP-адрес экземпляра или URL-адрес службы приложений Azure.

6. Заключение

В этой статье мы рассказали, как развернуть приложение Spring Boot в Azure в виде развертываемого файла WAR или исполняемого файла JAR в контейнере. Хотя мы рассмотрели большую часть функций azure-webapp-maven-plugin , некоторые дополнительные функции еще предстоит изучить. Пожалуйста, проверьте здесь для более подробной информации.

Как всегда, полную реализацию примеров кода можно найти на Github .