Руководство. Создание веб-приложения Java Spring Boot с помощью службы приложение Azure в Linux и Azure Cosmos DB

Примечание.

Для приложений Spring рекомендуется использовать Azure Spring Apps. Однако вы по-прежнему можете использовать службу приложение Azure в качестве назначения. Рекомендации по назначению рабочей нагрузки Java см. в руководстве по назначению рабочей нагрузки Java.

В данном руководстве описывается процесс создания, настройки, развертывания и масштабирования веб-приложений Java в Azure. Когда вы выполните инструкции руководства, у вас будет приложение Spring Boot, данные которого хранятся в Azure Cosmos DB, которая работает в Службе приложений Azure на Linux.

Приложение Spring Boot, данные которого хранятся в Azure Cosmos DB

В этом руководстве описано следующее:

  • Создает базу данных Azure Cosmos DB.
  • Подключение примера приложения к базе данных и его локальное тестирование
  • Развертывание примера приложения в Azure
  • Потоковая передача журналов диагностики из службы приложений
  • Добавление дополнительных экземпляров для горизонтального увеличения масштаба примера приложения

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

Необходимые компоненты

Клонирование примера приложения со списком задач и подготовка репозитория

В этом руководстве используется пример приложения списка TODO с веб-интерфейсом, который вызывает REST API Spring, поддерживаемый Spring Data для Azure Cosmos DB. Код для приложения можно найти на сайте GitHub. Дополнительные сведения о написании приложений Java с помощью Spring и Azure Cosmos DB см . в кратком руководстве по Azure Cosmos DB для NoSQL и кратком руководстве по Spring Data для Azure Cosmos DB.

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

