教學課程:使用 Linux 上的 Azure App Service 和 Azure Cosmos DB 建置 Java Spring Boot Web 應用程式
注意
針對 Spring 應用程式,我們建議使用 Azure Spring 應用程式。 不過,您仍然可以使用 Azure App Service 作為目的地。 如需建議,請參閱 Java工作負載目的地指引 。
本教學課程會引導您完成在 Azure 上建置、設定、部署及調整 Java Web 應用程式的程序。 當您完成後,Azure Cosmos DB (在 Linux 上的 Azure App Service 中執行) 中會有一個儲存資料的 Spring Boot 應用程式。
在本教學課程中,您會了解如何:
- 建立 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 清單應用程式會連線到此資料庫,並在執行時儲存其資料,讓您無論在哪執行應用程式,皆可保存應用程式狀態。
登入您的 Azure CLI,並選擇性地設定您的訂用帳戶 (如果您有多個與登入認證連線的訂用帳戶)。
az login az account set -s <your-subscription-id>
建立 Azure 資源群組,並記下 Azure 資源群組名稱。
az group create -n <your-azure-group-name> \ -l <your-resource-group-region>
建立種類為
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>
取得您的 Azure Cosmos DB 金鑰以連線到應用程式。 請將
primaryMasterKey
、documentEndpoint
放在方便取得的地方,因為下一個步驟將會用到。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/
。
如果您看到例外狀況,而不是「啟動 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 執行:
資料流診斷記錄
若要存取 App Service 中應用程式程式碼內部產生的主控台記錄,請在 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
。
擴增 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 DB 和 App Service Linux。
在開發人員指南中深入了解如何在 Linux 中的 App Service 上執行 Java 應用程式。
了解如何使用自訂網域和憑證保障您的應用程式。