Halo, Habr!
Di tahun baru yang akan datang, kami berencana untuk secara serius mengembangkan tema kontainer,
Cloud-Native Java dan
Kubernetes . Kelanjutan logis dari topik-topik ini dalam bahasa Rusia adalah cerita tentang kerangka kerja
Quarkus , yang sudah dipertimbangkan dalam artikel bagus tentang Habré. Artikel hari ini tidak terlalu berfokus pada “perangkat
Java ultra cepat subatomik ” seperti perspektif yang dibawa Quarkus ke Enterprise.
Java dan JVM masih sangat populer, tetapi ketika bekerja dengan teknologi tanpa server dan layanan berbasis cloud, Java dan bahasa lain untuk JVM semakin jarang digunakan, karena mereka mengambil terlalu banyak ruang memori dan memuat terlalu lambat, yang membuat mereka tidak cocok untuk gunakan dengan wadah yang berumur pendek. Untungnya, situasi ini saat ini mulai berubah berkat Quarkus.
Pendahuluan
Semakin banyak saya melakukan DevOps, wadah, dan teknologi tanpa server, semakin saya menemukan bahwa saya menulis
kode kemas dalam wadah ringan atau
FaaS dalam Python atau JavaScript. Java terlalu berat untuk di-boot untuk digunakan dalam framework tanpa server. Mengenai layanan microser, JavaScript atau Python menyediakan pemuatan yang lebih cepat dan wadah yang lebih ringkas, menjadikan Java lebih efisien.
Python dan JavaScript adalah Bahasa Terbaik untuk Membuat Layanan Cloud Berbasis CloudJawa berusia
lebih dari 20 tahun , dan pada saat permulaannya, dunia benar-benar berbeda dari sekarang. Dengan munculnya JVM, masalah besar diselesaikan - kami dapat menulis kode sekali dan menjalankannya di banyak platform dan sistem operasi. Wadah memungkinkan Anda untuk mengemas aplikasi, perpustakaan, dan sumber daya sistem operasi ke dalam wadah terpisah, dan masing-masing wadah tersebut dapat bekerja di mana saja.
Portabilitas yang disediakan JVM sekarang kurang relevan . Pada suatu waktu, kami siap mengeluarkan biaya tambahan untuk memastikan portabilitas, tetapi sekarang kali ini telah berlalu.
Sekarang Anda perlu kerja cepat dengan penundaan minimal dan aplikasi reaktif yang akan selalu tersedia . Kontainer dan alat orkestrasi wadah seperti
Kubernetes menyediakan kemampuan ini terlepas dari bahasa pemrograman.
Perusahaan yang beralih menggunakan arsitektur layanan mikro menggunakan layanan berbasis
Musim Semi mereka yang ditulis dalam Java, menghubungkannya dengan arsip toples berat, menambahkan
JDK dan menjalankannya dalam wadah berbasis Linux. Solusi ini berfungsi, tetapi Anda harus berurusan dengan kontainer berat berukuran 500MB, yang dibawa ke status aksesibilitas masing-masing 10-30 detik; ini masalah serius. Setelah migrasi, banyak perusahaan perlahan-lahan beralih menggunakan Python, meninggalkan layanan sisi server di Jawa, dan, pada akhirnya, berhenti di FaaS.
Teknologi tanpa server dan FaaS sangat populer saat ini karena memungkinkan Anda untuk berkonsentrasi pada fungsi penulisan tanpa mengkhawatirkan infrastruktur. Bagaimanapun, mereka semua bekerja dalam wadah, tetapi penyedia cloud mengelola siklus hidup mereka. Bagian terbaiknya adalah, setelah waktu tertentu, penyedia benar-benar menghentikan wadah dan melanjutkan pekerjaannya hanya setelah panggilan berikutnya, yaitu, Anda hanya membayar untuk waktu kerja yang sebenarnya. Panggilan fungsi pertama dapat bertahan sedikit lebih lama dari biasanya, ini adalah awal yang terkenal. Faktanya adalah bahwa wadah membutuhkan muatan primer. Menggunakan Python atau JavaScript bukanlah masalah besar, tetapi dalam kasus Jawa, pemuatan awal dapat memakan waktu 10-15 detik, dan ini adalah kalimat dan salah satu alasan untuk penurunan popularitas Java. Sekarang kita membutuhkan
kode yang dapat memulai, menyelesaikan tugas, dan kemudian berhenti . Kami tidak ingin berurusan dengan banyak utas atau proses yang berjalan lama, kami membutuhkan
proses berumur pendek yang dapat dimuat dengan sangat cepat .
Memperkenalkan Quarkus
Jika Anda membaca blog teknis atau mengikuti berita, Anda mungkin berpikir bahwa
paradigma tanpa server mengambil alih dunia, dan semua orang menerimanya dengan antusiasme yang luar biasa. Sekarang, startup dapat menulis fungsi dan menyediakannya di cloud sebagai layanan - berkat penggunaan JavaScript - dan juga skala mereka untuk mendukung jutaan pengguna, tanpa harus mengelola infrastruktur. Benar, ada juga dunia nyata di luar Lembah Silikon: lembaga keuangan, pemerintah, ritel, dan banyak industri lainnya dilayani dengan jutaan jalur Jawa, yang terlalu mahal untuk ditulis ulang. Karena itu, kita harus menerima begitu saja kenyataan bahwa dalam industri-industri ini masih terus menggunakan kontainer berat.
GraalVM dan, khususnya, Substrate VM, hari ini membuka pintu menuju masa depan bahasa Jawa yang mulia dan jangka panjang. GraalVM adalah
mesin virtual universal untuk menjalankan aplikasi yang ditulis dalam JavaScript, Python, Ruby, R dan bahasa untuk JVM, khususnya Java, Scala atau Kotlin. Yang
paling keren adalah bahwa
GraalVM memungkinkan Anda untuk melakukan pra-kompilasi (dalam mode AOT) ke dalam file asli yang dapat dieksekusi . Ini berarti Anda dapat mengkompilasi kode Java Anda secara langsung ke dalam kode khusus mesin. Program yang dihasilkan tidak bekerja pada Java HotSpot VM, tetapi menggunakan semua komponen yang diperlukan, khususnya, manajemen memori, penjadwalan utas dari implementasi mesin virtual lain yang disebut Substrate VM. Substrat VM ditulis dalam Java, dan kodenya dikompilasi menjadi executable asli. Program yang dihasilkan dimulai lebih cepat dan, karenanya, memberikan overhead yang lebih rendah dalam penggunaan memori dibandingkan dengan Java VM. Ini bagus, tetapi Anda mungkin berpikir: kompilasi awal? Ini bertentangan dengan ide dasar untuk mana JVM dibuat, yaitu, penggunaan kode yang pernah ditulis di mana-mana! Ini gila !!! Namun, pikirkan sendiri: sekarang kami memiliki wadah, dan mereka tidak membutuhkan JVM.
Aplikasi kontainer konvensional yang
dibuat menggunakan Spring boot memiliki tingkat abstraksi ekstra, yang sama sekali tidak diperlukan di dunia tempat Kubernetes berada . Anda memiliki aplikasi Java yang berjalan di JVM di dalam wadah, wadah ini tetap tidak berubah, karena hari ini produk jadi adalah wadah, bukan aplikasi. Sekarang kami sedang mengemas kontainer, bukan file PERANG. Oleh karena itu,
semua biaya yang terkait dengan penggunaan aplikasi JVM di dalam wadah menjadi tidak berguna , dan AOT menjadi keputusan yang sangat logis jika Anda akan mengemas aplikasi Anda ke dalam wadah.
Benar, kompilasi AOT secara serius membatasi kemampuan dinamis Java (memuat kelas saat runtime, refleksi, proxy, dll.). Dalam praktiknya, ini berarti bahwa 90% ekosistem Jawa tidak akan berfungsi tanpa perubahan. Karenanya,
ekosistem Jawa harus beradaptasi . Ada kabar baik: sebagian besar ini bisa dilakukan selama kebaktian!
Ini adalah kekuatan Quarkus. Ini menggunakan GraalVM dan menyediakan ekosistem yang mendukung kompilasi AOT saat membangun; dengan demikian, menggunakan Java, Anda bisa membuat binari asli. Berkat Quarkus, GraalVM
tersedia untuk pengembang Java .
Memulai dengan Quarkus
Seperti dijelaskan di atas, Quarkus menyediakan kompilasi awal untuk aplikasi Java, dan ini menghasilkan ekosistem Java subatomik supersonik; Quarkus ditandai dengan pemuatan sangat cepat - dan Java kembali ke permainan di bidang pengembangan berbasis cloud. Selama bertahun-tahun, tidak ada teknologi baru yang menginspirasi saya - dan
saya tidak sendirian dalam hal ini .
Baca
panduan pemula - dan buktikan sendiri. Masih ada banyak perusahaan yang menggunakan Java + JPA di dalam wadah, tetapi dalam konfigurasi ini, memuat bisa memakan waktu 15 detik, dan
dalam kasus Quarkus, 0,005!
Statistik QuarkusAnda menggunakan IDE yang sama dan alat yang sama dengan yang Anda gunakan di dunia Spring Boot. Untuk membangun proyek Anda, gunakan Maven atau Gradle. Proyek ini dapat dijalankan langsung di IDE dan di atasnya, reboot langsung yang panas tersedia untuk Anda dengan perubahan apa pun, dan Anda tidak perlu memulai ulang aplikasi. Quarkus bukan Spring, jadi jika Anda menggunakan Spring Boot, Anda harus melakukan migrasi kode khusus Spring. Untungnya, Quarkus memberikan
tingkat kompatibilitas untuk mengimplementasikan dependensi Spring , yang sangat menyederhanakan pekerjaan. Kerangka Quarkus sesuai standar, yang berarti kemudahan porting dan dukungan untuk kodenya.
Proses Pengembangan Quarkus
Quarkus dapat digunakan dalam mode pengembangan, yang mengingatkan pada Spring Boot. Dengan itu Anda juga dapat mengemas proyek Anda dalam toples tebal. Ini sangat nyaman untuk menguji dan men-debug kode Anda, karena reboot langsung didukung; tetapi Anda perlu mengkompilasi terlebih dahulu untuk masuk ke produksi. Seluruh proses ditunjukkan dalam diagram berikut:

