Quarkus adalah Java subatomik supersonik. Tinjauan singkat tentang kerangka tersebut

Quarkus adalah Java subatomik supersonik. Tinjauan singkat tentang kerangka tersebut

pengenalan

Pada tanggal XNUMX Maret, RedHat (segera IBM) disajikan kerangka baru - kuarkus. Menurut pengembangnya, 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 penerapan Kubernetes dan pengembangan aplikasi tanpa server, memberikan pengembang pendekatan terpadu terhadap pengembangan dalam gaya reaktif dan imperatif.

Jika Anda melihat ini klasifikasi kerangka kerja, maka Quarkus berada di antara β€œAgregator/Pembuat Kode” dan β€œKerangka kerja fullstack tingkat tinggi”. Ini sudah lebih dari sekadar agregator, tetapi bahkan belum mencapai tumpukan penuh, karena... disesuaikan untuk pengembangan backend.

Kecepatan peluncuran aplikasi yang sangat tinggi dan konsumsi memori yang rendah dijanjikan. Berikut data dari situs pengembang:

Waktu dari awal hingga respons pertama:

Konfigurasi
ISTIRAHAT
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tumpukan Asli Cloud Tradisional*
4.3
9.5

Konsumsi memori (Mb):

Konfigurasi
ISTIRAHAT
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Tumpukan Asli Cloud Tradisional*
140
218

Mengesankan, bukan?

*Saya tidak menemukan informasi apa pun tentang tumpukan teknologi ini, kami dapat berasumsi bahwa ini adalah semacam Spring Boot 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 menjalankan aplikasi menggunakan Maven dalam mode pengembangan:

mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello

Bedanya dengan aplikasi biasa adalah tidak ada kelas Aplikasi! Quarkus mendukung hot reload, sehingga Anda dapat mengubah aplikasi tanpa memulai ulang, sehingga pengembangan menjadi lebih cepat.

Apa berikutnya? Anda dapat menambahkan layanan ke pengontrol menggunakan anotasi Menyuntikkan. Kode layanan:

@ApplicationScoped
public class GreetingService {

   public String greeting(String name) {
       return "Hello " + name + "!";
   }
}

Pengontrol:

@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. Tentu saja, Anda tidak perlu mempelajari sesuatu yang baru jika Anda pernah bekerja dengan CDI dan JAX-RS sebelumnya.

Bekerja dengan basis data

Anotasi hibernasi dan JPA standar untuk entitas digunakan. Seperti halnya pengontrol REST, Anda perlu menulis kode minimum. Cukup dengan menunjukkan dependensi dalam file perakitan, tambahkan anotasi @Entity dan konfigurasikan sumber data di application.properties.

Semua. Tidak ada sessionFactory, persistence.xml, atau file layanan lainnya. Kami hanya menulis kode yang diperlukan. Namun, jika perlu, Anda dapat membuat file persistence.xml dan mengkonfigurasi lapisan ORM dengan lebih baik.

Quarkus mendukung caching entitas, koleksi untuk hubungan satu-ke-banyak, dan kueri. Sekilas terlihat bagus, tapi memang begitu lokal caching, untuk satu node Kubernetes. Itu. Cache dari node yang berbeda tidak disinkronkan satu sama lain. Saya harap ini hanya sementara.

Eksekusi kode asinkron

Seperti disebutkan di atas, Quarkus juga mendukung gaya pemrograman reaktif. Kode aplikasi sebelumnya dapat ditulis dalam bentuk yang berbeda.

@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

Pengujian untuk aplikasi Quarkus dapat ditulis dalam JUnit4 atau JUnit5. Di bawah ini adalah contoh pengujian untuk titik akhir, ditulis menggunakan RestAssured, tetapi kerangka kerja lain dapat digunakan:

@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 + "!"));
   }
}

Anotasi @QuarkusTest memerintahkan Anda untuk menjalankan aplikasi sebelum menjalankan pengujian. Sisanya adalah kode yang familier bagi semua pengembang.

Aplikasi khusus platform

Karena Quarkus terintegrasi erat dengan GraalVM, tentu saja dimungkinkan untuk menghasilkan kode khusus platform. Untuk melakukannya, Anda perlu menginstal GraalVM dan menentukan variabel lingkungan GRAALVM_HOME. Lebih jauh daftarkan profil untuk perakitan dan tentukan saat membangun aplikasi:

mvn package -Pnative

Menariknya, aplikasi yang dihasilkan bisa diuji. Dan ini penting karena eksekusi kode asli mungkin berbeda dengan eksekusi di JVM. Anotasi @SubstrateTest menjalankan kode aplikasi khusus platform. Penggunaan kembali kode pengujian yang ada dapat dilakukan dengan menggunakan warisan; sebagai hasilnya, kode untuk menguji aplikasi yang bergantung pada platform 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 di Instruksi.

Toolkit

Kerangka kerja Quarkus dapat digunakan dengan Maven dan Gradle. Maven didukung penuh, tidak seperti Gradle. Sayangnya, saat ini Gradle tidak mendukung pembuatan proyek kosong; terdapat informasi rinci di situs web buku teks.

Ekstensi

Quarkus adalah kerangka kerja yang dapat diperluas. Saat ini sedang ada pesanan 40 ekstensi, yang menambahkan berbagai fungsi - dari dukungan Wadah pegas DI ΠΈ Unta Apache sebelum mencatat dan memublikasikan metrik untuk layanan yang berjalan. Dan sudah ada extension untuk mendukung penulisan aplikasi di Kotlin, selain Java.

Kesimpulan

Menurut saya, Quarkus cukup sejalan dengan tren zaman. Pengembangan kode backend menjadi semakin mudah, dan kerangka kerja ini semakin menyederhanakan dan mempercepat pengembangan layanan dengan menambahkan dukungan asli untuk Docker dan Kubernetes. Nilai tambah yang besar adalah dukungan bawaan untuk GraalVM dan pembuatan gambar yang bergantung pada platform, yang memungkinkan layanan dimulai dengan sangat cepat dan hanya menggunakan sedikit ruang memori. Dan ini sangat penting di zaman kita yang sangat menyukai layanan mikro dan arsitektur tanpa server.

Situs resmi - quarkus.io. Contoh proyek untuk memulai cepat sudah tersedia GitHub.

Sumber: www.habr.com

Tambah komentar