教學課程:使用 Linux 上的 Azure App Service 和 Azure Cosmos DB 建置 Java Spring Boot Web 應用程式

注意

針對 Spring 應用程式,我們建議使用 Azure Spring 應用程式。 不過,您仍然可以使用 Azure App Service 作為目的地。

本教學課程會引導您完成在 Azure 上建置、設定、部署及調整 Java Web 應用程式的程序。 當您完成後,Azure Cosmos DB (在 Linux 上的 Azure App Service 中執行) 中會有一個儲存資料的 Spring Boot 應用程式。

Spring Boot application storing data in Azure Cosmos DB

在本教學課程中,您會了解如何:

  • 建立 Azure Cosmos DB 資料庫。
  • 將應用程式範例連線至資料庫,並在本機進行測試
  • 將應用程式範例部署至 Azure
  • 來自 App Service 的串流診斷記錄
  • 新增額外的執行個體來擴增範例應用程式

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

必要條件

複製 TODO 應用程式範例,並準備存放庫

本教學課程將使用具有 Web UI 的範例 TODO 清單應用程式,此 UI 可呼叫由適用於 Azure Cosmos DB 的 Spring 資料支援的 Spring REST API。 您可在 GitHub 上找到應用程式的程式碼。 若要深入了解如何使用 Spring 和 Azure Cosmos DB 撰寫 Java 應用程式,請參閱搭配 Azure Cosmos DB for NoSQL 使用 Spring Boot Starter 的教學課程適用於 Azure Cosmos DB 的 Spring 資料快速入門

在您的終端機中執行下列命令,即可複製範例存放庫並設定範例應用程式環境。

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 資料庫。 TODO 清單應用程式會連線到此資料庫,並在執行時儲存其資料,讓您無論在哪執行應用程式,皆可保存應用程式狀態。

  1. 登入您的 Azure CLI,並選擇性地設定您的訂用帳戶 (如果您有多個與登入認證連線的訂用帳戶)。

    az login
    az account set -s <your-subscription-id>
    
  2. 建立 Azure 資源群組,並記下 Azure 資源群組名稱。

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. 建立種類為 GlobalDocumentDB 的 Azure Cosmos DB。 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 金鑰以連線到應用程式。 請將 primaryMasterKeydocumentEndpoint 放在方便取得的地方,因為下一個步驟將會用到。

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

設定 TODO 應用程式屬性

在電腦上開啟終端機。 在所複製的存放庫中複製範例指令檔,以便針對您剛建立的 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 連線資訊。 針對 App Service Linux 設定,請使用與之前一樣的區域 (your-resource-group-region),並使用建立 Azure Cosmos DB 資料庫時使用的資源群組 (your-azure-group-name)。 選擇唯一的 WEBAPP_NAME,因為任何 Azure 部署中的任何 Web 應用程式名稱都不能重複。

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

這些環境變數會用於 TODO 清單應用程式中的 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> {
}

然後,應用程式範例會使用從 com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document 匯入的 @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 TODO 應用程式啟動之後,您可以使用以下連結從本機存取應用程式:http://localhost:8080/

Access Spring TODO app locally

如果您看到例外狀況,而不是「啟動 TodoApplication」訊息,請確認上一個步驟中的 bash 指令碼是否已正確匯出環境變數,以及這些值是否適用於您建立的 Azure Cosmos DB 資料庫。

設定 Azure 部署

開啟 initial/spring-boot-todo 目錄中的 pom.xml 檔案,並新增下列適用於 Maven 的 Azure Web 應用程式外掛程式設定。

<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>

部署到 Linux 上的 App Service

使用 mvn azure-webapp:deploy Maven 目標將 TODO 應用程式部署至 Linux 上的 Azure App Service。


# 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 application running with a remote URL

資料流診斷記錄

若要存取 App Service 中應用程式程式碼內部產生的主控台記錄,請在 Cloud Shell 中執行下列命令,以開啟診斷記錄功能:

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

--level 的可能值為:ErrorWarningInfoVerbose。 後續的每個層級都包含上一個層級。 例如: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

擴增 TODO 應用程式

藉由新增另一個背景工作角色來擴增應用程式:

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

下一步

適用於 Java 開發人員的 AzureSpring Boot適用於 Azure Cosmos DB 的 Spring 資料Azure Cosmos DBApp Service Linux

在開發人員指南中深入了解如何在 Linux 中的 App Service 上執行 Java 應用程式。

了解如何使用自訂網域和憑證保障您的應用程式。