将Spring Boot应用部署到Azure应用服务中的几种方法

传统的Java Web应用通常编译为war包,以Servlet的形式放在Tomcat、Jetty等Web容器中运行。Spring Boot通过内嵌Tomcat,将应用编译成jar包的形式,可以通过java -jar filename.jar直接运行。
Azure是微软的公有云服务,在Azure上部署Web应用主要有以下几种方式:

  • 应用服务(App Service),PaaS服务,全托管的环境,开发者只需要向FTP服务器或git仓库推送代码即可完成部署;
  • 云服务(Cloud Service),可以结合Web实例(通过 IIS自动部署和托管应用)和辅助实例(不使用IIS,独立运行应用)构建应用,相对于应用服务更加灵活,可以自己登录到实例上进行控制;
  • 虚拟机(VM),开通虚拟机后,自己在操作系统上安装JDK、Tomcat等,并将war包或jar包放到上面运行;
  • 容器(Docker),开发者将应用打包为docker镜像,放到虚拟机上运行,并且可以进一步拓展为微服务架构,通过Service Fabric调度和管理。

在这几种方式中,最方便的当属应用服务(App Service)。本文整理了官方文档中几种将Spring Boot应用部署到应用服务的具体方法。

1. 通过IDE插件一键发布

这是最简单的方法,Azure提供了Eclipse和IntelliJ IDEA的插件(通过Visual Studio应该也是可以的,没有确认):

上面两篇文章中的示例工程是基于JSP页面的,对于Spring Boot工程,过程也是一样的。
关于IntelliJ IDEA插件的安装与登录国内版账号:

2. 手动创建应用服务,在本地编译Jar包,推送代码

这种方法的原理与第一种完全一样,插件相当于将整个过程自动化了。具体操作步骤详见这篇发表在MSDN博客上的文章:Deploy Java 8 Spring Boot API to Azure App Service – Cloud Solution Architect
其中创建应用服务可以如文中所介绍通过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形式打包和发布

详见: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
并且接下来先将镜像发布到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
另外,国内版的Azure应用服务暂时还不支持容器应用,所以这种方法不适用。对比国内版与国际版的应用服务:Azure应用服务 - Azure云计算 vs Azure 应用服务 - 应用托管 | Microsoft Azure

5. 使用IntelliJ的插件发布docker

最后要介绍的方法与上一种一样,在本地编译的是docker项目,并且借助了在第一种方法中介绍过的IDE插件,但最终并没有发布到应用服务,而是发布到了Docker主机上。详见:使用用于 IntelliJ 的 Azure 工具包将 Spring Boot 应用作为 Docker 容器发布 | Azure Docs

补充阅读

持续集成

MySQL数据库

API应用

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容