Руководство по созданию веб-приложения Java Spring Boot с помощью Службы приложений Azure в Linux и Azure Cosmos DBTutorial: Build a Java Spring Boot web app with Azure App Service on Linux and Azure Cosmos DB

В данном руководстве описывается процесс создания, настройки, развертывания и масштабирования веб-приложений Java в Azure.This tutorial walks you through the process of building, configuring, deploying, and scaling Java web apps on Azure. Когда вы выполните инструкции руководства, у вас будет приложение Spring Boot, данные которого хранятся в Azure Cosmos DB, которая работает в Службе приложений Azure на Linux.When you are finished, you will have a Spring Boot application storing data in Azure Cosmos DB running on Azure App Service on Linux.

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

В этом руководстве описано следующее:In this tutorial, you learn how to:

  • Создание базы данных Cosmos DBCreate a Cosmos DB database.
  • Подключение примера приложения к базе данных и его локальное тестированиеConnect a sample app to the database and test it locally
  • Развертывание примера приложения в AzureDeploy the sample app to Azure
  • Потоковая передача журналов диагностики из службы приложенийStream diagnostic logs from App Service
  • Добавление дополнительных экземпляров для горизонтального увеличения масштаба примера приложенияAdd additional instances to scale out the sample app

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.If you don't have an Azure subscription, create a free account before you begin.

Предварительные требованияPrerequisites

Клонирование примера приложения со списком задач и подготовка репозиторияClone the sample TODO app and prepare the repo

В этом руководстве используется пример приложения со списком задач с веб-интерфейсом, который вызывает REST API Spring, поддерживаемый Azure Cosmos DB Spring Data.This tutorial uses a sample TODO list app with a web UI that calls a Spring REST API backed by Spring Data Azure Cosmos DB. Код для приложения можно найти на сайте GitHub.The code for the app is available on GitHub. Дополнительные сведения о создании приложений Java с помощью Spring и Cosmos DB см. в статье Использование начального приложения Spring Boot с API SQL Azure Cosmos DB и Spring Data for Azure Cosmos DB (Spring Data для Azure Cosmos DB).To learn more about writing Java apps using Spring and Cosmos DB, see the Spring Boot Starter with the Azure Cosmos DB SQL API tutorial and the Spring Data Azure Cosmos DB quick start.

Выполните следующие команды в терминале, чтобы клонировать репозиторий и настроить среду примера приложения.Run the following commands in your terminal to clone the sample repo and set up the sample app environment.

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 DBCreate an Azure Cosmos DB

Чтобы создать базу данных Azure Cosmos DB в подписке, выполните следующие действия.Follow these steps to create an Azure Cosmos DB database in your subscription. Приложение списка задач подключится к этой базе данных и сохранит данные при запуске, сохраняя состояние приложения независимо от того, где вы его запускаете.The TODO list app will connect to this database and store its data when running, persisting the application state no matter where you run the application.

  1. Войдите в Azure CLI и при необходимости настройте подписку, если у вас есть несколько подключенных к учетным данным для входа.Login your Azure CLI, and optionally set your subscription if you have more than one connected to your login credentials.

    az login
    az account set -s <your-subscription-id>
    
  2. Создайте группу ресурсов Azure, указав ее имя.Create an Azure Resource Group, noting the resource group name.

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. Создайте Azure Cosmos DB с видом GlobalDocumentDB.Create Azure Cosmos DB with the GlobalDocumentDB kind. В имени Cosmos DB нужно использовать только строчные буквы.The name of Cosmos DB must use only lower case letters. Запишите поле documentEndpoint в ответе от команды.Note down the documentEndpoint field in the response from the command.

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. Получите ключ Azure Cosmos DB, чтобы подключиться к приложению.Get your Azure Cosmos DB key to connect to the app. Сохраните primaryMasterKey и documentEndpoint поблизости, так как они потребуются на следующем шаге.Keep the primaryMasterKey, documentEndpoint nearby as you'll need them in the next step.

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

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

Откройте окно терминала на компьютере.Open a terminal on your computer. Скопируйте пример файла сценария в клонированный репозиторий, чтобы его можно было настроить для только что созданной базы данных Cosmos DB.Copy the sample script file in the cloned repo so you can customize it for your Cosmos DB database you just created.

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

Отредактируйте .scripts/set-env-variables.sh в любом удобном редакторе и укажите сведения о подключении Azure Cosmos DB.Edit .scripts/set-env-variables.sh in your favorite editor and supply Azure Cosmos DB connection info. Для конфигурации службы приложений на платформе Linux используйте тот же регион, что и раньше (your-resource-group-region), и группу ресурсов (your-azure-group-name), используемую при создании базы данных Cosmos DB.For the App Service Linux configuration, use the same region as before (your-resource-group-region) and resource group (your-azure-group-name) used when creating the Cosmos DB database. Выберите уникальное имя WEBAPP_NAME, так как оно не должно совпадать с любым именем веб-приложения в любом развертывании Azure.Choose a WEBAPP_NAME that is unique since it cannot duplicate any web app name in any Azure deployment.

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>

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

source .scripts/set-env-variables.sh

Эти переменные среды используются в application.properties в приложении со списком задач.These environment variables are used in application.properties in the TODO list app. Поля в файле свойств задают конфигурацию репозиторию по умолчанию для Spring Data:The fields in the properties file set up a default repository configuration for 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, чтобы настроить тип сущности, который будет хранить и контролировать Cosmos DB:Then the sample app uses the @Document annotation imported from com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document to set up an entity type to be stored and managed by Cosmos DB:

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