- Pertama, buat aplikasi dalam IDE favorit Anda, dan kemudian Anda dapat menjalankannya dalam mode pengembang dengan: "
mvnw compile quarkus:dev
", seperti yang Anda lakukan dengan aplikasi Spring Boot. Anda juga bisa mengemasnya dalam toples tebal. - Segera setelah Anda menyelesaikan langkah sebelumnya dan hasilnya cocok untuk Anda - Anda siap untuk membuat file biner Java, jalankan: "
mvnw package -Pnative
". Ini akan memakan waktu, karena kode asli akan dibuat selama kompilasi sebelumnya! Ketika langkah ini selesai, Anda akan memiliki file yang dapat dieksekusi sangat kecil dan sangat cepat, tetapi hanya dapat bekerja pada platform / OS Anda, yaitu, itu tidak akan porting! Tapi ini normal, karena kita bisa menaruhnya di wadah - dan dengan demikian memastikan portabilitas. Berikut ini cara melakukannya: ./mvnw package -Pnative -Dnative-image.docker-build=true
4 - dan kami menghapus executable dari wadah Docker, yaitu, kami melakukan perakitan asli di dalam wadah dan membuat file biner. Teknik ini mungkin tidak berfungsi pada laptop Anda jika sistem operasinya berbeda dari platform target yang ditentukan dalam DockerFile
dihasilkan oleh Quarkus selama pembuatan proyek. - Kemudian, setelah Anda memiliki biner, cukup buat gambar berdasarkan file buruh pelabuhan.
docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/quickstart
. - Akhirnya, aplikasi dapat diluncurkan di Docker atau Kubernetes:
docker run -i --rm -p 8080:8080 quarkus-quickstart/quickstart
Fitur Quarkus
Quarkus memiliki lebih banyak fitur daripada kode Java asli.
- Penyatuan kemampuan imperatif dan reaktif: memungkinkan Anda untuk menggabungkan kode imperatif yang sudah dikenal dengan kode non-pemblokiran yang ditulis dengan gaya reaktif.
- Pengembang senang : konfigurasi terpadu, Zero config, live-reboot dalam waktu singkat, kode efisien dioptimalkan untuk 80% kasus umum dan kode fleksibel untuk 20% kasus yang tersisa, pembuatan file yang dapat dieksekusi asli tanpa repot, live-coding.
- Pemuatan luar biasa cepat, area memori penduduk yang sangat kecil (ya, ini bukan hanya tentang ukuran tumpukan!), Yang menyediakan penskalaan vertikal hampir instan dan penggunaan memori yang sangat padat ketika mengatur wadah pada platform seperti Kubernetes. Lihat lebih detail .
- Quarkus menawarkan kerangka kerja tumpukan penuh yang holistik dan mudah digunakan, dengan perpustakaan kelas satu yang Anda kenal dan sukai yang tertanam dalam struktur pendukung. Lebih detail .
- Pustaka Hibernate, JPA, REST, JWT, dll. Didukung.
- Konfigurasi yang didukung dikerahkan di Kubernetes dan OpenShift
- Buka penelusuran menggunakan Jaeger
- Dukungan Kotlin
- Pesan dengan Kafka, Camel ...
- Dan masih banyak lagi, lihat daftar ekstensi !
Ekosistem Quarkus
Singkatnya, Anda sekarang dapat menjalankan layanan transaksional JPA / JTA tradisional dalam wadah ringan super cepat - baik di cloud maupun di lokasi .
Contoh quarkus
Di bagian ini, mari kita melihat lebih dekat pada
panduan pemula untuk memberi Anda kesan kekuatan Quarkus.

