将 Spring 应用部署到使用 MySQL 的应用服务

注意

对于 Spring 应用程序,我们建议使用 Azure Spring Apps。 但是,你仍然可以使用 Azure 应用服务作为目标。 有关详细信息,请参阅 为 Java 应用程序选择正确的 Azure 服务。

本教程将详细介绍在 Linux 上的应用服务中生成、配置、部署和缩放 Java Web 应用并对其进行故障排除的过程。

本教程以常用的 Spring PetClinic 示例应用程序为基础。 在本主题中,你将在本地测试应用的 HSQLDB 版本,然后将其部署到Azure App 服务。 之后,你将配置并部署使用 Azure Database for MySQL 的版本。 最后,你将了解如何通过增加运行应用的辅助角色数来访问应用日志和横向扩展。

先决条件

获取示例

若要开始使用示例应用,请使用以下命令克隆和准备源存储库。

git clone https://github.com/spring-petclinic/spring-framework-petclinic.git
cd spring-framework-petclinic

在本地生成和运行 HSQLDB 示例

首先,我们将使用 HSQLDB 作为数据库在本地测试示例。

生成 HSQLDB 版示例应用。

mvn package

接下来,将 TOMCAT_HOME 环境变量设置为 Tomcat 安装位置。

export TOMCAT_HOME=<Tomcat install directory>

然后,更新 pom.xml 文件以部署 WAR 文件。 将以下 XML 添加为现有 <plugins> 元素的子级。 如有必要,请将 1.9.11 更改为 Cargo Maven 3 Plugin 的当前版本。

<plugin>
    <groupId>org.codehaus.cargo</groupId>
    <artifactId>cargo-maven3-plugin</artifactId>
    <version>1.9.11</version>
    <configuration>
        <container>
            <containerId>tomcat9x</containerId>
            <type>installed</type>
            <home>${TOMCAT_HOME}</home>
        </container>
        <configuration>
            <type>existing</type>
            <home>${TOMCAT_HOME}</home>
        </configuration>
        <deployables>
            <deployable>
                <groupId>${project.groupId}</groupId>
                <artifactId>${project.artifactId}</artifactId>
                <type>war</type>
                <properties>
                    <context>/</context>
                </properties>
            </deployable>
        </deployables>
    </configuration>
</plugin>

此配置就绪后,可以将应用在本地部署到 Tomcat。

mvn cargo:deploy

然后启动 Tomcat。

${TOMCAT_HOME}/bin/catalina.sh run

现在可以在浏览器中导航到 http://localhost:8080 来查看正在运行的应用,并感受它如何工作。 完成后,在 Bash 提示符下选择 Ctrl+C 以停止 Tomcat。

部署到 Azure 应用服务

现在,你已看到它在本地运行,我们会将该应用部署到 Azure。

首先,设置以下环境变量。 对于 REGION,请使用 West US 2 或可在此处找到的其他区域。

export RESOURCEGROUP_NAME=<resource group>
export WEBAPP_NAME=<web app>
export WEBAPP_PLAN_NAME=${WEBAPP_NAME}-appservice-plan
export REGION=<region>

Maven 将使用这些值来创建具有你提供的名称的 Azure 资源。 通过使用环境变量,可以将帐户机密保存在项目文件之外。

接下来,更新 pom.xml 文件,以便为 Azure 部署配置 Maven。 将以下 XML 添加到之前添加的 <plugin> 元素之后。 如有必要,请将 2.5.0 更改为适用于 Azure 应用服务的 Maven 插件的当前版本。

<plugin>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-webapp-maven-plugin</artifactId>
  <version>2.5.0</version>
  <configuration>
    <schemaVersion>v2</schemaVersion>
    <subscriptionId>${SUBSCRIPTION_ID}</subscriptionId>
    <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
    <appName>${WEBAPP_NAME}</appName>
    <region>${REGION}</region>
    <pricingTier>P1v2</pricingTier>
    <runtime>
      <os>Linux</os>
      <javaVersion>Java 8</javaVersion>
      <webContainer>TOMCAT 9.0</webContainer>
    </runtime>
    <deployment>
      <resources>
        <resource>
          <directory>${project.basedir}/target</directory>
          <includes>
            <include>*.war</include>
          </includes>
        </resource>
      </resources>
    </deployment>
  </configuration>
</plugin>

接下来,登录到 Azure。

az login

然后,将该应用部署到 Linux 上的应用服务。

mvn azure-webapp:deploy

现在可以导航到 https://<app-name>.azurewebsites.net(在替换 <app-name> 后)以查看正在运行的应用。

设置 Azure Database for MySQL

接下来,我们将切换到使用 MySQL 而不是 HSQLDB。 我们将在 Azure 上创建一个 MySQL 服务器实例并添加一个数据库,然后使用新的数据库连接信息更新应用配置。

首先,设置以下环境变量以便在后面的步骤中使用。

export MYSQL_SERVER_NAME=<server>
export MYSQL_SERVER_FULL_NAME=${MYSQL_SERVER_NAME}.mysql.database.azure.com
export MYSQL_SERVER_ADMIN_LOGIN_NAME=<admin>
export MYSQL_SERVER_ADMIN_PASSWORD=<password>
export MYSQL_DATABASE_NAME=<database>
export DOLLAR=\$

接下来,创建并初始化数据库服务器。 使用 az mysql up 进行初始配置。 然后,使用 az mysql server configuration set 提高连接超时值并设置服务器时区。

az extension add --name db-up

az mysql up \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server-name ${MYSQL_SERVER_NAME} \
    --database-name ${MYSQL_DATABASE_NAME} \
    --admin-user ${MYSQL_SERVER_ADMIN_LOGIN_NAME} \
    --admin-password ${MYSQL_SERVER_ADMIN_PASSWORD}

