services | platforms | author |
---|---|---|
app-service, cosmos-db |
java |
selvasingh |
This guide walks you through the process of building, configuring, deploying, trouble shooting and scaling Java Web apps in App Service Linux.
You will build a Java Web app using Spring Boot, Spring Data for Cosmos DB, Azure Cosmos DB and App Service Linux.
In order to deploy a Java Web app to cloud, you need an Azure subscription. If you do not already have an Azure subscription, you can activate your MSDN subscriber benefits or sign up for a free Azure account.
In addition, you will need the following:
| Azure CLI | Java 8 | Maven 3 | Git |
You can start from scratch and complete each step, or you can bypass basic setup steps that you are already familiar with. Either way, you will end up with working code.
When you are finished, you can check your results against YOUR code in e2e-java-experience-in-app-service-linux-part-2/complete.
You can start from e2e-java-experience-in-app-service-linux-part-2/initial. Or, you can clone from spring-todo-app
If you are starting from scratch, you can scaffold a Web app using Maven Web app archetype or start.spring.io.
git clone --recurse-submodules https://github.com/Azure-Samples/e2e-java-experience-in-app-service-linux-part-2.git
yes | cp -rf .prep/* .
Create Azure Cosmos DB using Azure CLI 2.0
Login your Azure CLI, and set your subscription
az login
az account set -s <your-subscription-id>
Create an Azure Resource Group, and note down the resource group name
az group create -n <your-azure-group-name> \
-l <your-resource-group-region>
Create Azure Cosmos DB with GlobalDocumentDB kind.
The name of Cosmos DB must use only lower case letters. Note down the documentEndpoint
field in the response
az cosmosdb create --kind GlobalDocumentDB \
-g <your-azure-group-name> \
-n <your-azure-COSMOS-DB-name-in-lower-case-letters>
Get your Azure Cosmos DB key, get the primaryMasterKey
az cosmosdb list-keys -g <your-azure-group-name> -n <your-azure-COSMOSDB-name>
Open the initial/spring-todo-app sample app in your favorite IDE - IntelliJ | Eclipse | VS Code.
cd initial/spring-todo-app
Set environment variables using a script file. Start with the supplied template in the repo:
cp set-env-variables-template.sh .scripts/set-env-variables.sh
Edit .scripts/set-env-variables.sh and supply Azure Cosmos DB connection info. Particularly:
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>
Set environment variables:
source .scripts/set-env-variables.sh
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://asir-cosmosdb-01-19-2008-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)
You can access Spring TODO App here: http://localhost:8080/.
Add Maven Plugin for Azure App Service configuration to POM.xml and deploy Spring TODO App to Java SE in App Service Linux:
<plugins>
<!--*************************************************-->
<!-- Deploy to Java SE in App Service Linux -->
<!--*************************************************-->
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-webapp-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<deploymentType>jar</deploymentType>
<!-- Web App information -->
<resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
<appName>${WEBAPP_NAME}</appName>
<region>${REGION}</region>
<!-- Java Runtime Stack for Web App on Linux-->
<linuxRuntime>jre8</linuxRuntime>
<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>
// 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.4.0:deploy (default-cli) @ spring-todo-app ---
[INFO] Authenticate with Azure CLI 2.0
[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] 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: 2018-10-28T15:32:03-07:00
[INFO] Final Memory: 50M/574M
[INFO] ------------------------------------------------------------------------
open https://spring-todo-app.azurewebsites.net
Configure logs for the deployed Java Web app in App Service Linux:
az webapp log config --name ${WEBAPP_NAME} \
--resource-group ${RESOURCEGROUP_NAME} \
--web-server-logging filesystem
Open Java Web app remote log stream from a local machine:
az webapp log tail --name ${WEBAPP_NAME} \
--resource-group ${RESOURCEGROUP_NAME}
bash-3.2$ az webapp log tail --name ${WEBAPP_NAME} --resource-group ${RESOURCEGROUP_NAME}
2018-10-28T22:50:17 Welcome, you are now connected to log-streaming service.
2018-10-28T22:44:56.265890407Z _____
2018-10-28T22:44:56.265930308Z / _ \ __________ _________ ____
2018-10-28T22:44:56.265936008Z / /_\ \___ / | \_ __ \_/ __ \
2018-10-28T22:44:56.265940308Z / | \/ /| | /| | \/\ ___/
2018-10-28T22:44:56.265944408Z \____|__ /_____ \____/ |__| \___ >
2018-10-28T22:44:56.265948508Z \/ \/ \/
2018-10-28T22:44:56.265952508Z A P P S E R V I C E O N L I N U X
2018-10-28T22:44:56.265956408Z Documentation: http://aka.ms/webapp-linux
2018-10-28T22:44:56.266260910Z Setup openrc ...
2018-10-28T22:44:57.396926506Z Service `hwdrivers' needs non existent service `dev'
2018-10-28T22:44:57.397294409Z * Caching service dependencies ... [ ok ]
2018-10-28T22:44:57.474152273Z Starting ssh service...
...
...
2018-10-28T22:46:13.432160734Z [INFO] AnnotationMBeanExporter - Registering beans for JMX exposure on startup
2018-10-28T22:46:13.744859424Z [INFO] TomcatWebServer - Tomcat started on port(s): 80 (http) with context path ''
2018-10-28T22:46:13.783230205Z [INFO] TodoApplication - Started TodoApplication in 57.209 seconds (JVM running for 70.815)
2018-10-28T22:46:14.887366993Z 2018-10-28 22:46:14.887 INFO 198 --- [p-nio-80-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-10-28T22:46:14.887637695Z [INFO] DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization started
2018-10-28T22:46:14.998479907Z [INFO] DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization completed in 111 ms
2018-10-28T22:49:20.572059062Z Sun Oct 28 22:49:20 GMT 2018 GET ======= /api/todolist =======
2018-10-28T22:49:25.850543080Z Sun Oct 28 22:49:25 GMT 2018 DELETE ======= /api/todolist/{4f41ab03-1b12-4131-a920-fe5dfec106ca} =======
2018-10-28T22:49:26.047126614Z Sun Oct 28 22:49:26 GMT 2018 GET ======= /api/todolist =======
2018-10-28T22:49:30.201740227Z Sun Oct 28 22:49:30 GMT 2018 POST ======= /api/todolist ======= Milk
2018-10-28T22:49:30.413468872Z Sun Oct 28 22:49:30 GMT 2018 GET ======= /api/todolist =======
When you are finished, you can check your results against YOUR code in e2e-java-experience-in-app-service-linux-part-2/complete.
Scale out Java Web app using Azure CLI:
az appservice plan update --number-of-workers 2 \
--name ${WEBAPP_PLAN_NAME} \
--resource-group ${RESOURCEGROUP_NAME}
Congratulations!! You built and scaled out a Java Web app using Spring Boot, Spring Data for Cosmos DB, Azure Cosmos DB and App Service Linux. .
This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.