Migrasi aplikasi Tomcat ke Tomcat di Azure App Service
Panduan ini menjelaskan apa yang harus diketahui ketika Anda ingin memigrasikan aplikasi Tomcat yang ada untuk dijalankan di Azure App Service menggunakan Tomcat 9.0.
Pra-migrasi
Untuk memastikan keberhasilan migrasi, sebelum memulai, selesaikan langkah-langkah penilaian dan inventaris yang dijelaskan di bagian berikut.
Jika Anda tidak dapat memenuhi persyaratan pra-migrasi ini, lihat panduan migrasi pendamping berikut:
- Memigrasikan aplikasi Tomcat ke kontainer di Azure Kubernetes Service
- Memigrasikan Aplikasi Tomcat ke Azure Virtual Machines (panduan yang direncanakan)
Beralih ke platform yang didukung
App Service menawarkan versi Tomcat tertentu pada versi Java tertentu. Untuk memastikan kompatibilitas, migrasikan aplikasi Anda ke salah satu versi Tomcat dan Java yang didukung di lingkungannya saat ini sebelum Anda melanjutkan ke salah satu langkah yang tersisa. Pastikan untuk sepenuhnya menguji konfigurasi yang dihasilkan. Gunakan rilis stabil terbaru dari distribusi Linux dalam pengujian tersebut.
Catatan
Validasi ini sangat penting jika server Anda saat ini berjalan pada JDK yang tidak didukung (seperti Oracle JDK atau IBM OpenJ9).
Untuk mendapatkan versi Java Anda saat ini, masuk ke server produksi Anda dan jalankan perintah berikut:
java -version
Di Azure App Service, biner untuk Java 8 disediakan dari Eclipse Temurin. Untuk Java 11, 17, dan semua rilis LTS Java di masa mendatang, App Service menyediakan Microsoft Build of OpenJDK. Biner ini tersedia untuk diunduh secara gratis di situs-situs berikut:
Untuk mendapatkan versi Tomcat Anda saat ini, masuk ke server produksi Anda dan jalankan perintah berikut:
${CATALINA_HOME}/bin/version.sh
Untuk mendapatkan versi saat ini yang digunakan oleh Azure App Service, unduh Tomcat 9, tergantung pada versi mana yang ingin Anda gunakan di Azure App Service.
Sumber daya eksternal inventaris
Sumber daya eksternal, seperti sumber data, broker pesan JMS, dan lainnya disuntikkan melalui Java Naming and Directory Interface (JNDI). Beberapa sumber daya tersebut mungkin memerlukan migrasi atau konfigurasi ulang.
Di dalam aplikasi Anda
Periksa file META-INF/context.xml. Carilah elemen <Resource>
dalam elemen <Context>
.
Pada server aplikasi
Periksa file $CATALINA_BASE/conf/context.xml dan $CATALINA_BASE/conf/server.xml serta file .xml yang ditemukan di direktori $CATALINA_BASE/conf/[engine-name]/[host-name].
Dalam file context.xml, sumber daya JNDI akan dijelaskan oleh elemen <Resource>
di dalam elemen <Context>
tingkat atas.
Dalam file server.xml, sumber daya JNDI akan dijelaskan oleh elemen <Resource>
di dalam elemen <GlobalNamingResources>
.
Datasource
Datasource adalah sumber daya JNDI dengan atribut type
yang diatur ke javax.sql.DataSource
. Untuk setiap datasource, dokumentasikan informasi berikut:
- Apa nama sumber datanya?
- Apa konfigurasi kumpulan koneksinya?
- Di mana saya dapat menemukan file JAR driver JDBC?
Untuk informasi selengkapnya, lihat PANDUAN Datasource JNDI di dokumentasi Tomcat.
Semua sumber daya eksternal lainnya
Tidak memungkinkan untuk mendokumentasikan setiap kemungkinan dependensi eksternal dalam panduan ini. Tim Anda bertanggung jawab untuk memverifikasi bahwa Anda dapat memenuhi setiap dependensi eksternal aplikasi Anda setelah migrasi.
Rahasia inventaris
Kata sandi dan string aman
Periksa semua properti dan file konfigurasi di server produksi untuk adanya string rahasia dan kata sandi. Pastikan untuk memeriksa server.xml dan context.xml di $CATALINA_BASE/conf. Anda juga dapat menemukan file konfigurasi yang berisi kata sandi atau info masuk di dalam aplikasi Anda. Ini mungkin termasuk META-INF / context.xml, dan, untuk aplikasi Spring Boot, application.properties atau file application.yml.
Sertifikat inventaris
Dokumentasikan semua sertifikat yang digunakan untuk titik akhir SSL publik atau komunikasi dengan database backend dan sistem lainnya. Anda bisa melihat semua sertifikat di server produksi dengan menjalankan perintah berikut ini:
keytool -list -v -keystore <path to keystore>
Menentukan apakah dan bagaimana sistem berkas digunakan
Setiap penggunaan sistem file pada server aplikasi akan memerlukan konfigurasi ulang atau, dalam kasus yang jarang terjadi, perubahan arsitektur. Anda dapat mengidentifikasi beberapa atau semua skenario berikut.
Konten statis baca-saja
Jika aplikasi Anda saat ini menyajikan konten statis, Anda memerlukan lokasi alternatif untuk itu. Anda mungkin ingin mempertimbangkan untuk memindahkan konten statik ke Azure Blob Storage dan menambahkan Azure CDN untuk unduhan secepat kilat secara global. Untuk informasi selengkapnya, lihat Hosting situs web statis di Penyimpanan Azure dan Mulai Cepat: Mengintegrasikan akun Microsoft Azure Storage dengan Azure CDN. Anda juga dapat langsung menyebarkan konten statis ke aplikasi dalam paket Azure Spring Apps Enterprise. Untuk informasi selengkapnya, lihat Menyebarkan file statis web.
Konten statis yang diterbitkan secara dinamis
Jika aplikasi Anda memungkinkan konten statis yang diunggah/ diproduksi oleh aplikasi Anda tetapi tidak dapat diubah setelah pembuatannya, Anda dapat menggunakan Azure Blob Storage dan Azure CDN seperti yang dijelaskan di atas, dengan Azure Function untuk menangani unggahan dan refresh CDN. Kami telah menyediakan implementasi sampel untuk penggunaan Anda di Pengunggahan dan pramuat CDN konten statis dengan Azure Functions. Anda juga dapat langsung menyebarkan konten statis ke aplikasi dalam paket Azure Spring Apps Enterprise. Untuk informasi selengkapnya, lihat Menyebarkan file statis web.
Konten dinamis atau internal
Untuk file yang sering ditulis dan dibaca oleh aplikasi Anda (seperti file data sementara), atau file statis yang hanya terlihat oleh aplikasi Anda, Anda dapat memasang Azure Storage ke dalam sistem file App Service. Untuk informasi selengkapnya, lihat Menyajikan konten Azure Storage pada App Service di Linux.
Mengidentifikasi mekanisme persistensi sesi
Untuk mengidentifikasi manajer persistensi sesi yang digunakan, periksa file context.xml dalam konfigurasi aplikasi dan Tomcat Anda. Cari elemen <Manager>
, lalu catat nilai atribut className
.
Implementasi PersistentManager bawaan Tomcat, seperti StandardManager atau FileStore tidak dirancang untuk digunakan dengan platform terdistribusi berskala seperti App Service. Karena App Service dapat menyeimbangkan beban di antara beberapa instans dan memulai ulang instans apa pun secara transparan kapan saja, mempertahankan status yang dapat diubah untuk sistem file tidak direkomendasikan.
Jika persistensi sesi diperlukan, Anda harus menggunakan implementasi PersistentManager
alternatif yang akan menulis ke penyimpanan data eksternal, seperti VMware Tanzu Session Manager dengan Redis Cache. Untuk informasi selengkapnya, lihat Menggunakan Redis sebagai cache sesi dengan Tomcat.
Identifikasi semua proses dan daemon luar yang berjalan di server produksi
Jika Anda memiliki proses yang berjalan di luar server aplikasi, seperti memantau daemon, Anda harus menghilangkannya atau memigrasikannya di tempat lain.
Kasus khusus
Skenario produksi tertentu mungkin memerlukan perubahan tambahan atau memberlakukan batasan tambahan. Meskipun skenario seperti itu jarang terjadi, penting untuk memastikan bahwa skenario tersebut tidak berlaku pada aplikasi Anda atau telah diselesaikan dengan benar.
Tentukan apakah aplikasi bergantung pada pekerjaan terjadwal
Pekerjaan terjadwal, seperti tugas Quartz Scheduler atau pekerjaan cron, tidak dapat digunakan dengan App Service. App Service tidak akan mencegah Anda menyebarkan aplikasi yang berisi tugas terjadwal secara internal. Namun, apabila skala aplikasi Anda diperluas, pekerjaan terjadwal yang sama dapat berjalan lebih dari satu kali per periode yang dijadwalkan. Situasi ini dapat menyebabkan konsekuensi yang tidak diinginkan.
Inventarisasi setiap pekerjaan terjadwal, di dalam atau di luar server aplikasi.
Tentukan apakah aplikasi Anda berisi kode khusus OS
Jika aplikasi Anda berisi kode apa pun dengan dependensi pada OS host, Anda harus melakukan refaktor untuk menghapus dependensi tersebut. Misalnya, Anda mungkin perlu mengganti penggunaan /
atau \
di jalur sistem file dengan File.Separator
atau Paths.get
.
Menentukan apakah pengklusteran Tomcat digunakan
Pengklusteran Tomcat tidak didukung di Azure App Service. Sebagai gantinya, Anda dapat mengonfigurasi dan mengelola penskalaan dan penyeimbangan beban melalui Azure App Service tanpa fungsionalitas khusus Tomcat. Anda dapat mempertahankan keadaan sesi ke lokasi alternatif untuk membuatnya tersedia di seluruh replika. Untuk informasi selengkapnya, lihat Mengidentifikasi mekanisme persistensi sesi.
Untuk menentukan apakah aplikasi Anda menggunakan pengklusteran, cari elemen <Cluster>
di dalam elemen <Host>
atau <Engine>
dalam file server.xml.
Menentukan apakah konektor non-HTTP digunakan
App Service hanya mendukung konektor HTTP tunggal. Jika aplikasi Anda memerlukan konektor tambahan, seperti konektor AJP, jangan gunakan App Service.
Untuk mengidentifikasi konektor HTTP yang digunakan oleh aplikasi Anda, cari elemen <Connector>
di dalam file server.xml dalam konfigurasi Tomcat Anda.
Menentukan apakah MemoryRealm digunakan
MemoryRealm membutuhkan file XML yang dipertahankan. Di Azure AppService, Anda harus mengunggah file ini ke direktori /home atau salah satu subdirektorinya, atau ke penyimpanan yang dipasang. Anda kemudian harus memodifikasi parameter pathName
secara tepat.
Untuk menentukan apakah MemoryRealm
saat ini digunakan, periksa file server.xml dan context.xml dan cari elemen <Realm>
tempat atribut className
diatur menjadi org.apache.catalina.realm.MemoryRealm
.
Menentukan apakah pelacakan sesi SSL digunakan
App Service melakukan pembongkaran sesi di luar runtime Tomcat, sehingga Anda tidak dapat menggunakan pelacakan sesi SSL. Sebagai gantinya, gunakan mode pelacakan sesi yang berbeda (COOKIE
atau URL
). Jika Anda memerlukan pelacakan sesi SSL, jangan gunakan App Service.
Menentukan apakah AccessLogValve digunakan
Jika menggunakan AccessLogValve, Anda harus mengatur parameter directory
ke /home/LogFiles
atau salah satu subdirektorinya.
Migration
Parameterisasi konfigurasi
Dalam langkah-langkah pra-migrasi, Anda mungkin mengidentifikasi beberapa rahasia dan dependensi eksternal, seperti datasource, dalam file server.xml dan context.xml. Untuk setiap item yang Anda identifikasi, ganti nama pengguna, kata sandi, string koneksi, atau URL dengan variabel lingkungan.
Misalnya, file context.xml berisi elemen berikut:
<Resource
name="jdbc/dbconnection"
type="javax.sql.DataSource"
url="jdbc:postgresql://postgresdb.contoso.com/wickedsecret?ssl=true"
driverClassName="org.postgresql.Driver"
username="postgres"
password="t00secure2gue$$"
/>
Dalam hal ini, Anda dapat mengubahnya seperti yang ditunjukkan dalam contoh berikut:
<Resource
name="jdbc/dbconnection"
type="javax.sql.DataSource"
url="${postgresdb.connectionString}"
driverClassName="org.postgresql.Driver"
username="${postgresdb.username}"
password="${postgresdb.password}"
/>
Untuk memastikan bahwa substitusi parameter terjadi untuk file context.xml apa pun dalam folder META-INF di dalam file .war yang disebarkan, pastikan untuk mengatur CATALINA_OPTS
variabel lingkungan seperti yang ditunjukkan dalam contoh berikut:
export CATALINA_OPTS="-Dorg.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.util.digester.EnvironmentPropertySource"
Menyediakan paket App Service
Dari daftar paket layanan yang tersedia di harga App Service, pilih paket yang spesifikasinya memenuhi atau melebihi perangkat keras produksi saat ini.
Catatan
Jika Anda berencana untuk menjalankan penyebaran pementasan/kenari atau menggunakan slot penyebaran, paket App Service harus menyertakan kapasitas tambahan tersebut. Sebaiknya gunakan paket Premium atau yang lebih tinggi untuk aplikasi Java. Untuk informasi selengkapnya, lihat Menyiapkan staging environment dalam Azure App Service.
Kemudian, buat paket App Service. Untuk informasi selengkapnya, lihat Mengelola paket Layanan Aplikasi di Azure.
Membuat dan menyebarkan Aplikasi Web
Anda harus membuat Aplikasi Web di Paket App Service (memilih versi Tomcat sebagai tumpukan runtime) untuk setiap file WAR yang disebarkan ke server Tomcat Anda.
Catatan
Meskipun dimungkinkan untuk menyebarkan beberapa file WAR ke satu aplikasi web, tindakan ini sangat tidak diinginkan. Menyebarkan beberapa file WAR ke satu aplikasi web mencegah setiap aplikasi menskalakan sesuai dengan tuntutan penggunaannya sendiri. Tindakan ini juga menambah kerumitan pada jalur penyebaran berikutnya. Jika beberapa aplikasi harus tersedia di satu URL, pertimbangkan untuk menggunakan solusi perutean seperti Azure Application Gateway.
Aplikasi Maven
Jika aplikasi Anda dibangun dari file POM Maven, gunakan plugin Webapp untuk Maven untuk membuat Aplikasi Web dan menyebarkan aplikasi Anda.
Aplikasi Non-Maven
Jika Anda tidak dapat menggunakan plugin Maven, Anda harus memprovisikan Aplikasi Web melalui mekanisme lain, seperti:
Setelah Aplikasi Web dibuat, gunakan salah satu mekanisme penyebaran yang tersedia untuk menyebarkan aplikasi Anda.
Memigrasikan opsi runtime JVM
Jika aplikasi Anda memerlukan opsi runtime tertentu, gunakan mekanisme yang paling tepat untuk menentukannya.
Mengisi rahasia
Gunakan Pengaturan Aplikasi guna menyimpan rahasia khusus untuk aplikasi Anda. Jika Anda berniat menggunakan rahasia yang sama di antara beberapa aplikasi atau memerlukan kebijakan akses dan kemampuan audit yang mendetail, gunakan Azure Key Vault sebagai gantinya.
Mengonfigurasi domain dan SSL kustom
Jika aplikasi Anda akan terlihat di domain kustom, Anda harus memetakan aplikasi web Anda ke sana. Untuk informasi, lihat Tutorial: Memetakan nama DNS kustom yang sudah ada ke Azure App Service.
Kemudian, Anda harus mengikat sertifikat SSL untuk domain tersebut ke Aplikasi Web App Service Anda. Untuk informasi selengkapnya, lihat Mengamankan nama DNS kustom dengan pengikatan data TLS/SSL di Azure App Service.
Mengimpor sertifikat backend
Semua sertifikat untuk berkomunikasi dengan sistem backend, seperti database, harus tersedia untuk App Service. Untuk informasi selengkapnya, lihat Menambahkan sertifikat TLS/SSL di Azure App Service.
Memigrasikan sumber data, pustaka, dan sumber daya JNDI
Untuk langkah-langkah konfigurasi sumber data, lihat bagian Sumber data dari Mengonfigurasi aplikasi Java Linux untuk Azure App Service.
Untuk petunjuk sumber data tambahan, lihat bagian berikut JNDI Datasource How-To dalam dokumentasi Tomcat:
Migrasikan dependensi classpath tingkat server tambahan dengan mengikuti langkah yang sama untuk file JAR sumber data.
Migrasikan Sumber daya JDNI tingkat server bersama tambahan.
Catatan
Jika Anda mengikuti arsitektur satu WAR per aplikasi web yang direkomendasikan, pertimbangkan untuk memigrasikan pustaka classpath tingkat server dan sumber daya JNDI ke dalam aplikasi Anda. Hal ini akan secara signifikan menyederhanakan pemerintahan komponen dan manajemen perubahan.
Memigrasikan konfigurasi yang tersisa
Saat menyelesaikan bagian sebelumnya, Anda akan memiliki konfigurasi server yang dapat dikustomisasi di /home/tomcat/conf.
Selesaikan migrasi dengan menyalin konfigurasi tambahan apa pun (seperti realm dan JASPIC)
Memigrasikan pekerjaan terjadwal
Untuk menjalankan pekerjaan terjadwal di Azure, pertimbangkan untuk menggunakan Pemicu Timer untuk Azure Functions. Anda tidak perlu memigrasikan kode pekerjaan itu sendiri ke dalam suatu fungsi. Fungsi ini cukup memanggil URL di aplikasi Anda untuk memicu pekerjaan. Jika eksekusi pekerjaan tersebut harus dipanggil secara dinamis dan/atau dilacak secara terpusat, pertimbangkan untuk menggunakan Spring Batch.
Atau, Anda dapat membuat aplikasi Logika dengan pemicu Pengulangan untuk memanggil URL tanpa menulis kode apa pun di luar aplikasi Anda. Untuk informasi selengkapnya, lihat Gambaran Umum - Apa itu Azure Logic Apps? dan Buat, jadwalkan, dan jalankan tugas dan alur kerja berulang dengan pemicu Pengulangan di Azure Logic Apps.
Catatan
Untuk mencegah penggunaan berbahaya, Anda mungkin perlu memastikan bahwa titik akhir pemanggilan pekerjaan memerlukan info masuk. Dalam hal ini, fungsi pemicu perlu memberikan info masuk.
Mulai ulang dan pengujian awal
Terakhir, Anda harus memulai ulang Aplikasi Web untuk menerapkan semua perubahan konfigurasi. Setelah selesai memulai ulang, verifikasi bahwa aplikasi Anda berjalan dengan benar.
Pasca-migrasi
Sekarang setelah memigrasikan aplikasi Anda ke Azure App Service, Anda harus memverifikasi bahwa aplikasi tersebut berfungsi sesuai harapan. Setelah melakukannya, kami memiliki beberapa rekomendasi untuk Anda yang dapat membuat aplikasi Anda lebih bersifat Cloud native.
Rekomendasi
Jika Anda memilih untuk menggunakan direktori /home untuk penyimpanan file, pertimbangkan untuk menggantinya dengan Azure Storage.
Jika Anda memiliki konfigurasi di direktori /home yang berisi string koneksi, kunci SSL, dan informasi rahasia lainnya, pertimbangkan untuk menggunakan kombinasi Azure Key Vault dan/atau injeksi parameter dengan pengaturan aplikasi jika memungkinkan.
Pertimbangkan untuk menggunakan Deployment Slots untuk penyebaran yang andal tanpa waktu henti.
Merancang dan menerapkan strategi DevOps. Untuk menjaga keandalan sekaligus meningkatkan kecepatan pengembangan Anda, pertimbangkan untuk mengotomatiskan penyebaran dan pengujian dengan Azure Pipelines. Saat Anda menggunakan Slot Penyebaran, Anda dapat mengotomatiskan penyebaran ke slot diikuti dengan pertukaran slot.
Merancang dan menerapkan strategi kelangsungan bisnis dan pemulihan bencana. Untuk aplikasi yang penting untuk misi, pertimbangkan arsitektur penyebaran multi-wilayah.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk