Πώς το Quarkus συνδυάζει το MicroProfile και το Spring

Γεια σε όλους, ορίστε η τρίτη ανάρτηση της σειράς Quarkus!

Πώς το Quarkus συνδυάζει το MicroProfile και το Spring

Κατά την ανάπτυξη μικρουπηρεσιών Java, πιστεύεται συχνά ότι Eclipse MicroProfile и Ανοιξιάτικη μπότα είναι ξεχωριστά και ανεξάρτητα API. Από προεπιλογή, οι προγραμματιστές τείνουν να χρησιμοποιούν τα API που έχουν ήδη συνηθίσει, καθώς η εκμάθηση νέων πλαισίων και στοιχείων χρόνου εκτέλεσης απαιτεί πολύ χρόνο. Σήμερα θα προσπαθήσουμε να απλοποιήσουμε την ανάπτυξη ορισμένων δημοφιλών MicroProfile API για προγραμματιστές Spring και να σας δείξει πώς να χρησιμοποιείτε ταυτόχρονα το Spring API και νέες χρήσιμες λειτουργίες Κουάρκος.

Με λίγο περισσότερες λεπτομέρειες, θα δούμε πρώτα το εύρος και τις λεπτομέρειες του τρόπου με τον οποίο το Quarkus υποστηρίζει τα Spring API για να δείξουμε στους προγραμματιστές Spring πώς να χρησιμοποιούν το MicroProfile API στην καθημερινή τους εργασία. Στη συνέχεια, θα καλύψουμε τα API MicroProfile, τα οποία είναι χρήσιμα για τους προγραμματιστές Spring κατά τη δημιουργία μικροϋπηρεσιών.

Γιατί Quarkus; Πρώτον, πρόκειται για ζωντανή κωδικοποίηση, δηλαδή για αυτόματη επαναφόρτωση τυχόν αλλαγών στο MicroProfile API, στο Spring API και σε άλλα Java API, η οποία εκτελείται με μία μόνο εντολή: mvn quarkus:dev. Δεύτερον, εξετάζεται σε στο παράδειγμά μας η υπηρεσία Person (η οποία μεταγλωττίζεται από τα API Spring, MicroProfile και JPA σε ένα δυαδικό χρησιμοποιώντας την εγγενή εικόνα GraalVM) ξεκινά σε μόλις 0.055 δευτερόλεπτα και καταλαμβάνει περίπου 90 MB μνήμης RAM (RSS) στο τελικό σημείο της εφαρμογής RESTful. Επιπλέον, η ίδια η μεταγλώττιση του γίνεται με μία μόνο εντολή: πακέτο mvn -Pnative.

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

Εμπορευματοκιβώτια και Kubernetes

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

Quarkus επίσης υποστηρίζει την αυτόματη παραγωγή Πόροι και προσφορές Kubernetes οδηγούς για ανάπτυξη σε πλατφόρμες Kubernetes και Red Hat OpenShift. Επιπλέον, το Quarkus δημιουργεί αυτόματα τα αρχεία Dockerfile.jvm (συσκευασία JVM) και Dockerfile.native (εγγενής δυαδική συσκευασία) που απαιτούνται για τη δημιουργία κοντέινερ.

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

Πίνακας 1. Χάρτης λειτουργικής αντιστοιχίας μεταξύ πλαισίων Java και Kubernetes.

Λειτουργικό
Παραδοσιακή ανοιξιάτικη μπότα
Kubernetes

Ανακάλυψη υπηρεσίας
Εύρηκα
DNS

διαμόρφωση
Spring Cloud Config
Διαμόρφωση Χαρτών/Μυστικών

Εξισορρόπηση φορτίου
Κορδέλα (πλευρά πελάτη)
Service, Replication Controller (από την πλευρά του διακομιστή)

Μεταγλώττιση και εκτέλεση του κώδικα από το παράδειγμα

Σε αυτό το άρθρο αναφερόμαστε παράδειγμα έργου, όπου τα API Spring και MicroProfile και ακόμη και η ίδια κλάση Java χρησιμοποιούνται μαζί. Ο κώδικας σε αυτό το παράδειγμα μπορεί να μεταγλωττιστεί και να εκτελεστεί από τη γραμμή εντολών, δείτε το αρχείο README.md για λεπτομέρειες.

