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

Разверните приложение 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:

image

После включения 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. Мы увидим изображение в списке хранилищ:

image

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

image

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