傳統(tǒng)的Java Web應用通常編譯為war包议泵,以Servlet的形式放在Tomcat倘屹、Jetty等Web容器中運行蓖宦。Spring Boot通過內(nèi)嵌Tomcat宵呛,將應用編譯成jar包的形式,可以通過java -jar filename.jar
直接運行蚁阳。
Azure是微軟的公有云服務铃绒,在Azure上部署Web應用主要有以下幾種方式:
- 應用服務(App Service),PaaS服務螺捐,全托管的環(huán)境颠悬,開發(fā)者只需要向FTP服務器或git倉庫推送代碼即可完成部署矮燎;
- 云服務(Cloud Service),可以結(jié)合Web實例(通過 IIS自動部署和托管應用)和輔助實例(不使用IIS赔癌,獨立運行應用)構(gòu)建應用诞外,相對于應用服務更加靈活,可以自己登錄到實例上進行控制灾票;
- 虛擬機(VM)峡谊,開通虛擬機后,自己在操作系統(tǒng)上安裝JDK刊苍、Tomcat等既们,并將war包或jar包放到上面運行;
- 容器(Docker)正什,開發(fā)者將應用打包為docker鏡像啥纸,放到虛擬機上運行,并且可以進一步拓展為微服務架構(gòu)婴氮,通過Service Fabric調(diào)度和管理斯棒。
在這幾種方式中,最方便的當屬應用服務(App Service)主经。本文整理了官方文檔中幾種將Spring Boot應用部署到應用服務的具體方法荣暮。
1. 通過IDE插件一鍵發(fā)布
這是最簡單的方法,Azure提供了Eclipse和IntelliJ IDEA的插件(通過Visual Studio應該也是可以的罩驻,沒有確認):
- Eclipse: 在 Azure 中創(chuàng)建第一個 Java Web 應用 | Azure Docs
- IntelliJ IDEA: 在 IntelliJ 中創(chuàng)建基本的 Azure Web 應用 | Azure Docs
上面兩篇文章中的示例工程是基于JSP頁面的渠驼,對于Spring Boot工程,過程也是一樣的鉴腻。
關于IntelliJ IDEA插件的安裝與登錄國內(nèi)版賬號:
2. 手動創(chuàng)建應用服務,在本地編譯Jar包百揭,推送代碼
這種方法的原理與第一種完全一樣爽哎,插件相當于將整個過程自動化了。具體操作步驟詳見這篇發(fā)表在MSDN博客上的文章:Deploy Java 8 Spring Boot API to Azure App Service – Cloud Solution Architect
其中創(chuàng)建應用服務可以如文中所介紹通過Azure Cloud Shell器一,也可以通過在本地運行Azure CLI课锌,或者登錄到portal,在圖形界面中操作祈秕。
對于推送代碼渺贤,文章中介紹的是git方式,插件中用的是FTP请毛。
3. 通過Azure App Service的maven插件
這種方法不需要IDE志鞍,可以在命令行完成,并且通過修改pom.xml文件和Application類方仿,將Spring Boot應用編譯成了war包固棚。
詳見:使用 Maven 和 Azure 將 Spring Boot 應用部署到云中 | Azure Docs统翩,英文原版:
Deploy a Spring Boot app to the cloud with Maven and Azure | Microsoft Docs
4. 使用同樣的maven插件,但以docker形式打包和發(fā)布
詳見:How to use the Maven Plugin for Azure Web Apps to deploy a Spring Boot app in Azure Container Registry to Azure App Service | Microsoft Docs
這種方法與上一種的不同之處首先在于此洲,本地編譯出來的不再是war包厂汗,也不是jar包,而是docker鏡像呜师。上一種使用的示例工程是spring-guides/gs-spring-boot娶桦,這一種是spring-guides/gs-spring-boot-docker。
并且接下來先將鏡像發(fā)布到Azure Container Registry汁汗,然后再部署到App Service中衷畦,對應的pom.xml文件中,在maven插件的配置中少了<deploymentType>
碰酝,多了<containerSettings>
霎匈,對比如下:
- war包形式:
<plugin> <groupId>com.microsoft.azure</groupId> <artifactId>azure-webapp-maven-plugin</artifactId> <!-- Check latest version on Maven Central --> <version>1.1.0</version> <configuration> <resourceGroup>maven-projects</resourceGroup> <appName>${project.artifactId}-${maven.build.timestamp}</appName> <region>westus</region> <javaVersion>1.8</javaVersion> <deploymentType>war</deploymentType> </configuration> </plugin>
- docker形式:
<plugin> <groupId>com.microsoft.azure</groupId> <artifactId>azure-webapp-maven-plugin</artifactId> <version>0.1.3</version> <configuration> <authentication> <serverId>azure-auth</serverId> </authentication> <resourceGroup>wingtiptoysresources</resourceGroup> <appName>maven-linux-app-${maven.build.timestamp}</appName> <region>westus</region> <containerSettings> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <registryUrl>https://${docker.image.prefix}</registryUrl> <serverId>${azure.containerRegistry}</serverId> </containerSettings> <appSettings> <property> <name>PORT</name> <value>8080</value> </property> </appSettings> </configuration> </plugin>
因為使用了同樣的maven插件,兩種方法最終部署應用的命令是一樣的:mvn azure-webapp:deploy
送爸。
另外铛嘱,國內(nèi)版的Azure應用服務暫時還不支持容器應用,所以這種方法不適用袭厂。對比國內(nèi)版與國際版的應用服務:Azure應用服務 - Azure云計算 vs Azure 應用服務 - 應用托管 | Microsoft Azure墨吓。
5. 使用IntelliJ的插件發(fā)布docker
最后要介紹的方法與上一種一樣,在本地編譯的是docker項目纹磺,并且借助了在第一種方法中介紹過的IDE插件帖烘,但最終并沒有發(fā)布到應用服務,而是發(fā)布到了Docker主機上橄杨。詳見:使用用于 IntelliJ 的 Azure 工具包將 Spring Boot 應用作為 Docker 容器發(fā)布 | Azure Docs
補充閱讀
- Azure 應用服務秘症、虛擬機、Service Fabric 和云服務的比較 | Azure Docs
- Deploying Spring Boot Applications
- Visual Studio Code and Azure App Service - a perfect fit | 博客 | Microsoft Azure
持續(xù)集成
- Build and deploy Java projects with VSTS | Microsoft Docs
- Use Jenkins to deploy your web apps to Azure | Microsoft Docs
- Create a CI/CD pipeline for Java with the Azure DevOps Project | Microsoft Docs
MySQL數(shù)據(jù)庫
- Azure MySQL數(shù)據(jù)庫_數(shù)據(jù)庫托管服務 - Azure云計算
- MySQL Database on Azure快速入門指南 | Azure Docs
- Announcing MySQL in-app for Web Apps (Windows) | Azure App Service Team Blog