Quarkus ialah Java subatom supersonik. Gambaran keseluruhan ringkas rangka kerja

Quarkus ialah Java subatom supersonik. Gambaran keseluruhan ringkas rangka kerja

Pengenalan

Pada XNUMX Mac, RedHat (tidak lama lagi IBM) dibentangkan rangka kerja baharu - quarkus. Menurut pembangun, rangka kerja ini adalah berdasarkan GraalVM dan OpenJDK HotSpot dan direka untuk Kubernetes. Timbunan Quarkus termasuk: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus dan lain-lain.

Matlamatnya adalah untuk menjadikan Java sebagai platform utama untuk penggunaan Kubernetes dan pembangunan aplikasi tanpa pelayan, menyediakan pembangun pendekatan bersepadu untuk pembangunan dalam kedua-dua gaya reaktif dan penting.

Jika anda melihat ini klasifikasi rangka kerja, maka Quarkus berada di suatu tempat di antara "Pengagregat/Penjana Kod" dan "Rangka kerja fullstack peringkat tinggi". Ini sudah lebih daripada pengagregat, tetapi ia tidak mencapai tindanan penuh, kerana... disesuaikan untuk pembangunan bahagian belakang.

Pelancaran aplikasi berkelajuan tinggi dan penggunaan memori yang rendah dijanjikan. Berikut ialah data daripada tapak web pembangun:

Masa dari mula hingga respons pertama:

Konfigurasi
REST
REHAT+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Timbunan Asli Awan Tradisional*
4.3
9.5

Penggunaan memori (Mb):

Konfigurasi
REST
REHAT+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Timbunan Asli Awan Tradisional*
140
218

Mengagumkan, bukan?

*Saya tidak menemui sebarang maklumat tentang timbunan teknologi ini, kita boleh menganggap bahawa ini adalah sejenis Boot Spring dengan kit badan tambahan.

Hai dunia!

Aplikasi paling mudah yang ditulis dalam Quarkus akan kelihatan seperti ini:

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   public String hello() {
       return "hello";
   }
}

Ia benar-benar satu kelas dan itu sudah cukup! Anda boleh menjalankan aplikasi menggunakan Maven dalam mod pembangunan:

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

Perbezaan dari aplikasi biasa ialah tiada kelas Aplikasi! Quarkus menyokong muat semula panas, jadi anda boleh menukar aplikasi anda tanpa memulakannya semula, menjadikan pembangunan lebih pantas.

Apa yang akan datang? Anda boleh menambah perkhidmatan pada pengawal menggunakan anotasi Suntikan. Kod perkhidmatan:

@ApplicationScoped
public class GreetingService {

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

Pengawal:

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

Ambil perhatian bahawa Quarkus menggunakan anotasi standard daripada rangka kerja biasa - CDI dan JAX-RS. Tidak perlu mempelajari sesuatu yang baru jika anda pernah bekerja dengan CDI dan JAX-RS sebelum ini, sudah tentu.

Bekerja dengan pangkalan data

Anotasi hibernate dan JPA standard untuk entiti digunakan. Seperti pengawal REST, anda perlu menulis kod minimum. Ia cukup untuk menunjukkan kebergantungan dalam fail pemasangan, tambah anotasi @Entity dan konfigurasikan sumber data dalam application.properties.

Semua. Tiada sessionFactory, persistence.xml atau fail perkhidmatan lain. Kami hanya menulis kod yang diperlukan. Walau bagaimanapun, jika perlu, anda boleh mencipta fail persistence.xml dan mengkonfigurasi lapisan ORM dengan lebih halus.

Quarkus menyokong caching entiti, koleksi untuk perhubungan satu-ke-banyak dan pertanyaan. Pada pandangan pertama ia kelihatan hebat, tetapi ia tempatan caching, untuk satu nod Kubernetes. Itu. Cache nod yang berbeza tidak disegerakkan antara satu sama lain. Saya harap ini sementara.

Pelaksanaan kod tak segerak

Seperti yang dinyatakan di atas, Quarkus juga menyokong gaya pengaturcaraan reaktif. Kod permohonan sebelumnya boleh ditulis dalam bentuk yang berbeza.

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

Kod tak segerak juga boleh dipindahkan ke perkhidmatan, hasilnya akan sama.

Ujian

Ujian untuk aplikasi Quarkus boleh ditulis dalam JUnit4 atau JUnit5. Di bawah ialah contoh ujian untuk titik akhir, ia ditulis menggunakan RestAssured, tetapi rangka kerja lain boleh 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 mengarahkan anda untuk menjalankan aplikasi sebelum menjalankan ujian. Selebihnya adalah kod yang biasa kepada semua pembangun.

Aplikasi khusus platform

Memandangkan Quarkus disepadukan rapat dengan GraalVM, sudah tentu mungkin untuk menjana kod khusus platform. Untuk melakukan ini, anda perlu memasang GraalVM dan menentukan pembolehubah persekitaran GRAALVM_HOME. Selanjutnya daftarkan profil untuk pemasangan dan nyatakannya semasa membina aplikasi:

mvn package -Pnative

Menariknya, aplikasi yang dihasilkan boleh diuji. Dan ini penting kerana pelaksanaan kod asli mungkin berbeza daripada pelaksanaan pada JVM. Anotasi @SubstrateTest menjalankan kod aplikasi khusus platform. Menggunakan semula kod ujian sedia ada boleh dilakukan menggunakan warisan; akibatnya, kod untuk menguji aplikasi yang bergantung pada platform akan kelihatan seperti ini:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Imej yang dijana boleh dibungkus dalam Docker dan dijalankan dalam Kubernetes atau OpenShift, diterangkan secara terperinci dalam Directions.

Alat

Rangka kerja Quarkus boleh digunakan dengan Maven dan Gradle. Maven disokong sepenuhnya, tidak seperti Gradle. Malangnya, pada masa ini Gradle tidak menyokong penjanaan projek kosong; terdapat maklumat terperinci di tapak web buku teks.

Pelanjutan

Quarkus ialah rangka kerja yang boleh diperluaskan. Buat masa ini ada tempahan 40 sambungan, yang menambah pelbagai fungsi - daripada sokongan Bekas spring DI ΠΈ Unta Apache sebelum mengelog dan menerbitkan metrik untuk menjalankan perkhidmatan. Dan sudah ada sambungan untuk menyokong aplikasi penulisan dalam Kotlin, sebagai tambahan kepada Java.

Kesimpulan

Pada pendapat saya, Quarkus agak sesuai dengan trend masa itu. Pembangunan kod backend menjadi lebih mudah dan mudah, dan rangka kerja ini memudahkan dan mempercepatkan pembangunan perkhidmatan dengan menambahkan sokongan asli untuk Docker dan Kubernetes. Tambahan yang besar ialah sokongan terbina dalam untuk GraalVM dan penjanaan imej yang bergantung kepada platform, yang membolehkan perkhidmatan bermula dengan cepat dan mengambil sedikit ruang memori. Dan ini adalah sangat penting dalam zaman kita yang penuh semangat untuk perkhidmatan mikro dan seni bina tanpa pelayan.

Laman rasmi - quarkus.io. Contoh projek untuk permulaan pantas sudah tersedia di GitHub.

Sumber: www.habr.com

Tambah komen