在 Azure 上轻松将 Spring Boot 应用程序部署到生产环境
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
在这篇博文中,我们将把一个经典的 Spring Boot 应用程序部署到 Azure 的生产环境中,重点关注其易用性,无论从开发人员还是运维人员的角度来看都是如此。
为什么选择“最简单的方法”?
虽然以困难的方式使用 Kubernetes很有趣,但如果你的目标是在生产环境中部署和托管 Spring Boot 应用程序,你的客户可能没有时间和金钱让你以这种方式工作。
我们的目标是以尽可能少的工作量来部署和维护生产应用程序:
- 作为开发人员,我们的目标就是把
git push产品上线,其他什么都不用操心。 - 作为运维工程师,我们的目标是尽可能简化设置,避免任何维护或扩展工作。
示例应用程序
在本篇博文中,我们将使用著名的 Spring Petclinic 的一个分支版本。这是一个广为人知且文档齐全的 Spring Boot 示例应用程序,我们将详细介绍为了方便部署而做出的选择。
这个应用程序没有什么特别之处,所以如果您使用 Spring Boot 应用程序(或者更好的选择是JHipster 应用程序!),您应该能够按照接下来的步骤快速上线。
Azure 应用服务概述
将 Spring Boot 应用程序部署到 Azure 的方法有很多种。当然,您可以使用虚拟机 (VM):但您需要手动配置所有内容,负责操作系统和 JVM 的维护,还要自行处理 HTTPS 和可扩展性问题……因此,虽然乍一看很简单,但实际上非常耗时,而且维护也会是一个大问题。
我们将使用Azure 应用服务,它是一种平台即服务 (PaaS) 解决方案。它支持多种语言以及 Docker 镜像,因此可以有效地托管任何类型的应用程序。而且,它的成本效益也非常高。
作为一项托管服务,Azure Spring Cloud 的维护开销远低于虚拟机,并且已内置可扩展性,因此是托管单体 Spring Boot 应用的理想选择。如果您有更复杂的需求,我们建议使用Azure Spring Cloud,它与 Azure Spring Cloud有许多相似的概念,但主要面向微服务架构。
Jar 还是 Docker?
Azure 应用服务支持 Jar 部署和 Docker 部署,这两种方式都是部署 Spring Boot 应用程序的成熟且流行的方法。
我们建议使用 Jar 部署:操作系统和 JVM 都将由微软管理(并提供支持!),这意味着您需要做的维护工作将大大减少。例如,如果 JVM 中发现安全漏洞,它将自动修复,无需任何人工干预。
Azure 应用服务设置
首先,我们将创建一个 Azure 资源组,并在其中进行工作:
- 转到Azure 门户。
- 在搜索框中查找“资源组”。
- 创建一个名为“.”的新资源组
spring-petclinic。
然后,创建 Azure 应用服务实例:
- 在 Azure 门户搜索框中,查找“应用服务”。
- 在资源组中创建一个新的 Web 应用程序
spring-petclinic,使用 Linux 上的 Java 11,如下图所示:
MySQL 设置
与许多 Spring Boot 应用程序一样,Spring Petclinic 使用 MySQL 数据库:如果您使用的是其他数据库,例如 PostgreSQL,您的设置应该类似。
Azure 应用服务提供了一项名为“应用内 MySQL”的功能,您可以利用它来降低托管成本,因为 MySQL 将在 Azure 应用服务实例内部运行。虽然这可以在开发环境中使用,但它存在一些重要的限制,并且并非生产级数据库,因此我们在这里不会使用它。
- 转到Azure 门户。
- 在搜索框中查找“Azure Database for MySQL”。
- 创建 MySQL 服务器(并注意选择适合您使用情况的定价层级!)。
- 请记下您的数据库名称、用户名和密码,我们稍后会用到。
在 MySQL 数据库中,转到“连接安全”,然后选择“允许访问 Azure 服务”。您还应该单击“添加客户端 IP”按钮,将您当前的 IP 地址自动添加到防火墙规则中,以便您可以从当前计算机访问它。
环境变量
Spring Petclinic 使用属性文件进行配置,这些文件位于指定src/main/resources目录中。其中一个文件名为 `<properties_files>` ,这意味着当触发 Spring Boot 配置application-mysql.properties时,将使用该配置文件。mysql
在上面创建的 Azure 应用服务中,选择Settings > Configuration左侧菜单。
这里我们需要配置两个不同的设置:
mysql使用环境变量键将 Spring Boot 设置为使用该配置文件SPRING_PROFILES_ACTIVE。- 使用环境变量覆盖数据库配置,包括键
SPRING_DATASOURCE_URL、SPRING_DATASOURCE_USERNAME和SPRING_DATASOURCE_PASSWORD。
配置完成后,应该如下图所示:
由于这里涉及到密钥,另一种解决方案是使用Azure Key Vault。对于 Spring Boot,可以使用Azure Key Vault Secrets Spring Boot Starter进行配置。但这会增加项目的复杂性,而且在我们特定的用例中,其安全性并不比环境变量更高(最终两者都会成为 Spring Boot 属性,并且可以从代码中读取),因此,如果只是存储一个密钥,则超出了本文“轻松部署”的讨论范围。
使用 Azure Web 应用 Maven 插件进行部署
现在应用服务已经配置完毕,我们只需要部署应用程序即可。在第一个解决方案中,我们将使用 Azure Web 应用 Maven 插件。大多数开发人员都会选择使用它,因为它很容易集成到他们的 IDE 中。
在您的pom.xml文件中,添加以下 Maven 插件:
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-webapp-maven-plugin</artifactId>
<version>1.8.0</version>
<configuration>
<schemaVersion>V2</schemaVersion>
<resourceGroup>spring-petclinic</resourceGroup>
<appName>jdubois-petclinic</appName>
<region>westeurope</region>
<pricingTier>B1</pricingTier>
<runtime>
<os>linux</os>
<javaVersion>java11</javaVersion>
<webContainer>java11</webContainer>
</runtime>
<deployment>
<resources>
<resource>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
</deployment>
</configuration>
</plugin>
当然,您需要为您的、 和resourceGroup配置appName正确的参数。regionpricingTier
这种解决方案对开发人员来说非常易于使用,但也有一些缺点:
- 它的配置存储在项目的 .htm 文件中
pom.xml,包括根据环境而变化的配置。 - 这需要本地构建和开发者手动操作。
使用 GitHub Actions 实现自动化部署
除了 Azure Webapp Maven 插件之外,还有一种更新的替代方案,那就是使用 GitHub Action。
您需要授权您的 GitHub Action 才能在 Azure 上发布应用程序,以下是具体操作方法:
- 在 Azure 门户中,选择您的应用服务,然后在概览面板中单击“下载”
Get publish profile。您将下载一个.PublishSettings文件。 - 在你的 GitHub 项目中,转到
Settings > Secrets并创建一个名为 的新 secretazureWebAppPublishProfile。将之前文件的内容粘贴.PublishSettings到该 secret 中。
然后,将以下 GitHub Action 添加到您的项目.github/workflows/build-and-deploy.yml中。创建一个名为 `.github.com/ ...
name: Build and deploy to Azure App Service
on:
push:
branches:
- master
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Cache Maven archetypes
uses: actions/cache@v1
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Build with Maven
run: mvn clean package
- uses: azure/webapps-deploy@v1
with:
app-name: spring-petclinic
publish-profile: ${{ secrets.azureWebAppPublishProfile }} # See https://github.com/Azure/actions-workflow-samples/tree/master/AppService
package: '${{ github.workspace }}/target/*.jar'
以下是对该 GitHub Action 的简要描述:
- 一旦代码推送到
master分支,它就会立即发布更新后的 Azure 应用服务应用程序。您可以对其他分支执行类似的 GitHub Action:您可以为每个项目开发人员或每个环境进行设置。 - 它会检查最新代码并安装 Java 11。
- 它使用
actions/cacheGitHub Action 来缓存 Maven 原型:这大大提高了构建速度,因此强烈推荐使用。 - 它使用 Maven 构建和测试应用程序。
- 它使用 GitHub Action 部署最终应用程序
azure/webapps-deploy。虽然也可以使用Azure Webapp Maven plugin我们在上一节中详细介绍的方法进行部署,但此 GitHub Action 可以更好地解耦代码(它pom.xml没有任何特定的 Azure 配置或库),而且执行速度也更快。
最后想说的
我们的两个目标均已实现:
- 开发人员只需
git push部署他们的 Spring Boot 应用程序,甚至无需了解 Azure 应用服务的任何信息。 - 运维工程师只需进行最基本的设置(创建 MySQL 和应用服务实例,并配置 4 个环境变量),现在应用程序即可在生产环境中运行,无需太多维护。操作系统和 JVM 将由微软自动打补丁并提供支持,并且已包含可扩展性。
为了实现这些目标,我们无需修改 Spring Boot 应用程序中的任何代码。使用 GitHub Actions 进行部署,我们只需要在.github仓库中添加一个隐藏文件即可。
如果您想更仔细地查看最终应用程序,我的 Spring Petclinic 分支版本可在此处获取。
文章来源:https://dev.to/azure/the-easy-way-to-deploy-a-spring-boot-application-to-production-on-azure-2joi


