Menyebarkan aplikasi Spring ke App Service dengan MySQL

Catatan

Untuk aplikasi Spring, sebaiknya gunakan Azure Spring Apps. Namun, Anda masih dapat menggunakan Azure App Service sebagai tujuan. Untuk informasi selengkapnya, lihat Memilih layanan Azure yang tepat untuk aplikasi Java Anda.

Tutorial ini memandu Anda melalui proses membangun, mengonfigurasi, menyebarkan, memecahkan masalah, dan menskalakan aplikasi web Java di App Service Linux.

Tutorial ini dibangun di aplikasi sampel Spring PetClinic yang populer. Dalam topik ini, Anda akan menguji versi HSQLDB aplikasi secara lokal, lalu menyebarkannya ke Azure App Service. Setelah itu, Anda akan mengonfigurasi dan menyebarkan versi yang menggunakan Azure Database for MySQL. Terakhir, Anda akan mempelajari cara mengakses log aplikasi dan memperluas skala dengan meningkatkan jumlah pekerja yang menjalankan aplikasi Anda.

Prasyarat

Mendapatkan sampel

Untuk memulai aplikasi sampel, kloning dan siapkan repo sumber menggunakan perintah berikut.

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

Membuat dan menjalankan sampel HSQLDB secara lokal

Pertama, kami akan menguji sampel secara lokal menggunakan HSQLDB sebagai database.

Buat versi HSQLDB dari aplikasi sampel.

mvn package

Selanjutnya, atur variabel lingkungan TOMCAT_HOME ke lokasi penginstalan Tomcat Anda.

export TOMCAT_HOME=<Tomcat install directory>

Kemudian, perbarui file pom.xml untuk menyebarkan file WAR. Tambahkan XML berikut sebagai turunan dari elemen <plugins> yang ada. Jika perlu, ubah 1.9.11 ke versi Cargo Maven 3 Plugin saat ini.

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

Dengan konfigurasi ini, Anda dapat menyebarkan aplikasi secara lokal ke Tomcat.

mvn cargo:deploy

Kemudian, luncurkan Tomcat.

${TOMCAT_HOME}/bin/catalina.sh run

Sekarang Anda dapat menavigasi browser Anda ke http://localhost:8080 untuk melihat aplikasi yang sedang berjalan dan rasakan cara kerjanya. Setelah selesai, pilih Ctrl+C di perintah Bash untuk menghentikan Tomcat.

Menyebarkan ke Azure App Service

Setelah dijalankan secara lokal, kami akan menyebarkan aplikasi ke Azure.

Pertama, atur variabel lingkungan berikut. Untuk REGION, gunakan West US 2 atau wilayah lain yang dapat Anda temukan di sini.

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

Maven akan menggunakan nilai-nilai ini untuk membuat sumber daya Azure dengan nama yang Anda berikan. Dengan menggunakan variabel lingkungan, Anda dapat menyimpan rahasia akun Anda dari file proyek.

Selanjutnya, perbarui file pom.xml untuk mengonfigurasi Maven untuk penyebaran Azure. Tambahkan XML berikut setelah elemen <plugin> yang Anda tambahkan sebelumnya. Jika perlu, ubah 2.5.0 ke versi Maven Plugin untuk Azure App Service saat ini.

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

Kemudian, masuk ke Azure.

az login

Kemudian, sebarkan aplikasi ke App Service Linux.

mvn azure-webapp:deploy

Anda sekarang dapat menavigasikan ke https://<app-name>.azurewebsites.net (setelah mengganti <app-name>) untuk melihat aplikasi yang sedang berjalan.

Menyiapkan Azure Database for MySQL

Selanjutnya, kita akan beralih menggunakan MySQL, bukan HSQLDB. Kita akan membuat instans server MySQL di Azure dan menambahkan database, lalu memperbarui konfigurasi aplikasi dengan info koneksi database baru.

Pertama, atur variabel lingkungan berikut untuk digunakan di langkah selanjutnya.

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=\$

Selanjutnya, buat dan inisialisasi server database. Gunakan az mysql up untuk konfigurasi awal. Kemudian gunakan set konfigurasi server mysql az untuk meningkatkan batas waktu koneksi dan mengatur zona waktu server.

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

Kemudian, gunakan MySQL CLI untuk terhubung ke database Anda di Azure.

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

Pada petunjuk MySQL CLI, jalankan perintah berikut untuk memverifikasi database bernama dengan nilai yang sama yang Anda tentukan sebelumnya untuk variabel lingkungan MYSQL_DATABASE_NAME.

show databases;

MySQL siap digunakan.

Mengonfigurasi aplikasi untuk MySQL

Selanjutnya, kami akan menambahkan info koneksi ke versi aplikasi MySQL, lalu sebarkan ke App Service.

Perbarui file pom.xml untuk menjadikan MySQL sebagai konfigurasi aktif. Hapus elemen <activation> dari profil H2 dan masukkan ke dalam profil MySQL sebagai gantinya, seperti yang ditunjukkan di sini. Sisa cuplikan menunjukkan konfigurasi yang ada. Perhatikan bagaimana variabel lingkungan yang Anda tetapkan sebelumnya digunakan oleh Maven untuk mengonfigurasi akses MySQL Anda.

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

Selanjutnya, perbarui file pom.xml untuk mengonfigurasi Maven untuk penerapan Azure dan penggunaan MySQL. Tambahkan XML berikut setelah elemen <plugin> yang Anda tambahkan sebelumnya. Jika perlu, ubah 2.5.0 ke versi Maven Plugin untuk Azure App Service saat ini.

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

Selanjutnya, buat aplikasi, lalu uji secara lokal dengan menyebarkan dan menjalankannya dengan Tomcat.

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

Anda sekarang dapat melihat aplikasi secara lokal di http://localhost:8080. Aplikasi ini akan terlihat dan berperilaku sama seperti sebelumnya, tetapi menggunakan Azure Database for MySQL, bukan HSQLDB. Setelah selesai, pilih Ctrl+C di perintah Bash untuk menghentikan Tomcat.

Terakhir, sebarkan aplikasi ke App Service.

mvn azure-webapp:deploy

Anda sekarang dapat menavigasi ke https://<app-name>.azurewebsites.net untuk melihat aplikasi yang sedang berjalan menggunakan App Service dan Azure Database for MySQL.

Mengakses log aplikasi

Jika perlu memecahkan masalah, Anda dapat melihat log aplikasi. Untuk membuka aliran log jarak jauh di komputer lokal Anda, gunakan perintah berikut.

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

Setelah selesai menampilkan log, pilih Ctrl+C untuk menghentikan aliran.

Aliran log juga tersedia di https://<app-name>.scm.azurewebsites.net/api/logstream.

Peluasan skala

Untuk mendukung peningkatan lalu lintas ke aplikasi, Anda dapat menskalakan ke beberapa instans menggunakan perintah berikut.

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

Selamat! Anda membangun dan meluaskan skala aplikasi Web Java menggunakan Spring Framework, JSP, Spring Data, Hibernate, JDBC, App Service Linux, dan Azure Database for MySQL.

Membersihkan sumber daya

Dalam bagian sebelumnya, Anda sudah membuat sumber daya Azure dalam grup sumber daya. Jika Anda tidak menggunakan sumber daya ini di masa mendatang, hapus grup sumber daya dengan menjalankan perintah berikut.

az group delete --name ${RESOURCEGROUP_NAME}

Langkah berikutnya

Selanjutnya, lihat konfigurasi lain dan opsi CI/CD yang tersedia untuk Java dengan App Service.