Разверните приложение Spring Boot в Azure
1. Вступление
Microsoft Azure теперь имеет довольно солидную поддержку Java.
В этом руководстве мы шаг за шагом продемонстрируем, как заставить наше приложение Spring Boot работать на платформе Azure.
2. Зависимость и конфигурация Maven
Во-первых,we do need an Azure subscription to make use of the cloud services there; в настоящее время мы можем зарегистрировать бесплатный аккаунтhere.
Затем войдите на платформу и создайте принципала службы, используя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"
}
Теперьwe configure Azure service principal authentication settings in our Maven settings.xml с помощью следующего раздела под<servers>:
azure-auth
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
tttttttt-tttt-tttt-tttt-tttttttttttt
password
AZURE
Мы будем полагаться на конфигурацию аутентификации выше при загрузке нашего приложения Spring Boot на платформу Microsoft, используяazure-webapp-maven-plugin.
Давайте добавим вpom.xml следующий плагин Maven:
com.microsoft.azure
azure-webapp-maven-plugin
1.1.0
Мы можем проверить последнюю версию релизаhere.
У этого плагина есть несколько настраиваемых свойств, о которых пойдет речь в следующем введении.
3. Разверните приложение Spring Boot в Azure
Теперь, когда мы настроили среду, давайте попробуем развернуть наше приложение Spring Boot в Azure.
Наше приложение отвечает «hello azure!», когда мы обращаемся к «/hello»:
@GetMapping("/hello")
public String hello() {
return "hello azure!";
}
Платформа теперь позволяет развертывать Java Web App для Tomcat и Jetty. С помощьюazure-webapp-maven-plugin мы можем развернуть наше приложение непосредственно в поддерживаемых веб-контейнерах в качестве приложения по умолчанию (ROOT) или развернуть через FTP.
Обратите внимание, что поскольку мы собираемся развернуть приложение в веб-контейнерах, мы должны упаковать его как архив WAR. Напоминаем, что у нас есть статья оhow to deploy a Spring Boot WAR into Tomcat.
3.1. Развертывание веб-контейнера
Мы будем использовать следующую конфигурацию дляazure-webapp-maven-plugin, если мы собираемся развернуть Tomcat на экземпляре Windows:
1.8
tomcat 8.5
Для экземпляра Linux попробуйте следующую конфигурацию:
tomcat 8.5-jre8
Не забываем про аутентификацию Azure:
azure-auth
spring-azure
example
Когда мы развертываем наше приложение в Azure, мы видим, что оно отображается как служба приложений. Итак, здесь мы указали свойство<appName> для имени службы приложений. Кроме того, служба приложений как ресурс должна удерживатьсяresource group container, поэтому<resourceGroup> также требуется.
Now we’re ready to pull the trigger using the azure-webapp:deploy Maven target, и мы увидим результат:
> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App spring-example...
[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-example.azurewebsites.net
...
Now we can access https://spring-example.azurewebsites.net/hello и увидите ответ: «привет, лазурный!».
В процессе развертывания Azure автоматически создал для нас план обслуживания приложений. Ознакомьтесь сofficial document для получения подробной информации о планах службы приложений Azure. Если у нас уже есть план службы приложений, мы можем установить свойство<appServicePlanName>, чтобы не создавать новый:
ServicePlanssssssss-bbbb-0000
3.2. Развертывание FTP
Для развертывания через FTP мы можем использовать конфигурацию:
azure-auth
spring-example
example
1.8
ftp
${project.basedir}/target
webapps
*.war
В приведенной выше конфигурации мы заставляем плагин находить файл WAR в каталоге$\{project.basedir}/target и развертывать его в каталогеwebapps контейнера Tomcat.
Скажем, наш последний артефакт называетсяazure-0.1.war,, мы увидим следующий результат, когда начнем развертывание:
> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App spring-example...
[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-example --> /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-example.azurewebsites.net
Обратите внимание, что здесь мы не развернули наше приложение в качестве веб-приложения по умолчанию для Tomcat, поэтому мы можем получить к нему доступ только через «https://spring-example.azurewebsites.net/azure-0.1/hello». Сервер ответит: «Привет, лазурь!» как и ожидалось.
4. Развертывание с пользовательскими настройками приложения
В большинстве случаев нашему приложению Spring Boot требуется доступ к данным для предоставления услуг. Azure теперь поддерживает базы данных, такие как SQL Server, MySQL и PostgreSQL.
Для простоты мы будем использовать встроенный в приложение MySQL в качестве источника данных, поскольку его конфигурация очень похожа на другие службы баз данных Azure.
4.1. Включить встроенный MySQL в Azure
Поскольку не существует однострочника для создания веб-приложения с включенным MySQL In-App, мы должны сначала создать веб-приложение с помощью интерфейса командной строки:
az group create --location japanwest --name bealdung-group
az appservice plan create --name example-plan --resource-group bealdung-group --sku B1
az webapp create --name example-webapp --resource-group example-group \
--plan example-plan --runtime java|1.8|Tomcat|8.5
Тогдаenable MySQL in App inthe portal:
После включения MySQL в приложении мы можем найти базу данных по умолчанию, URL-адрес источника данных и информацию об учетной записи по умолчанию в файле с именемMYSQLCONNSTR_xxx.txt в каталоге/home/data/mysql файловой системы.
4.2. Приложение Spring Boot, использующее Azure In-App MySQL
Здесь для демонстрационных нужд мы создаем объектUser и две конечные точки, используемые дляregister иlistUsers:.
@PostMapping("/user")
public String register(@RequestParam String name) {
userRepository.save(userNamed(name));
return "registered";
}
@GetMapping("/user")
public Iterable userlist() {
return userRepository.findAll();
}
Мы собираемся использовать базу данных H2 в нашей локальной среде и переключить ее на MySQL в Azure. Обычно мы настраиваем свойства источника данных в файлеapplication.properties:
spring.datasource.url=jdbc:h2:file:~/test
spring.datasource.username=sa
spring.datasource.password=
В то время как для развертывания Azurewe need to configure azure-webapp-maven-plugin in *<appSettings>*:
azure-auth
1.8
example-group
example-webapp
bealdung-plan
spring.datasource.url
jdbc:mysql://127.0.0.1:55738/localdb
spring.datasource.username
uuuuuu
spring.datasource.password
pppppp
Теперь мы можем начать развертывание:
> 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://example-webapp.azurewebsites.net
Из журнала видно, что развертывание завершено.
Давайте протестируем наши новые конечные точки:
> curl -d "" -X POST https://example-webapp.azurewebsites.net/user\?name\=example
registered
> curl https://example-webapp.azurewebsites.net/user
[{"id":1,"name":"example"}]
Ответ сервера говорит сам за себя. Оно работает!
5. Разверните контейнерное приложение Spring Boot в Azure
В предыдущих разделах мы показали, как развертывать приложения в контейнерах сервлетов (в данном случае Tomcat). Как насчет развертывания в качестве автономной управляемой банки?
На данный момент нам может понадобиться контейнировать наше приложение Spring Boot. В частности, мы можем докеризовать его и загрузить изображение в Azure.
У нас уже есть статья проhow to dockerize a Spring Boot App, но здесьwe’re about to make use of another maven plugin: docker-maven-plugin, to automate dockerization for us:
com.spotify
docker-maven-plugin
1.1.0
Последнюю версию можно найтиhere.
5.1. Реестр контейнеров Azure
Во-первых,we need a Container Registry on Azure to upload our docker image.
Итак, давайте создадим его:
az acr create --admin-enabled --resource-group example-group \
--location japanwest --name exampleadr --sku Basic
Нам также понадобится информация для аутентификации из реестра контейнеров, которую можно запросить, используя:
> az acr credential show --name exampleadr --query passwords[0]
{
"additionalProperties": {},
"name": "password",
"value": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
Затем добавьте следующую конфигурацию аутентификации сервера в Mavensettings.xml:
exampleadr
exampleadr
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
5.2. Конфигурация плагина Maven
Давайте добавим следующую конфигурацию плагина Maven вpom.xml:
exampleadr
${azure.containerRegistry}.azurecr.io
com.spotify
docker-maven-plugin
1.0.0
${docker.image.prefix}/${project.artifactId}
https://${docker.image.prefix}
${azure.containerRegistry}
docker
/
${project.build.directory}
${project.build.finalName}.jar
В приведенной выше конфигурации мы указали имя образа докера, 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 App в экземпляре Docker
Теперь мы можем создать образ Docker и отправить его в реестр Azure:
> mvn docker:build -DpushImage
...
[INFO] Building image exampleadr.azurecr.io/azure-0.1
...
Successfully built aaaaaaaaaaaa
Successfully tagged exampleadr.azurecr.io/azure-0.1:latest
[INFO] Built exampleadr.azurecr.io/azure-0.1
[INFO] Pushing exampleadr.azurecr.io/azure-0.1
The push refers to repository [exampleadr.azurecr.io/azure-0.1]
...
latest: digest: sha256:0f0f... size: 1375
После завершения загрузки давайте проверим реестрexampleadr. Мы увидим изображение в списке хранилищ:
Теперь мы готовы запустить экземпляр изображения:
После загрузки экземпляра мы можем получить доступ к службам, предоставляемым нашим приложением, через его общедоступный IP-адрес:
> curl http://a.x.y.z:8080/hello
hello azure!
5.4. Развертывание контейнера Docker
Предположим, у нас есть реестр контейнеров, будь то из Azure, Docker Hub или из нашего частного реестра.
С помощью следующей конфигурацииazure-webapp-maven-plugin мы также можем развернуть наше веб-приложение Spring Boot в контейнерах:
${docker.image.prefix}/${project.artifactId}
https://${docker.image.prefix}
${azure.containerRegistry}
После того как мы запустимmvn azure-webapp:deploy, плагин поможет развернуть архив нашего веб-приложения в экземпляре указанного образа.
Затем мы можем получить доступ к веб-службам через IP-адрес экземпляра или URL-адрес службы приложений Azure.
6. Заключение
В этой статье мы рассказали, как развернуть приложение Spring Boot в Azure в качестве развертываемого WAR или исполняемого JAR-файла в контейнере. Хотя мы рассмотрели большинство возможностейazure-webapp-maven-plugin, есть еще несколько обширных функций, которые еще предстоит изучить. Пожалуйста, проверьтеhere для получения более подробной информации.
Как всегда, полную реализацию примеров кода можно найти вon Github.