Panduan untuk QuarkusIO

1. Pengenalan

Pada masa kini, sangat biasa menulis aplikasi dan menyebarkan ke awan dan tidak bimbang tentang infrastruktur. Tanpa pelayan dan FaaS telah menjadi sangat popular.

Dalam persekitaran seperti ini, di mana kejadian dibuat dan dimusnahkan dengan kerap, masa untuk boot dan masa untuk permintaan pertama sangat penting, kerana dapat menciptakan pengalaman pengguna yang sama sekali berbeza.

Bahasa seperti JavaScript dan Python selalu menjadi tumpuan dalam senario jenis ini. Dengan kata lain, Java dengan JAR gemuk dan masa boot yang panjang tidak pernah menjadi pesaing utama.

Dalam tutorial ini, kami akan membentangkan Quarkus dan membincangkan apakah itu alternatif untuk membawa Java ke awan dengan lebih berkesan .

2. QuarkusIO

QuarkusIO, Supersonic Subatomic Java, berjanji untuk menyampaikan artifak kecil, masa boot yang sangat pantas, dan permintaan masa ke pertama yang lebih rendah. Apabila digabungkan dengan GraalVM, Quarkus akan menyusun lebih awal (AOT).

Dan, kerana Quarkus dibina berdasarkan standard, kita tidak perlu mempelajari sesuatu yang baru. Oleh itu, kita boleh menggunakan CDI dan JAX-RS, antara lain. Juga, Quarkus mempunyai banyak sambungan, termasuk yang menyokong Hibernate, Kafka, OpenShift, Kubernetes, dan Vert.x.

3. Permohonan Pertama Kami

Cara termudah untuk membuat projek Quarkus baru adalah dengan membuka terminal dan menaip:

mvn io.quarkus:quarkus-maven-plugin:0.13.1:create \ -DprojectGroupId=com.baeldung.quarkus \ -DprojectArtifactId=quarkus-project \ -DclassName="com.baeldung.quarkus.HelloResource" \ -Dpath="/hello"

Ini akan menghasilkan kerangka projek, HelloResource dengan / hello endpoint terdedah, konfigurasi, projek Maven, dan Dockerfiles.

Setelah diimport ke IDE kami, kami akan mempunyai struktur yang serupa dengan yang ditunjukkan dalam gambar di bawah:

Mari kita periksa kandungan kelas HelloResource :

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

Semuanya kelihatan baik setakat ini. Pada ketika ini, kami mempunyai aplikasi sederhana dengan satu titik akhir RESTEasy JAX-RS. Mari teruskan dan mengujinya dengan membuka terminal dan menjalankan perintah:

./mvnw compile quarkus:dev:

Titik akhir REST kami harus didedahkan di localhost: 8080 / hello. Mari kita mengujinya dengan arahan curl :

$ curl localhost:8080/hello hello

4. Muat Semula Panas

Semasa berjalan dalam mod pembangunan ( ./mvn kompilasi quarkus: dev ), Quarkus memberikan kemampuan tambah nilai panas. Dengan kata lain, perubahan yang dibuat pada file Java atau ke file konfigurasi akan disusun secara automatik setelah penyemak imbas disegarkan . Ciri yang paling mengagumkan di sini ialah kita tidak perlu menyimpan fail kita. Ini mungkin baik atau buruk, bergantung pada pilihan kita.

Kami sekarang akan mengubah contoh kami untuk menunjukkan kemampuan tambah nilai panas. Sekiranya aplikasi dihentikan, kita boleh memulakannya semula dalam mod dev. Kami akan menggunakan contoh yang sama seperti sebelumnya sebagai titik permulaan kami.

Pertama, kami akan membuat kelas HelloService :

@ApplicationScoped public class HelloService { public String politeHello(String name){ return "Hello Mr/Mrs " + name; } }

Sekarang, kita akan mengubah kelas HelloResource , menyuntikkan HelloService dan menambahkan kaedah baru:

@Inject HelloService helloService; @GET @Produces(MediaType.APPLICATION_JSON) @Path("/polite/{name}") public String greeting(@PathParam("name") String name) { return helloService.politeHello(name); }

Seterusnya, mari kita uji titik akhir baru kami:

$ curl localhost:8080/hello/polite/Baeldung Hello Mr/Mrs Baeldung

Kami akan membuat satu lagi perubahan untuk menunjukkan bahawa perkara yang sama dapat diterapkan pada fail harta tanah. Mari edit fail application.properties dan tambahkan satu lagi kunci:

greeting=Good morning

Selepas itu, kami akan mengubahsuai HelloService untuk menggunakan harta baru kami:

@ConfigProperty(name = "greeting") private String greeting; public String politeHello(String name){ return greeting + " " + name; }

Sekiranya kita menjalankan perintah curl yang sama , kita sekarang harus melihat:

Good morning Baeldung

Kami dapat mengemas aplikasi dengan mudah dengan menjalankan:

./mvnw package 

Ini akan menghasilkan 2 fail jar di dalam direktori sasaran :

  • quarkus-project-1.0-SNAPSHOT-runner.jar - balang yang boleh dilaksanakan dengan pergantungan yang disalin ke target / lib
  • quarkus-project-1.0-SNAPSHOT.jar - mengandungi kelas dan fail sumber

Kita sekarang boleh menjalankan aplikasi yang dikemas:

java -jar target/quarkus-project-1.0-SNAPSHOT-runner.jar

5. Imej Asli

Seterusnya, kami akan menghasilkan gambar asli aplikasi kami. Imej asli akan meningkatkan masa dan masa permulaan untuk tindak balas pertama. Dengan kata lain, ia mengandungi semua yang diperlukan untuk dijalankan, termasuk JVM minimum yang diperlukan untuk menjalankan aplikasi .

Sebagai permulaan, kita perlu memasang GraalVM dan pemboleh ubah persekitaran GRAALVM_HOME dikonfigurasi.

Kami sekarang akan menghentikan aplikasi (Ctrl + C), jika belum berhenti, dan jalankan perintah:

./mvnw package -Pnative

Proses ini boleh mengambil masa beberapa saat. Oleh kerana gambar asli cuba membuat semua kod AOT untuk boot lebih cepat, akibatnya, kita akan mempunyai masa yang lebih lama.

We can run ./mvnw verify -Pnative to verify that our native artifact was properly constructed:

Secondly, we'll create a container image using our native executable. For that, we must have a container runtime (i.e. Docker) running in our machine. Let's open up a terminal window and execute:

./mvnw package -Pnative -Dnative-image.docker-build=true 

This will create a Linux 64-bit executable, therefore if we're using a different OS, it might not be runnable anymore. That's okay for now.

The project generation created a Dockerfile.native for us:

FROM registry.fedoraproject.org/fedora-minimal WORKDIR /work/ COPY target/*-runner /work/application RUN chmod 775 /work EXPOSE 8080 CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] 

If we examine the file, we have a hint at what comes next. First, we'll create a docker image:

docker build -f src/main/docker/Dockerfile.native -t quarkus/quarkus-project .

Now, we can run the container using:

docker run -i --rm -p 8080:8080 quarkus/quarkus-project

The container started in an incredibly low time of 0.009s. That's one of the strengths of Quarkus.

Finally, we should test our modified REST to validate our application:

$ curl localhost:8080/hello/polite/Baeldung Good morning Baeldung

6. Deploying to OpenShift

Once we're done testing locally using Docker, we'll deploy our container to OpenShift. Assuming we have the Docker image on our registry, we can deploy the application following the steps below:

oc new-build --binary --name=quarkus-project -l app=quarkus-project oc patch bc/quarkus-project -p '{"spec":{"strategy":{"dockerStrategy":{"dockerfilePath":"src/main/docker/Dockerfile.native"}}}}' oc start-build quarkus-project --from-dir=. --follow oc new-app --image-stream=quarkus-project:latest oc expose service quarkus-project

Now, we can get the application URL by running:

oc get route

Lastly, we'll access the same endpoint (note that the URL might be different, depending on our IP address):

$ curl //quarkus-project-myproject.192.168.64.2.nip.io/hello/polite/Baeldung Good morning Baeldung

7. Conclusion

Dalam artikel ini, kami menunjukkan bahawa Quarkus adalah penambahan hebat yang dapat membawa Java ke awan dengan lebih berkesan. Sebagai contoh, sekarang mungkin untuk membayangkan Java di AWS Lambda. Juga, Quarkus berdasarkan standard seperti JPA dan JAX / RS. Oleh itu, kita tidak perlu mempelajari sesuatu yang baru.

Quarkus menarik perhatian akhir-akhir ini, dan banyak ciri baru ditambahkan setiap hari. Terdapat beberapa projek permulaan untuk kami mencuba Quarkus di repositori Quarkus GitHub.

Seperti biasa, kod untuk artikel ini terdapat di GitHub. Selamat pengekodan!