Spring Framework API

Ενεση εξάρτησης

Το Quarkus υποστηρίζει μια σειρά από Contexts and Dependency Injection (CDI) API και Spring Dependency Injection (Spring DI) API. Εάν εργάζεστε με το MicroProfile, Java EE και Jakarta EE, τότε είστε ήδη πολύ εξοικειωμένοι με το CDI. Από την άλλη πλευρά, οι προγραμματιστές Spring μπορούν να χρησιμοποιήσουν το Quarkus Extension for Spring DI API για να επιτύχουν συμβατότητα με το Spring DI. Παραδείγματα χρήσης των υποστηριζόμενων Spring DI API δίνονται στον Πίνακα 2.

В έργο από το παράδειγμά μας Χρησιμοποιεί και CDI και Έγχυση εξάρτησης ελατηρίου. Περισσότερες πληροφορίες και παραδείγματα για αυτό το θέμα μπορείτε να βρείτε στον οδηγό Quarkus που ονομάζεται Οδηγός Spring DI.

Πίνακας 2. Παραδείγματα χρήσης των υποστηριζόμενων Spring DI API.

Υποστηριζόμενες λειτουργίες Spring DI
παραδείγματα

Constructor Injection

public PersonSpringController(
   PersonSpringRepository personRepository,  // injected      
   PersonSpringMPService personService) {    // injected
      this.personRepository = personRepository;
      this.personService = personService;
}

Έγχυση πεδίου
Αυτόματη καλωδίωση
αξία

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

@Value("${fallbackSalutation}")
String fallbackSalutation;

Φασόλι
@Διαμόρφωση

@Configuration
public class AppConfiguration {
   @Bean(name = "capitalizeFunction")
   public StringFunction capitalizer() {
      return String::toUpperCase;
   }
}

Συστατικό

@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
   @Override
   public String apply(String s) {
      return s;
   }
}

Υπηρεσία

@Service
public class MessageProducer {
   @Value("${greeting.message}")
   String message;

   public String getPrefix() {
      return message;
   }
}

Web πλαίσιο

Οι χρήστες του MicroProfile θα λατρέψουν ότι το Quarkus υποστηρίζει τα JAX-RS, MicroProfile Rest Client, JSON-P και JSON-B ως το κύριο μοντέλο προγραμματισμού ιστού. Οι προγραμματιστές Spring θα είναι ευχαριστημένοι με την πρόσφατη υποστήριξη του Quarkus για το Spring Web API, ιδιαίτερα τις διεπαφές REST. Παρόμοια με το Spring DI, ο κύριος στόχος της υποστήριξης Spring Web API είναι να επιτρέψει στους προγραμματιστές Spring να χρησιμοποιούν Spring Web API σε συνδυασμό με MicroProfile API. Παραδείγματα για τον τρόπο χρήσης των υποστηριζόμενων Spring Web API παρέχονται στον Πίνακα 3 και περισσότερες πληροφορίες και παραδείγματα σχετικά με αυτό το θέμα μπορείτε να βρείτε στο σεμινάριο Quarkus που ονομάζεται Ανοιξιάτικος Οδηγός Ιστού.

Πίνακας 3. Παραδείγματα χρήσης των υποστηριζόμενων Spring Web API.

Υποστηριζόμενες λειτουργίες ιστού Spring
παραδείγματα

@RestController
@RequestMapping

@RestController
@RequestMapping("/person")
public class PersonSpringController {
   ...
   ...
   ...
}

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (μερική)

@GetMapping(path = "/greet/{id}",
   produces = "text/plain")
   public String greetPerson(
   @PathVariable(name = "id") long id) {
   ...
   ...
   ...
}

Spring DataJPA

Οι χρήστες του MicroProfile θα εκτιμήσουν επίσης ότι το Quarkus υποστηρίζει JPA χρησιμοποιώντας το Hibernate ORM. Υπάρχουν επίσης καλά νέα για τους προγραμματιστές Spring: Το Quarkus υποστηρίζει κοινούς σχολιασμούς και τύπους Spring Data JPA. Παραδείγματα χρήσης των υποστηριζόμενων Spring Data JPA API δίνονται στον Πίνακα 4.
В έργο από το παράδειγμά μας Χρησιμοποιούνται Spring Data JPA API και περισσότερες πληροφορίες είναι διαθέσιμες στο σεμινάριο Quarkus που ονομάζεται Οδηγός JPA για τα Spring Data.

Πίνακας 4. Παραδείγματα χρήσης υποστηριζόμενων Spring Data JPA API.

Υποστηριζόμενες λειτουργίες Spring Data JPA
παραδείγματα

CrudRepository

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

ΑΠΟΘΕΤΗΡΙΟ
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Θραύσματα αποθήκης

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

Παράγωγες μέθοδοι ερωτήματος

public interface PersonRepository extends CrudRepository {

    List findByName(String name);
    
    Person findByNameBySsn(String ssn);
    
    Optional 
       findByNameBySsnIgnoreCase(String ssn);

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Ερωτήματα που καθορίζονται από τον χρήστη

public interface MovieRepository
         extends CrudRepository {

    Movie findFirstByOrderByDurationDesc();

    @Query("select m from Movie m where m.rating = ?1")
    Iterator findByRating(String rating);

    @Query("from Movie where title = ?1")
    Movie findByTitle(String title);
}

MicroProfile API

Ανοχή σε σφάλματα

Οι κατασκευές ανοχής σφαλμάτων είναι πολύ σημαντικές για την πρόληψη των διαδοχικών αστοχιών και τη δημιουργία αξιόπιστων αρχιτεκτονικών μικροϋπηρεσιών. Οι προγραμματιστές ελατηρίου χρησιμοποιούν διακόπτες κυκλώματος για ανοχή σφαλμάτων εδώ και πολλά χρόνια. Hystrix. Ωστόσο, το Hystrix δεν έχει ενημερωθεί εδώ και πολύ καιρό, αλλά το MicroProfile's Fault Tolerance αναπτύσσεται τώρα ενεργά και έχει πολλά χρόνια χρήσης παραγωγής πίσω του. Επομένως, για να βελτιωθεί η αξιοπιστία των υπηρεσιών στο Quarkus, συνιστάται η χρήση των MicroProfile Fault Tolerance API, παραδείγματα των οποίων χρησιμοποιούνται στον Πίνακα 5. Για περισσότερες πληροφορίες σχετικά με αυτό, ανατρέξτε στο εγχειρίδιο του Quarkus Οδηγός ανοχής σφαλμάτων.

Πίνακας 5. Παραδείγματα χρήσης υποστηριζόμενων API ανοχής σφαλμάτων MicroProfile.

Χαρακτηριστικά ανοχής σφαλμάτων MicroProfile
Περιγραφή
παραδείγματα

@Ασύγχρονη

Εκτέλεση λογικής σε ξεχωριστό νήμα

@Asynchronous
@Retry
public Future<String> getSalutation() {
   ...
   return future;
}

@Διάφραγμα

Περιορίστε τον αριθμό των ταυτόχρονων αιτημάτων

@Bulkhead(5)
public void fiveConcurrent() {
   makeRemoteCall(); //...
}

@CircuitBreaker

Έξυπνος χειρισμός αστοχιών και ανάκτηση από αστοχίες

@CircuitBreaker(delay=500   // milliseconds
   failureRatio = .75,
   requestVolumeThreshold = 20,
   successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

@Fallback

Κλήση εναλλακτικής λογικής σε περίπτωση αποτυχίας

@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

public String fallback() {
   return "hello";
}

Επανάληψη

Προσπαθήστε ξανά κατόπιν αποτυχίας αιτήματος

@Retry(maxRetries=3)
public String getSalutation() {
   makeRemoteCall(); //...
}

Χρονικό όριο

Λήξη χρονικού ορίου ελέγχου αποτυχίας

@Timeout(value = 500 )   // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

Έλεγχος υπηρεσιών (Υγεία υπηρεσιών)

Οι πλατφόρμες Kubernetes παρακολουθούν την υγεία των εμπορευματοκιβωτίων χρησιμοποιώντας ειδικές υπηρεσίες. Για να επιτρέπεται στην υποκείμενη πλατφόρμα να παρακολουθεί τις υπηρεσίες, οι προγραμματιστές Spring χρησιμοποιούν συνήθως έναν προσαρμοσμένο δείκτη Health και έναν ενεργοποιητή εκκίνησης ελατηρίου. Στο Quarkus, αυτό μπορεί να γίνει χρησιμοποιώντας το MicroProfile Health, το οποίο από προεπιλογή εκτελεί έναν έλεγχο ζωντανότητας, αλλά μπορεί να ρυθμιστεί για να ελέγχει ταυτόχρονα τη ζωντάνια και την ετοιμότητα. Παραδείγματα χρήσης των υποστηριζόμενων MicroProfile Health API παρέχονται στον Πίνακα 6 και πρόσθετες πληροφορίες παρέχονται στο εγχειρίδιο του Quarkus Οδηγός Υγείας.

Πίνακας 6: Παραδείγματα χρήσης υποστηριζόμενων API του MicroProfile Health.

Χαρακτηριστικά MicroProfile Health
Περιγραφή
παραδείγματα

@Ζωντανότητα

Η πλατφόρμα επανεκκινεί αποτυχημένες εφαρμογές με κοντέινερ
Τελικό σημείο:
host:8080/health/live

@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(ready ? true:false)
     .withData("mydata", data)
     .build();  
}

@Ετοιμότητα

Η πλατφόρμα δεν θα στέλνει επισκεψιμότητα σε εφαρμογές με κοντέινερ εάν δεν είναι έτοιμη
Τελικό σημείο:
host:8080/health/ready

@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(live ? true:false)
     .withData("mydata", data)
     .build();  
}

Μετρήσεις

Οι εφαρμογές παρέχουν μετρήσεις είτε για λειτουργικούς σκοπούς (για την παρακολούθηση των SLA απόδοσης) είτε για μη λειτουργικούς σκοπούς (επιχειρηματικές SLA). Οι προγραμματιστές Spring παρέχουν μετρήσεις χρησιμοποιώντας τον Ενεργοποιητή εκκίνησης και το Μικρόμετρο. Με τη σειρά του, το Quarkus χρησιμοποιεί το MicroProfile Metrics για να παρέχει μετρήσεις βάσης (JVM και λειτουργικό σύστημα), μετρήσεις προμηθευτών (Quarkus) και μετρήσεις εφαρμογών. Το MicroProfile Metrics απαιτεί η υλοποίηση να υποστηρίζει μορφές εξόδου JSON και OpenMetrics (Prometheus). Παραδείγματα χρήσης του MicroProfile Metrics API δίνονται στον Πίνακα 7.

В έργο από το παράδειγμά μας Οι μετρήσεις MicroProfile χρησιμοποιούνται για την παροχή μετρήσεων εφαρμογών. Για περισσότερες πληροφορίες, ανατρέξτε στο εγχειρίδιο του Quarkus Οδηγός μετρήσεων.

Πίνακας 7. Παραδείγματα χρήσης MicroProfile Metrics API.

Λειτουργίες μετρήσεων MicroProfile
Περιγραφή
παραδείγματα

@Μέτρητος

Υποδηλώνει έναν μετρητή που μετράει πόσες φορές έχει κληθεί ένα αντικείμενο με σχολιασμό

@Counted(name = "fallbackCounter", 
  displayName = "Fallback Counter", 
  description = "Fallback Counter")
public String salutationFallback() {
   return fallbackSalutation;
}

@ConcurrentGauge

Υποδηλώνει ένα μετρητή που μετρά τον αριθμό των ταυτόχρονων κλήσεων σε ένα σχολιασμένο αντικείμενο

@ConcurrentGuage(
  name = "fallbackConcurrentGauge", 
  displayName="Fallback Concurrent", 
  description="Fallback Concurrent")
public String salutationFallback() {
   return fallbackSalutation;
}

@Μετρητής

Υποδηλώνει έναν αισθητήρα μετρητή που μετρά την τιμή ενός σχολιασμένου αντικειμένου

@Metered(name = "FallbackGauge",
   displayName="Fallback Gauge",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

@Metered

Υποδηλώνει έναν αισθητήρα μετρητή που παρακολουθεί τη συχνότητα κλήσης ενός σχολιασμένου αντικειμένου

@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

Μετρικός

Ένας σχολιασμός που περιέχει πληροφορίες σχετικά με τα μεταδεδομένα όταν λαμβάνεται ένα αίτημα για εισαγωγή ή παραγωγή μιας μέτρησης

@Metric
@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

Χρονικά

Υποδεικνύει ένα χρονόμετρο που παρακολουθεί τη διάρκεια ενός σχολιασμένου αντικειμένου

@Timed(name = "TimedFallback",
   displayName="Timed Fallback",
   description="Fallback delay")
public String salutationFallback() {
   return fallbackSalutation;
}

Τελικά σημεία μετρήσεων

Μετρήσεις εφαρμογής localhost:8080/μετρήσεις/εφαρμογή
Βασικές μετρήσεις localhost:8080/μετρικά/βάση
Μετρήσεις προμηθευτή localhost:8080/μετρικά/προμηθευτής
Όλες οι μετρήσεις localhost:8080/μετρικά

MicroProfile Rest Client

Οι μικροϋπηρεσίες παρέχουν συχνά τελικά σημεία RESTful που απαιτούν αντίστοιχα API πελατών για να λειτουργήσουν. Για να χρησιμοποιήσουν τα τελικά σημεία RESTful, οι προγραμματιστές Spring συνήθως χρησιμοποιούν το RestTemplate. Το Quarkus προσφέρει MicroProfile Rest Client API για την επίλυση αυτού του προβλήματος, παραδείγματα χρήσης των οποίων δίνονται στον Πίνακα 8.

В έργο από το παράδειγμά μας η χρήση των τελικών σημείων RESTful γίνεται με χρήση του προγράμματος-πελάτη ανάπαυσης MicroProfile. Περισσότερες πληροφορίες και παραδείγματα για αυτό το θέμα μπορείτε να βρείτε στο εγχειρίδιο Quarkus Οδηγός ανάπαυσης πελάτη.

Πίνακας 8. Παραδείγματα χρήσης MicroProfile Rest Client API.

Λειτουργίες πελάτη MicroProfile Rest
Περιγραφή
παραδείγματα

@RegisterRestClient

Καταχωρεί μια πληκτρολογημένη διεπαφή Java ως πελάτη REST

@RegisterRestClient
@Path("/")
public interface MyRestClient {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getSalutation();
}

@RestClient

Επισημαίνει την υλοποίηση μιας παρουσίας μιας πληκτρολογημένης διεπαφής πελάτη REST

@Autowired // or @Inject
@RestClient
MyRestClient restClient;

Επίκληση

Καλεί ένα τελικό σημείο REST

System.out.println(
   restClient.getSalutation());

mp-rest/url

Καθορίζει το τελικό σημείο REST

application.properties:
org.example.MyRestClient/mp-rest/url=
   http://localhost:8081/myendpoint

Αποτελέσματα της

Σε αυτό το ιστολόγιο, που απευθύνεται κυρίως σε προγραμματιστές Spring, ρίξαμε μια γρήγορη ματιά στον τρόπο χρήσης των Spring API με τα API MicroProfile στο Quarkus για την ανάπτυξη μικροϋπηρεσιών Java και στη συνέχεια τη μεταγλώττιση τους σε εγγενή δυαδικό κώδικα που εξοικονομεί εκατοντάδες megabyte μνήμης RAM και εκκινεί σε θέμα χιλιοστών του δευτερολέπτου.

Όπως έχετε ήδη καταλάβει, περισσότερες πληροφορίες σχετικά με την υποστήριξη για τα Spring και MicroProfile API, καθώς και πολλές άλλες χρήσιμες πληροφορίες, μπορείτε να βρείτε στο Εγχειρίδια Quarkus.

Πηγή: www.habr.com

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