Cara termudah untuk membuat proyek Quarkus baru adalah membuka jendela command prompt dan menjalankan perintah berikut di dalamnya:
mvn io.quarkus:quarkus-maven-plugin:0.12.0:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=getting-started \ -DclassName="org.acme.quickstart.GreetingResource" \ -Dpath="/hello"
Ini menghasilkan proyek Maven dengan GreetingResuce memberikan titik akhir / halo. Gambar dockerfile docker untuk file asli dan jvm (gambar tradisional dalam bentuk toples tebal) juga dihasilkan. Kode ini sangat bersih dan sederhana:
@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } }
Untuk menjalankan aplikasi, gunakan:
./mvnw compile quarkus:dev
Aplikasi ini dikemas menggunakan paket ./mvnw. Hasilnya adalah 2 file jar:
- memulai-1.0-SNAPSHOT.jar - hanya berisi kelas dan sumber daya proyek. Ini adalah artefak umum yang dihasilkan dari pertemuan Maven;
- memulai-1.0-SNAPSHOT-runner.jar adalah toples yang dapat dieksekusi. Perhatikan bahwa ini bukan "uber-jar", ada dependensi di sini, mereka disalin ke direktori target / lib.
Anda dapat memulai aplikasi menggunakan: java -jar target / memulai-1.0-SNAPSHOT-runner.jar
Maka Anda perlu mengunduh dan menginstal GraalVM dan mengatur variabel lingkungan
GRAALVM_HOME
.
Sekarang Anda dapat membuat executable asli dengan:
./mvnw package -Pnative -Dnative-image.docker-build=true
.
Berikut cara membuat gambar Docker:
docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/quickstart
.
Sekarang dapat diluncurkan menggunakan mesin orkestrasi wadah, jika Anda menggunakan
minishift :
kubectl run quarkus-quickstart --image=quarkus-quickstart/quickstart:latest --port=8080 --image-pull-policy=IfNotPresent
kubectl expose deployment quarkus-quickstart --type=NodePort
Itu saja!; Sekarang Anda memiliki wadah dengan layanan Java REST yang dimulai dalam 0,004 detik!
Kesimpulan
Sekarang saya mengerti mengapa saya sangat terkesan dengan kerangka Quarkus yang didukung oleh Red Hat. Saya benar-benar percaya bahwa itu akan mengubah lanskap teknologi di Jawa dan memberi perusahaan tradisional besar peluang nyata untuk bermigrasi ke cloud.
Kubernetes + Knative + Quarkus mengubah aturan main dalam pengembangan berorientasi cloud dan akan menyenangkan pengembang Java mana pun.
Repositori ini
memiliki banyak contoh menarik!