git clone --recurse-submodules https://github.com/Azure-Samples/e2e-java-experience-in-app-service-linux-part-2.git
cd e2e-java-experience-in-app-service-linux-part-2
yes | cp -rf .prep/* .

Создание Azure Cosmos DB

Чтобы создать базу данных Azure Cosmos DB в подписке, выполните следующие действия. Приложение списка задач подключится к этой базе данных и сохранит данные при запуске, сохраняя состояние приложения независимо от того, где вы его запускаете.

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

    az login
    az account set -s <your-subscription-id>
    
  2. Создайте группу ресурсов Azure, указав ее имя.

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. Создайте Azure Cosmos DB с видом GlobalDocumentDB. Имя экземпляра Azure Cosmos DB должно использовать только строчные буквы. Запишите поле documentEndpoint в ответе от команды.

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. Получите ключ Azure Cosmos DB, чтобы подключиться к приложению. Сохраните primaryMasterKey и documentEndpoint поблизости, так как они потребуются на следующем шаге.

    az cosmosdb keys list -g <your-azure-group-name> -n <your-azure-COSMOSDB-name>
    

Настройка свойств приложения со списком задач

Откройте терминал на своем компьютере. Скопируйте пример файла скрипта в клонируемом репозитории, чтобы можно было настроить его для только что созданной базы данных Azure Cosmos DB.

cd initial/spring-todo-app
cp set-env-variables-template.sh .scripts/set-env-variables.sh

Измените .scripts/set-env-variables.sh в избранном редакторе и укажите сведения о подключении Azure Cosmos DB. Для конфигурации Служба приложений Linux используйте тот же регион, что и ранее (your-resource-group-region) и группу ресурсов (your-azure-group-name), используемую при создании базы данных Azure Cosmos DB. Выберите уникальное имя WEBAPP_NAME, так как оно не должно совпадать с любым именем веб-приложения в любом развертывании Azure.

export COSMOSDB_URI=<put-your-COSMOS-DB-documentEndpoint-URI-here>
export COSMOSDB_KEY=<put-your-COSMOS-DB-primaryMasterKey-here>
export COSMOSDB_DBNAME=<put-your-COSMOS-DB-name-here>

# App Service Linux Configuration
export RESOURCEGROUP_NAME=<put-your-resource-group-name-here>
export WEBAPP_NAME=<put-your-Webapp-name-here>
export REGION=<put-your-REGION-here>

Затем выполните скрипт:

source .scripts/set-env-variables.sh

Эти переменные среды используются в application.properties в приложении со списком задач. Поля в файле свойств задают конфигурацию репозиторию по умолчанию для Spring Data:

azure.cosmosdb.uri=${COSMOSDB_URI}
azure.cosmosdb.key=${COSMOSDB_KEY}
azure.cosmosdb.database=${COSMOSDB_DBNAME}
@Repository
public interface TodoItemRepository extends DocumentDbRepository<TodoItem, String> {
}

Затем пример приложения использует заметку @Document , импортированную из com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document , чтобы настроить тип сущности для хранения и управления ими с помощью Azure Cosmos DB:

@Document
public class TodoItem {
    private String id;
    private String description;
    private String owner;
    private boolean finished;

Запуск примера приложения

Используйте Maven, чтобы запустить пример.

mvn package spring-boot:run

Полученный результат должен выглядеть примерно так:

bash-3.2$ mvn package spring-boot:run
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-todo-app 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 


[INFO] SimpleUrlHandlerMapping - Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[INFO] SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[INFO] WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html]
2018-10-28 15:04:32.101  INFO 7673 --- [           main] c.m.azure.documentdb.DocumentClient      : Initializing DocumentClient with serviceEndpoint [https://sample-cosmos-db-westus.documents.azure.com:443/], ConnectionPolicy [ConnectionPolicy [requestTimeout=60, mediaRequestTimeout=300, connectionMode=Gateway, mediaReadMode=Buffered, maxPoolSize=800, idleConnectionTimeout=60, userAgentSuffix=;spring-data/2.0.6;098063be661ab767976bd5a2ec350e978faba99348207e8627375e8033277cb2, retryOptions=com.microsoft.azure.documentdb.RetryOptions@6b9fb84d, enableEndpointDiscovery=true, preferredLocations=null]], ConsistencyLevel [null]
[INFO] AnnotationMBeanExporter - Registering beans for JMX exposure on startup
[INFO] TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
[INFO] TodoApplication - Started TodoApplication in 45.573 seconds (JVM running for 76.534)

После запуска приложения Spring со списком задач к нему можно получить доступ локально с помощью этой ссылки: http://localhost:8080/.

Локальный доступ к приложению со списком задач Spring

Если вместо сообщения "Приложение со списком задач запущено" отображаются исключения, убедитесь, что скрипт bash на предыдущем шаге правильно экспортировал переменные среды и что значения для созданной базы данных Azure Cosmos DB верны.

Настройка развертывания в Azure

Откройте файл pom.xml в каталоге initial/spring-boot-todo и добавьте конфигурацию подключаемого модуля веб-приложения Azure для Maven.

<plugins> 

    <!--*************************************************-->
    <!-- Deploy to Java SE in App Service Linux           -->
    <!--*************************************************-->
       
    <plugin>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-webapp-maven-plugin</artifactId>
        <version>2.5.0</version>
        <configuration>
            <schemaVersion>v2</schemaVersion>

            <!-- Web App information -->
            <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
            <appName>${WEBAPP_NAME}</appName>
            <region>${REGION}</region>
            <pricingTier>P1v2</pricingTier>
            <!-- Java Runtime Stack for Web App on Linux-->
            <runtime>
                 <os>linux</os>
                 <javaVersion>Java 8</javaVersion>
                 <webContainer>Java SE</webContainer>
             </runtime>
             <deployment>
                 <resources>
                 <resource>
                     <directory>${project.basedir}/target</directory>
                     <includes>
                     <include>*.jar</include>
                     </includes>
                 </resource>
                 </resources>
             </deployment>

            <appSettings>
                <property>
                    <name>COSMOSDB_URI</name>
                    <value>${COSMOSDB_URI}</value>
                </property> 
                <property>
                    <name>COSMOSDB_KEY</name>
                    <value>${COSMOSDB_KEY}</value>
                </property>
                <property>
                    <name>COSMOSDB_DBNAME</name>
                    <value>${COSMOSDB_DBNAME}</value>
                </property>
                <property>
                    <name>JAVA_OPTS</name>
                    <value>-Dserver.port=80</value>
                </property>
            </appSettings>

        </configuration>
    </plugin>           
    ...
</plugins>

Развертывание в cлужбу приложений на платформе Linux

Используйте целевой объект Maven mvn azure-webapp:deploy, чтобы развернуть приложение со списком задач в Службу приложений Azure на платформе Linux.


# Deploy
bash-3.2$ mvn azure-webapp:deploy
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-todo-app 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- azure-webapp-maven-plugin:2.5.0:deploy (default-cli) @ spring-todo-app ---
Auth Type: AZURE_CLI
Default subscription: xxxxxxxxx
Username: xxxxxxxxx
[INFO] Subscription: xxxxxxxxx
[INFO] Creating App Service Plan 'ServicePlanb6ba8178-5bbb-49e7'...
[INFO] Successfully created App Service Plan.
[INFO] Creating web App spring-todo-app...
[INFO] Successfully created Web App spring-todo-app.
[INFO] Trying to deploy artifact to spring-todo-app...
[INFO] Successfully deployed the artifact to https://spring-todo-app.azurewebsites.net
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:19 min
[INFO] Finished at: 2019-11-06T15:32:03-07:00
[INFO] Final Memory: 50M/574M
[INFO] ------------------------------------------------------------------------

Выходные данные содержат URL-адрес развернутого приложения (в этом примере — https://spring-todo-app.azurewebsites.net). Этот URL-адрес можно скопировать в веб-браузер или выполнить следующую команду в окне терминала, чтобы загрузить приложение.

explorer https://spring-todo-app.azurewebsites.net

Вы должны увидеть приложение, которое выполняется с удаленным URL-адресом, в адресной строке:

Приложение Spring Boot, которое выполняется с удаленным URL-адресом

Потоковая передача журналов диагностики

Чтобы получить доступ к журналам консоли, созданным в коде приложения в Службе приложений, включите ведение журнала диагностики, выполнив следующую команду в Cloud Shell:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

Возможные значения для --level: Error, Warning, Info и Verbose. Каждый последующий уровень включает предыдущий уровень. Например: Error включает только сообщения об ошибках, а Verbose включает все сообщения.

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

az webapp log tail --resource-group <resource-group-name> --name <app-name>

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

Примечание.

Вы также можете проверить файлы журнала в браузере на странице https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Чтобы остановить потоковую передачу журналов, нажмите клавиши Ctrl+C.

Горизонтальное увеличение масштаба приложения со списком задач

Выполните горизонтальное увеличение масштаба приложения, добавив другую рабочую роль:

az appservice plan update --number-of-workers 2 \
   --name ${WEBAPP_PLAN_NAME} \
   --resource-group <your-azure-group-name>

Очистка ресурсов

Если эти ресурсы не требуются для изучения другого руководства (см. раздел Дальнейшие действия), их можно удалить, выполнив следующие команды в Cloud Shell:

az group delete --name <your-azure-group-name> --yes

Следующие шаги

Azure для разработчиковJava Spring Boot, Spring Data для Azure Cosmos DB, Azure Cosmos DB и Служба приложений Linux.

Дополнительные сведения о запуске приложений Java в Службе приложений Azure в Linux см. в статье

Узнайте, как защитить приложение с помощью личного домена и сертификата.