az mysql server configuration set --name wait_timeout \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server ${MYSQL_SERVER_NAME} --value 2147483

az mysql server configuration set --name time_zone \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server ${MYSQL_SERVER_NAME} --value=-8:00

然后,使用 MySQL CLI 连接到 Azure 上的数据库。

mysql -u ${MYSQL_SERVER_ADMIN_LOGIN_NAME}@${MYSQL_SERVER_NAME} \
 -h ${MYSQL_SERVER_FULL_NAME} -P 3306 -p

在 MySQL CLI 提示符下运行以下命令,验证数据库是否已使用先前为环境变量 MYSQL_DATABASE_NAME 指定的值命名。

show databases;

MySQL 现已可供使用。

为 MySQL 配置应用

接下来,我们会将连接信息添加到应用的 MySQL 版本,然后将其部署到应用服务。

更新 pom.xml 文件,使 MySQL 成为有效配置。 从 H2 配置文件中删除 <activation> 元素,改为将其放入 MySQL 配置文件中,如下所示。 代码片段的其余部分显示现有配置。 请注意,Maven 将使用你以前设置环境变量的方式来配置你的 MySQL 访问权限。

<profile>
    <id>MySQL</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <db.script>mysql</db.script>
        <jpa.database>MYSQL</jpa.database>
        <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
        <jdbc.url>jdbc:mysql://${DOLLAR}{MYSQL_SERVER_FULL_NAME}:3306/${DOLLAR}{MYSQL_DATABASE_NAME}?useUnicode=true</jdbc.url>
        <jdbc.username>${DOLLAR}{MYSQL_SERVER_ADMIN_LOGIN_NAME}@${DOLLAR}{MYSQL_SERVER_FULL_NAME}</jdbc.username>
        <jdbc.password>${DOLLAR}{MYSQL_SERVER_ADMIN_PASSWORD}</jdbc.password>
    </properties>
    ...
</profile>

接下来,更新 pom.xml 文件,以便为 Azure 部署和 MySQL 的使用配置 Maven。 将以下 XML 添加到之前添加的 <plugin> 元素之后。 如有必要,请将 2.5.0 更改为适用于 Azure 应用服务的 Maven 插件的当前版本。

<plugin>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-webapp-maven-plugin</artifactId>
  <version>2.5.0</version>
  <configuration>
    <schemaVersion>v2</schemaVersion>
    <subscriptionId>${SUBSCRIPTION_ID}</subscriptionId>
    <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
    <appName>${WEBAPP_NAME}</appName>
    <region>${REGION}</region>
    <pricingTier>P1v2</pricingTier>
    <runtime>
      <os>Linux</os>
      <javaVersion>Java 8</javaVersion>
      <webContainer>TOMCAT 9.0</webContainer>
    </runtime>
    <appSettings>
      <property>
        <name>MYSQL_SERVER_FULL_NAME</name>
        <value>${MYSQL_SERVER_FULL_NAME}</value>
      </property>
      <property>
        <name>MYSQL_SERVER_ADMIN_LOGIN_NAME</name>
        <value>${MYSQL_SERVER_ADMIN_LOGIN_NAME}</value>
      </property>
      <property>
        <name>MYSQL_SERVER_ADMIN_PASSWORD</name>
        <value>${MYSQL_SERVER_ADMIN_PASSWORD}</value>
      </property>
      <property>
        <name>MYSQL_DATABASE_NAME</name>
        <value>${MYSQL_DATABASE_NAME}</value>
      </property>
    </appSettings>
    <deployment>
      <resources>
        <resource>
          <directory>${project.basedir}/target</directory>
          <includes>
            <include>*.war</include>
          </includes>
        </resource>
      </resources>
    </deployment>
  </configuration>
</plugin>

接下来,生成应用,然后通过使用 Tomcat 部署并运行该应用,对其进行本地测试。

mvn package
mvn cargo:deploy
${TOMCAT_HOME}/bin/catalina.sh run

现在可以在本地访问 http://localhost:8080 来查看该应用。 应用的外观和行为与以前相同,但应用使用的是 Azure Database for MySQL 而不是 HSQLDB。 完成后,在 Bash 提示符下选择 Ctrl+C 以停止 Tomcat。

最后,将该应用部署到应用服务。

mvn azure-webapp:deploy

现在可以导航到 https://<app-name>.azurewebsites.net,查看正在使用应用服务和 Azure Database for MySQL 运行的应用。

访问应用日志

如果需要进行故障排除,可以查看应用日志。 若要在本地计算机上打开远程日志流,请使用以下命令。

az webapp log tail --name ${WEBAPP_NAME} \
    --resource-group ${RESOURCEGROUP_NAME}

查看完日志后,选择 Ctrl+C 以停止流。

https://<app-name>.scm.azurewebsites.net/api/logstream 上也提供日志流。

横向扩展

若要支持增加的应用流量,可以使用以下命令横向扩展到多个实例。

az appservice plan update --number-of-workers 2 \
    --name ${WEBAPP_PLAN_NAME} \
    --resource-group ${RESOURCEGROUP_NAME}

祝贺你! 你已使用 Spring Framework、JSP、Spring Data、Hibernate、JDBC、Linux 上的应用服务和 Azure Database for MySQL 构建并横向扩展了 Java Web 应用。

清理资源

在前面的部分中,你在资源组中创建了 Azure 资源。 如果认为将来不使用这些资源,请运行以下命令删除资源组。

az group delete --name ${RESOURCEGROUP_NAME}

后续步骤

接下来,查看适用于 Java 和应用服务的其他配置和 CI/CD 选项。