
Pendahuluan
Pada 7 Maret, RedHat (segera IBM) memperkenalkan kerangka kerja baru, Quarkus . Menurut pengembang, kerangka kerja ini didasarkan pada GraalVM dan OpenJDK HotSpot dan dirancang untuk Kubernetes. Tumpukan Quarkus meliputi: JPA / Hibernate, JAX-RS / RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus dan lainnya.
Tujuannya adalah menjadikan Java sebagai platform terdepan untuk penggelaran ke Kubernetes dan mengembangkan aplikasi tanpa server, memberikan pengembang pendekatan terpadu untuk mengembangkan gaya reaktif dan imperatif.
Jika Anda melihat klasifikasi kerangka kerja ini, Quarkus berada di antara "Agregator / Generator Kode" dan "kerangka kerja fullstack tingkat tinggi". Ini sudah lebih dari sebuah agregator, tetapi juga tidak mencapai tumpukan penuh, karena tanah untuk pengembangan backend.
Kecepatan peluncuran aplikasi yang sangat tinggi dan konsumsi memori yang rendah dijanjikan. Berikut adalah data dari situs pengembang:
Waktu dari awal hingga jawaban pertama:
Konfigurasi | SISA | ISTIRAHAT + JPA |
---|
Quarkus + GraalVM | 0,014 | 0,055 |
Quarkus + OpenJDK | 0,75 | 2.5 |
Tumpukan Asli Awan Tradisional * | 4.3 | 9.5 |
Konsumsi memori (Mb):
Konfigurasi | SISA | ISTIRAHAT + JPA |
---|
Quarkus + GraalVM | 13 | 35 |
Quarkus + OpenJDK | 74 | 130 |
Tumpukan Asli Awan Tradisional * | 140 | 218 |
Mengesankan, bukan?
* Saya tidak menemukan informasi tentang tumpukan teknologi ini, kita dapat berasumsi bahwa ini adalah semacam Boot Musim Semi dengan body kit tambahan .
Halo Dunia!
Aplikasi paling sederhana yang ditulis dalam Quarkus akan terlihat seperti ini:
@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } }
Ini benar-benar satu kelas dan itu sudah cukup! Anda dapat memulai aplikasi menggunakan Maven dalam mode pengembangan:
mvn compile quarkus:dev … $ curl http://localhost:8080/hello hello
Berbeda dengan aplikasi biasa - tidak ada kelas Aplikasi! Quarkus mendukung hot reload, sehingga Anda dapat mengubah aplikasi tanpa me-restart-nya, sehingga berkembang lebih cepat.
Apa selanjutnya Anda dapat menambahkan layanan ke pengontrol menggunakan anotasi Suntikan . Kode Layanan:
@ApplicationScoped public class GreetingService { public String greeting(String name) { return "Hello " + name + "!"; } }
Pengendali:
@Path("/hello") public class GreetingResource { @Inject GreetingService service; @GET @Produces(MediaType.TEXT_PLAIN) @Path("/{name}") public String greeting(@PathParam("name") String name) { return service.greeting(name); } }
$ curl http://localhost:8080/hello/developer Hello developer!
Perhatikan bahwa Quarkus menggunakan anotasi standar dari kerangka kerja yang sudah dikenal - CDI dan JAX-RS. Anda tidak perlu mempelajari hal baru jika Anda bekerja dengan CDI dan JAX-RS sebelum itu, tentu saja.
Bekerja dengan basis data
Digunakan oleh Hibernate dan anotasi JPA standar untuk entitas. Seperti pengontrol REST, Anda perlu menulis kode minimal. Sudah cukup untuk menentukan dependensi dalam file assembly, mengatur penjelasan @Entity dan mengkonfigurasi sumber data di application.properties.
Itu saja. Tidak ada sessionFactory, persistence.xml dan file layanan lainnya. Kami hanya menulis kode yang diperlukan. Namun, jika perlu, Anda dapat membuat file persistence.xml dan mengkonfigurasi layer ORM lebih halus.
Quarkus mendukung caching entitas, koleksi untuk hubungan satu-ke-banyak, serta permintaan. Pada pandangan pertama, ini tampak hebat, tapi ini caching lokal , untuk satu host Kubernet. Yaitu cache dari node yang berbeda tidak disinkronkan satu sama lain. Saya harap ini bersifat sementara.
Eksekusi Kode Asinkron
Seperti yang dinyatakan di atas, Quarkus juga mendukung gaya pemrograman reaktif. Kode aplikasi sebelumnya dapat ditulis dalam bentuk lain.
@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) @Path("/{name}") public CompletionStage<String> greeting(@PathParam("name") String name) { return CompletableFuture.supplyAsync(() -> { return "Hello " + name + "!"; }); } }
Kode asinkron juga dapat ditransfer ke layanan, hasilnya akan sama.
Pengujian
Tes untuk aplikasi Quarkus dapat ditulis dalam JUnit4 atau JUnit5. Berikut ini adalah contoh tes untuk titik akhir, ditulis menggunakan RestAssured, tetapi Anda dapat menggunakan kerangka kerja lain:
@QuarkusTest public class GreetingResourceTest { @Test public void testGreetingEndpoint() { String uuid = UUID.randomUUID().toString(); given() .pathParam("name", uuid) .when().get("/hello/{name}") .then() .statusCode(200) .body(is("Hello " + uuid + "!")); } }
@QuarkusTest annotation memberitahu Anda untuk menjalankan aplikasi sebelum menjalankan tes. Sisanya akrab dengan semua kode pengembang.
Karena Quarkus terintegrasi erat dengan GraalVM, tentu saja, kode khusus platform dapat dihasilkan. Untuk melakukan ini, atur GraalVM dan tentukan variabel lingkungan GRAALVM_HOME. Selanjutnya, daftarkan profil untuk majelis dan tentukan ketika membangun aplikasi:
mvn package -Pnative
Menariknya, aplikasi yang dihasilkan dapat diuji. Dan ini penting, karena eksekusi kode "asli" mungkin berbeda dari eksekusi pada JVM. Annotation @SubstrateTest menjalankan kode aplikasi khusus platform. Menggunakan kembali kode tes yang ada dapat dilakukan menggunakan pewarisan, sebagai hasilnya, kode untuk menguji aplikasi platform spesifik akan terlihat seperti ini:
@SubstrateTest public class GreetingResourceIT extends GreetingResourceTest { }
Gambar yang dihasilkan dapat dikemas dalam Docker dan dijalankan di Kubernetes atau OpenShift, dijelaskan secara rinci dalam instruksi .
Toolkit
Kerangka Quarkus dapat digunakan dengan Maven dan Gradle. Maven didukung penuh, tidak seperti Gradle. Sayangnya, saat ini Gradle tidak mendukung pembuatan proyek kosong, situs tersebut memiliki tutorial yang terperinci.
Ekstensi
Quarkus adalah kerangka kerja yang bisa diperluas. Saat ini, ada sekitar 40 ekstensi yang menambahkan berbagai fungsionalitas - mulai dari dukungan untuk wadah Spring DI dan Apache Camel hingga masuk dan menerbitkan metrik untuk menjalankan layanan. Dan sudah ada ekstensi untuk mendukung aplikasi penulisan dalam bahasa Kotlin, selain Java.
Kesimpulan
Menurut pendapat saya, Quarkus adalah bagian dari tren waktu. Pengembangan kode backend semakin mudah dan sederhana, dan kerangka kerja ini semakin menyederhanakan dan mempercepat pengembangan layanan, menambahkan dukungan "asli" untuk Docker dan Kubernetes. Nilai tambah yang besar adalah dukungan bawaan untuk GraalVM dan generasi gambar platform-spesifik, yang memungkinkan Anda untuk membuat layanan memulai dengan sangat cepat dan menghabiskan sedikit ruang memori. Dan ini sangat penting pada saat kita memiliki antusiasme yang besar terhadap layanan microser dan arsitektur tanpa server.
Situs web resmi adalah quarkus.io . Contoh proyek untuk memulai cepat sudah ada di GitHub .