Το Quarkus είναι μια υπερηχητική υποατομική Java. Σύντομη επισκόπηση του πλαισίου

Το Quarkus είναι μια υπερηχητική υποατομική Java. Σύντομη επισκόπηση του πλαισίου

Εισαγωγή

Στις XNUMX Μαρτίου, RedHat (σύντομα IBM) παρουσιάζονται νέο πλαίσιο - Κουάρκος. Σύμφωνα με τους προγραμματιστές, αυτό το πλαίσιο βασίζεται στο GraalVM και το OpenJDK HotSpot και έχει σχεδιαστεί για Kubernetes. Η στοίβα Quarkus περιλαμβάνει: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus και άλλα.

Ο στόχος είναι να γίνει η Java η κορυφαία πλατφόρμα για την ανάπτυξη Kubernetes και την ανάπτυξη εφαρμογών χωρίς διακομιστή, παρέχοντας στους προγραμματιστές μια ενοποιημένη προσέγγιση ανάπτυξης τόσο σε αντιδραστικά όσο και σε επιτακτική στυλ.

Αν κοιτάξεις αυτό ταξινόμηση πλαισίων, τότε το Quarkus βρίσκεται κάπου μεταξύ «Aggregators/Code Generators» και «High-level fullstack frames». Αυτό είναι ήδη κάτι περισσότερο από ένα aggregator, αλλά δεν φτάνει καν σε πλήρη στοίβα, γιατί... προσαρμοσμένο για ανάπτυξη backend.

Υπόσχονται πολύ υψηλή ταχύτητα εκκίνησης της εφαρμογής και χαμηλή κατανάλωση μνήμης. Ακολουθούν τα δεδομένα από τον ιστότοπο του προγραμματιστή:

Χρόνος από την αρχή έως την πρώτη απάντηση(ες):

Διαμόρφωση
ΠΕΡΙΦΕΡΕΙΑ
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Παραδοσιακό Cloud Native Stack*
4.3
9.5

Κατανάλωση μνήμης (Mb):

Διαμόρφωση
ΠΕΡΙΦΕΡΕΙΑ
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Παραδοσιακό Cloud Native Stack*
140
218

Εντυπωσιακό, έτσι δεν είναι;

*Δεν βρήκα πληροφορίες σχετικά με αυτήν τη στοίβα τεχνολογίας, μπορούμε να υποθέσουμε ότι πρόκειται για κάποιο είδος Spring Boot με πρόσθετο κιτ σώματος.

Γειά σου Κόσμε!

Η απλούστερη εφαρμογή γραμμένη στο Quarkus θα μοιάζει με αυτό:

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

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

Είναι κυριολεκτικά μια τάξη και φτάνει! Μπορείτε να εκτελέσετε την εφαρμογή χρησιμοποιώντας το Maven σε λειτουργία ανάπτυξης:

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

Η διαφορά από μια κανονική εφαρμογή είναι ότι δεν υπάρχει κατηγορία Εφαρμογών! Το Quarkus υποστηρίζει hot reload, ώστε να μπορείτε να αλλάξετε την εφαρμογή σας χωρίς να την επανεκκινήσετε, κάνοντας την ανάπτυξη ακόμα πιο γρήγορη.

Τι έπεται? Μπορείτε να προσθέσετε μια υπηρεσία σε έναν ελεγκτή χρησιμοποιώντας έναν σχολιασμό Εγχύστε. Κωδικός υπηρεσίας:

@ApplicationScoped
public class GreetingService {

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

Ελεγκτής:

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

Σημειώστε ότι το Quarkus χρησιμοποιεί τυπικούς σχολιασμούς από γνωστά πλαίσια - CDI και JAX-RS. Δεν χρειάζεται να μάθετε τίποτα καινούργιο εάν έχετε εργαστεί με CDI και JAX-RS στο παρελθόν, φυσικά.

Εργασία με τη βάση δεδομένων

Χρησιμοποιούνται αδρανοποίηση και τυπικοί σχολιασμοί JPA για οντότητες. Όπως και με τους ελεγκτές REST, πρέπει να γράψετε έναν ελάχιστο κώδικα. Αρκεί να υποδείξετε τις εξαρτήσεις στο αρχείο συναρμολόγησης, να προσθέσετε σχολιασμούς @Entity και ρυθμίστε την πηγή δεδομένων στο application.properties.

Ολα. Χωρίς sessionFactory, persistence.xml ή άλλα αρχεία υπηρεσίας. Γράφουμε μόνο τον κωδικό που χρειάζεται. Ωστόσο, εάν είναι απαραίτητο, μπορείτε να δημιουργήσετε ένα αρχείο persistence.xml και να ρυθμίσετε τις παραμέτρους του επιπέδου ORM με μεγαλύτερη ακρίβεια.

Το Quarkus υποστηρίζει προσωρινή αποθήκευση οντοτήτων, συλλογές για σχέσεις ένα προς πολλά και ερωτήματα. Με την πρώτη ματιά φαίνεται υπέροχο, αλλά είναι τοπικά προσωρινή αποθήκευση, για έναν κόμβο Kubernetes. Εκείνοι. Οι κρυφές μνήμες διαφορετικών κόμβων δεν συγχρονίζονται μεταξύ τους. Ελπίζω ότι αυτό είναι προσωρινό.

Ασύγχρονη εκτέλεση κώδικα

Όπως αναφέρθηκε παραπάνω, το Quarkus υποστηρίζει επίσης το αντιδραστικό στυλ προγραμματισμού. Ο κωδικός της προηγούμενης αίτησης μπορεί να γραφτεί με διαφορετική μορφή.

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

Ο ασύγχρονος κώδικας μπορεί επίσης να μεταφερθεί στην υπηρεσία, το αποτέλεσμα θα είναι το ίδιο.

Δοκιμές

Οι δοκιμές για εφαρμογές Quarkus μπορούν να γραφτούν σε JUnit4 ή JUnit5. Παρακάτω είναι ένα παράδειγμα δοκιμής για ένα τελικό σημείο, είναι γραμμένο χρησιμοποιώντας το RestAssured, αλλά μπορεί να χρησιμοποιηθεί ένα άλλο πλαίσιο:

@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 σάς καθοδηγεί να εκτελέσετε την εφαρμογή πριν εκτελέσετε δοκιμές. Το υπόλοιπο είναι κώδικας γνωστός σε όλους τους προγραμματιστές.

Εφαρμογή για συγκεκριμένη πλατφόρμα

Δεδομένου ότι το Quarkus είναι στενά ενσωματωμένο με το GraalVM, είναι φυσικά δυνατό να δημιουργηθεί κώδικας για συγκεκριμένη πλατφόρμα. Για να το κάνετε αυτό, πρέπει να εγκαταστήσετε το GraalVM και να καθορίσετε τη μεταβλητή περιβάλλοντος GRAALVM_HOME. Περαιτέρω καταχωρήστε ένα προφίλ για συναρμολόγηση και καθορίστε το κατά τη δημιουργία της εφαρμογής:

mvn package -Pnative

Είναι ενδιαφέρον ότι η παραγόμενη εφαρμογή μπορεί να δοκιμαστεί. Και αυτό είναι σημαντικό γιατί η εκτέλεση του εγγενούς κώδικα μπορεί να διαφέρει από την εκτέλεση στο JVM. Ο σχολιασμός @SubstrateTest εκτελεί κώδικα εφαρμογής για συγκεκριμένη πλατφόρμα. Η επαναχρησιμοποίηση του υπάρχοντος κωδικού δοκιμής μπορεί να γίνει χρησιμοποιώντας κληρονομικότητα· ως αποτέλεσμα, ο κώδικας για τη δοκιμή μιας εφαρμογής που εξαρτάται από την πλατφόρμα θα μοιάζει με αυτό:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Η παραγόμενη εικόνα μπορεί να συσκευαστεί στο Docker και να εκτελεστεί σε Kubernetes ή OpenShift, όπως περιγράφεται λεπτομερώς στο οδηγίες.

Εργαλειοθήκη

Το πλαίσιο Quarkus μπορεί να χρησιμοποιηθεί με τους Maven και Gradle. Το Maven υποστηρίζεται πλήρως, σε αντίθεση με το Gradle. Δυστυχώς, αυτή τη στιγμή το Gradle δεν υποστηρίζει τη δημιουργία κενού έργου· υπάρχουν λεπτομερείς πληροφορίες στον ιστότοπο εγχειρίδιο.

επέκταση

Το Quarkus είναι ένα επεκτάσιμο πλαίσιο. Αυτή τη στιγμή υπάρχει παραγγελία 40 επεκτάσεις, που προσθέτουν διάφορες λειτουργίες - από υποστήριξη Ελατήριο DI δοχείο и Apache Camel πριν από την καταγραφή και τη δημοσίευση μετρήσεων για υπηρεσίες που εκτελούνται. Και υπάρχει ήδη μια επέκταση για την υποστήριξη γραφής εφαρμογών στο Kotlin, εκτός από την Java.

Συμπέρασμα

Κατά τη γνώμη μου, το Quarkus είναι αρκετά σύμφωνο με τις τάσεις της εποχής. Η ανάπτυξη κώδικα backend γίνεται όλο και πιο εύκολη και αυτό το πλαίσιο απλοποιεί και επιταχύνει περαιτέρω την ανάπτυξη υπηρεσιών προσθέτοντας εγγενή υποστήριξη για το Docker και το Kubernetes. Ένα τεράστιο πλεονέκτημα είναι η ενσωματωμένη υποστήριξη για το GraalVM και η δημιουργία εικόνων που εξαρτώνται από την πλατφόρμα, που επιτρέπει στις υπηρεσίες να ξεκινούν πολύ γρήγορα και να καταλαμβάνουν λίγο χώρο στη μνήμη. Και αυτό είναι πολύ σημαντικό στην εποχή μας του μαζικού πάθους για τις μικροϋπηρεσίες και την αρχιτεκτονική χωρίς διακομιστές.

Επίσημη ιστοσελίδα - quarkus.io. Παραδείγματα έργων για γρήγορη εκκίνηση είναι ήδη διαθέσιμα στο GitHub.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο