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 в приложении на портале :
После включения 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
. Мы увидим изображение в списке репозитория:
Теперь мы готовы запустить экземпляр образа:
После загрузки экземпляра мы можем получить доступ к службам, предоставляемым нашим приложением, через его общедоступный 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 .