Запуск примера приложенияRun the sample app

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

mvn package spring-boot:run

Полученный результат должен выглядеть примерно так:The output should look like the following.

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/.You can access Spring TODO App locally using this link once the app is started: http://localhost:8080/.

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

Если вместо сообщения "Приложение со списком задач запущено" отображаются исключения, убедитесь, что скрипт bash на предыдущем шаге правильно экспортировал переменные среды и что значения для созданной базы данных Azure Cosmos DB верны.If you see exceptions instead of the "Started TodoApplication" message, check that the bash script in the previous step exported the environment variables properly and that the values are correct for the Azure Cosmos DB database you created.

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

Откройте файл pom.xml в каталоге initial/spring-boot-todo и добавьте конфигурацию подключаемого модуля веб-приложения Azure для Maven.Open the pom.xml file in the initial/spring-boot-todo directory and add the following Azure Web App Plugin for Maven configuration.

<plugins> 

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

            <!-- Web App information -->
            <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
            <appName>${WEBAPP_NAME}</appName>
            <region>${REGION}</region>

            <!-- Java Runtime Stack for Web App on Linux-->
            <runtime>
                 <os>linux</os>
                 <javaVersion>jre8</javaVersion>
                 <webContainer>jre8</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лужбу приложений на платформе LinuxDeploy to App Service on Linux

Используйте целевой объект Maven azure-webapp:deploy, чтобы развернуть приложение со списком задач в Службу приложений Azure на платформе Linux.Use the azure-webapp:deploy Maven goal to deploy the TODO app to Azure App Service on 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:1.9.1:deploy (default-cli) @ spring-todo-app ---
[INFO] Auth Type : AZURE_CLI, Auth Files : [C:\Users\testuser\.azure\azureProfile.json, C:\Users\testuser\.azure\accessTokens.json]
[INFO] Subscription : xxxxxxxxx
[INFO] Target Web App doesn't exist. Creating a new one...
[INFO] Creating App Service Plan 'ServicePlanb6ba8178-5bbb-49e7'...
[INFO] Successfully created App Service Plan.
[INFO] Successfully created Web App.
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource to /home/test/e2e-java-experience-in-app-service-linux-part-2/initial/spring-todo-app/target/azure-webapp/spring-todo-app-61bb5207-6fb8-44c4-8230-c1c9e4c099f7
[INFO] Trying to deploy artifact to spring-todo-app...
[INFO] Renaming /home/test/e2e-java-experience-in-app-service-linux-part-2/initial/spring-todo-app/target/azure-webapp/spring-todo-app-61bb5207-6fb8-44c4-8230-c1c9e4c099f7/spring-todo-app-2.0-SNAPSHOT.jar to app.jar
[INFO] Deploying the zip package spring-todo-app-61bb5207-6fb8-44c4-8230-c1c9e4c099f7718326714198381983.zip...
[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).The output contains the URL to your deployed application (in this example, https://spring-todo-app.azurewebsites.net ). Этот URL-адрес можно скопировать в веб-браузер или выполнить следующую команду в окне терминала, чтобы загрузить приложение.You can copy this URL into your web browser or run the following command in your Terminal window to load your app.

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

Вы должны увидеть приложение, которое выполняется с удаленным URL-адресом, в адресной строке:You should see the app running with the remote URL in the address bar:

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

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

Чтобы получить доступ к журналам консоли, созданным внутри кода приложения в службе приложений, включите ведение журнала диагностики, выполнив следующую команду в Cloud Shell:To access the console logs generated from inside your application code in App Service, turn on diagnostics logging by running the following command in the Cloud Shell:

az webapp log config --resource-group <resource-group-name> --name <app-name> --application-logging true --level Verbose

Возможные значения для --level : Error , Warning , Info и Verbose .Possible values for --level are: Error, Warning, Info, and Verbose. Каждый последующий уровень включает предыдущий уровень.Each subsequent level includes the previous level. Например: Error включает только сообщения об ошибках и Verbose включает все сообщения.For example: Error includes only error messages, and Verbose includes all messages.

После включения ведения журнала диагностики выполните следующую команду, чтобы просмотреть поток журнала:Once diagnostic logging is turned on, run the following command to see the log stream:

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

Если журналы консоли не отображаются, проверьте еще раз через 30 секунд.If you don't see console logs immediately, check again in 30 seconds.

Примечание

Вы также можете проверить файлы журнала в браузере на странице https://<app-name>.scm.azurewebsites.net/api/logs/docker.You can also inspect the log files from the browser at https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Чтобы остановить потоковую передачу журналов, нажмите клавиши Ctrl+C.To stop log streaming at any time, type Ctrl+C.

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

Выполните горизонтальное увеличение масштаба приложения, добавив другую рабочую роль:Scale out the application by adding another worker:

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

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

Если эти ресурсы не требуются для изучения другого руководства (см. раздел Дальнейшие действия), их можно удалить, выполнив следующие команды в Cloud Shell:If you don't need these resources for another tutorial (see Next steps), you can delete them by running the following command in the Cloud Shell:    

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

Дальнейшие действияNext steps

Azure для разработчиков Java Spring Boot, Использование начального приложения Spring Boot с API SQL Azure Cosmos DB, Добро пожаловать в базу данных Azure Cosmos DB, Вводные сведения о службе приложений Azure на платформе Linux.Azure for Java Developers Spring Boot, Spring Data for Cosmos DB, Azure Cosmos DB and App Service Linux.

Дополнительные сведения о запуске приложений Java в Службе приложений Azure в Linux см. в статьеLearn more about running Java apps on App Service on Linux in the developer guide.