使用 MySQL 將 Spring 應用程式部署至 App Service

注意

針對 Spring 應用程式,我們建議使用 Azure Spring 應用程式。 不過,您仍然可以使用 Azure App Service 作為目的地。 如需詳細資訊,請參閱 為您的 Java 應用程式選擇正確的 Azure 服務。

本教學課程將逐步引導您完成在App Service Linux 中建置、設定、部署、疑難解答和調整Java Web 應用程式的程式。

本教學課程以熱門的 Spring PetClinic 範例應用程式為基礎。 在本主題中,您會在本機測試應用程式的 HSQLDB 版本,然後將它部署到 Azure App 服務。 之後,您將設定及部署使用 適用於 MySQL 的 Azure 資料庫 的版本。 最後,您將瞭解如何藉由增加執行應用程式的背景工作角色數目來存取應用程式記錄並相應放大。

必要條件

取得範例

若要開始使用範例應用程式,請使用下列命令複製並準備來源存放庫。

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>
    <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 App Service

既然您已在本機執行,我們將將應用程式部署至 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。 在您先前新增的 <plugin> 元素之後新增下列 XML。 如有必要,請變更2.5.0為適用於 Azure App 服務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

然後將應用程式部署至 App Service Linux。

mvn azure-webapp:deploy

您現在可以瀏覽至 https://<app-name>.azurewebsites.net [取代 <app-name>] 以檢視執行中的應用程式。

設定 適用於 MySQL 的 Azure 資料庫

接下來,我們將切換至使用 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 版本,然後將它部署到 App Service。

更新pom.xml檔案,讓 MySQL 成為使用中的組態。 <activation>請從 H2 設定檔中移除 元素,並將它改為放在 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。 在您先前新增的 <plugin> 元素之後新增下列 XML。 如有必要,請變更2.5.0為適用於 Azure App 服務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本機檢視應用程式。 應用程式的外觀和行為會與之前相同,但使用 適用於 MySQL 的 Azure 資料庫 而不是 HSQLDB。 完成時,請在 Bash 提示字元中選取 Ctrl+C 以停止 Tomcat。

最後,將應用程式部署至 App Service。

mvn azure-webapp:deploy

您現在可以流覽至 https://<app-name>.azurewebsites.net 以查看使用 App Service 執行中的應用程式,並 適用於 MySQL 的 Azure 資料庫。

存取應用程式記錄

如果您需要進行疑難解答,您可以查看應用程式記錄。 若要在本機計算機上開啟遠端記錄數據流,請使用下列命令。

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、App Service Linux 和 適用於 MySQL 的 Azure 資料庫 來建置和相應放大 Java Web 應用程式。

清除資源

在上述各節中,您已在資源群組中建立 Azure 資源。 如果您未來不想要使用這些資源,請執行下列命令來刪除資源群組。

az group delete --name ${RESOURCEGROUP_NAME}

下一步

接下來,請查看適用於 Java 與 App Service 的其他組態和 CI/CD 選項。