Hoe Quarkus MicroProfile en Spring combineert

Hallo allemaal, hier is het derde bericht in de Quarkus-serie!

Hoe Quarkus MicroProfile en Spring combineert

Bij het ontwikkelen van Java-microservices wordt dat vaak gedacht Eclipse-microprofiel и Lente laars zijn afzonderlijke en onafhankelijke API's. Standaard hebben programmeurs de neiging om de API's te gebruiken waaraan ze al gewend zijn, omdat het leren van nieuwe frameworks en runtime-componenten veel tijd kost. Vandaag zullen we proberen de ontwikkeling van enkele populaire te vereenvoudigen MicroProfile API voor Spring-ontwikkelaars en laat u zien hoe u tegelijkertijd de Spring API en nieuwe handige functies kunt gebruiken kwark.

In wat meer detail zullen we eerst kijken naar de reikwijdte en details van hoe Quarkus Spring API's ondersteunt om Spring-ontwikkelaars te laten zien hoe ze de MicroProfile API in hun dagelijkse werk kunnen gebruiken. Vervolgens bespreken we de MicroProfile API's, die handig zijn voor Spring-ontwikkelaars bij het maken van microservices.

Waarom Quarkus? Ten eerste is dit live codering, dat wil zeggen het automatisch opnieuw laden van eventuele wijzigingen in de MicroProfile API, Spring API en andere Java API's, die wordt uitgevoerd met slechts één opdracht: mvn quarkus:dev. In de tweede plaats besproken in in ons voorbeeld de Person-service (die compileert van Spring-, MicroProfile- en JPA-API's naar een binair bestand met behulp van de native GraalVM-image) start in slechts 0.055 seconden en neemt ongeveer 90 MB RAM (RSS) in beslag op het RESTful-applicatie-eindpunt. Bovendien wordt de compilatie zelf uitgevoerd met slechts één commando: mvn package -Pnative.

We zullen niet in detail ingaan op MicroProfile, behalve om Spring-ontwikkelaars te helpen begrijpen hoe ze Spring API's kunnen gebruiken met MicroProfile API's in Quarkus.

Containers en Kubernetes

Om dit artikel eenvoudig te houden, bespreken we hier alleen de hogere aspecten van ondersteuning. Kubernetes, omdat het belangrijk is om het te begrijpen. Quarkus is gepositioneerd als een Java-stack voor Kubernetes. Het is ontworpen om het geheugenverbruik en de opstarttijd van Java-applicaties en -services te minimaliseren, en als gevolg daarvan hun dichtheid op de host te vergroten en de totale kosten te verlagen.

Quarkus ook ondersteunt automatische generatie Kubernetes-bronnen en -aanbiedingen gidsen voor implementatie op Kubernetes- en Red Hat OpenShift-platforms. Bovendien genereert Quarkus automatisch de bestanden Dockerfile.jvm (JVM-verpakking) en Dockerfile.native (native binaire verpakking) die nodig zijn om containers te maken.

Door zich te concentreren op Kubernetes als de beoogde implementatieomgeving, maakt Quarkus ten slotte geen gebruik van Java-frameworks in gevallen waarin vergelijkbare functionaliteit wordt geïmplementeerd op het niveau van het Kubernetes-platform zelf. Tabel 1 geeft een kaart van de functionele correspondentie tussen Kubernetes en typische Java-frameworks die door Spring-ontwikkelaars worden gebruikt.

Tabel 1. Kaart van functionele correspondentie tussen Java-frameworks en Kubernetes.

functioneel
Traditionele lentelaars
Kubernetes

Service ontdekken
Eureka
DNS

Configuratie
Spring Cloud-configuratie
Kaarten/geheimen configureren

Load balancing
Lint (clientzijde)
Service, replicatiecontroller (serverzijde)

Het compileren en uitvoeren van de code uit het voorbeeld

In dit artikel verwijzen wij naar voorbeeldproject, waarbij de Spring- en MicroProfile-API's en zelfs dezelfde Java-klasse samen worden gebruikt. De code in dit voorbeeld kan worden gecompileerd en uitgevoerd vanaf de opdrachtregel. Zie het bestand README.md voor meer informatie.

Spring Framework-API's

Afhankelijkheid injectie

Quarkus ondersteunt een reeks van Contexten en Dependency Injection (CDI) API's en Spring Dependency Injection (Spring DI) API's. Als u met MicroProfile werkt, Java EE en Jakarta EE, dan ben je al goed bekend met CDI. Aan de andere kant kunnen Spring-ontwikkelaars de Quarkus Extension for Spring DI API gebruiken om compatibiliteit met Spring DI te bereiken. Voorbeelden van het gebruik van de ondersteunde Spring DI API's worden gegeven in Tabel 2.

В project uit ons voorbeeld Maakt gebruik van zowel CDI als Spring Dependency Injection. Voor meer informatie en voorbeelden over dit onderwerp, zie de Quarkus-handleiding genaamd Lente DI-gids.

Tabel 2. Voorbeelden van het gebruik van de ondersteunde Spring DI API's.

Ondersteunde Spring DI-functies
Примеры

Constructor-injectie

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

Veldinjectie
Automatisch bedraad
Waarde

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Boon
@Configuratie

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

Bestanddeel

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

Service

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

   public String getPrefix() {
      return message;
   }
}

Webframework

MicroProfile-gebruikers zullen het geweldig vinden dat Quarkus JAX-RS, MicroProfile Rest Client, JSON-P en JSON-B ondersteunt als het primaire webprogrammeermodel. Spring-ontwikkelaars zullen blij zijn met de recente ondersteuning van Quarkus voor de Spring Web API, in het bijzonder REST-interfaces. Net als bij Spring DI is het belangrijkste doel van Spring Web API-ondersteuning om Spring-ontwikkelaars in staat te stellen Spring Web API's te gebruiken in combinatie met MicroProfile API's. Voorbeelden van het gebruik van de ondersteunde Spring Web API's vindt u in Tabel 3, en meer informatie en voorbeelden over dit onderwerp kunt u vinden in de Quarkus-tutorial genaamd Lente webgids.

Tabel 3. Voorbeelden van het gebruik van de ondersteunde Spring Web API's.

Ondersteunde Spring Web-functies
Примеры

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariabele
@PathVariabele
@CookieWaarde
@RequestBody
@ReactieStatus
@ExceptionHandler
@RestControllerAdvice (gedeeltelijk)

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

Lente gegevens JPA

MicroProfile-gebruikers zullen het ook waarderen dat Quarkus JPA ondersteunt met behulp van de Hibernate ORM. Er is ook goed nieuws voor Spring-ontwikkelaars: Quarkus ondersteunt algemene Spring Data JPA-annotaties en -typen. Voorbeelden van het gebruik van de ondersteunde Spring Data JPA API's worden gegeven in Tabel 4.
В project uit ons voorbeeld Er wordt gebruik gemaakt van Spring Data JPA API's en meer informatie is beschikbaar in de Quarkus-tutorial genaamd Spring Data JPA-gids.

Tabel 4. Voorbeelden van het gebruik van ondersteunde Spring Data JPA API's.

Ondersteunde Spring Data JPA-functies
Примеры

CrudRepository

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

bewaarplaats
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Bewaarplaatsfragmenten

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

Afgeleide querymethoden

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Door de gebruiker gedefinieerde zoekopdrachten

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's

Fouttolerantie

Fouttolerantieconstructies zijn erg belangrijk voor het voorkomen van trapsgewijze fouten en het creëren van betrouwbare microservice-architecturen. Spring-ontwikkelaars gebruiken al jaren stroomonderbrekers voor fouttolerantie. hystrix. Hystrix is ​​echter al een hele tijd niet meer bijgewerkt, maar de Fault Tolerance van MicroProfile is nu actief in ontwikkeling en heeft een aantal jaren productiegebruik achter de rug. Om de betrouwbaarheid van services in Quarkus te verbeteren, wordt daarom aanbevolen om de MicroProfile Fault Tolerance API's te gebruiken, waarvan voorbeelden worden gebruikt in Tabel 5. Zie voor meer informatie hierover de Quarkus-handleiding Gids voor fouttolerantie.

Tabel 5. Voorbeelden van het gebruik van ondersteunde MicroProfile Fault Tolerance API's.

MicroProfile-fouttolerantiefuncties
beschrijving
Примеры

@Asynchroon

Logica uitvoeren in een aparte thread

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

@ Schot

Beperk het aantal gelijktijdige verzoeken

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

@Zekering

Slimme storingsafhandeling en herstel na storingen

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

@Terugvallen

Alternatieve logica oproepen in geval van een storing

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

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

Opnieuw proberen

Opnieuw proberen na mislukte aanvraag

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

Timeout

Time-out voor foutcontrole

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

Services controleren (Servicestatus)

Kubernetes-platforms monitoren de gezondheid van containers met behulp van speciale services. Om het onderliggende platform in staat te stellen services te monitoren, gebruiken Spring-ontwikkelaars doorgaans een aangepaste HealthIndicator en Spring Boot Actuator. In Quarkus kan dit worden gedaan met behulp van MicroProfile Health, dat standaard een liveness-check uitvoert, maar kan worden geconfigureerd om tegelijkertijd de liveness en gereedheid te controleren. Voorbeelden van het gebruik van de ondersteunde MicroProfile Health API's vindt u in Tabel 6, en aanvullende informatie vindt u in de Quarkus-handleiding Gezondheidsgids.

Tabel 6: Gebruiksvoorbeelden van ondersteunde MicroProfile Health API's.

MicroProfile Health-functies
beschrijving
Примеры

@Levendigheid

Het platform start mislukte containerapplicaties opnieuw op
eindpunt:
host:8080/gezondheid/live

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

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

@Gereedheid

Het platform stuurt geen verkeer naar gecontaineriseerde applicaties als het er niet klaar voor is
eindpunt:
host:8080/gezondheid/klaar

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

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

statistieken

Applicaties bieden statistieken voor operationele doeleinden (om prestatie-SLA's te bewaken) of voor niet-operationele doeleinden (zakelijke SLA's). Spring-ontwikkelaars bieden statistieken met behulp van Spring Boot Actuator en Micrometer. Op zijn beurt gebruikt Quarkus MicroProfile Metrics om basisgegevens (JVM en besturingssysteem), leveranciersstatistieken (Quarkus) en applicatiestatistieken te leveren. MicroProfile Metrics vereist dat de implementatie de uitvoerformaten JSON en OpenMetrics (Prometheus) ondersteunt. Voorbeelden van het gebruik van de MicroProfile Metrics API worden gegeven in Tabel 7.

В project uit ons voorbeeld MicroProfile Metrics worden gebruikt om applicatiestatistieken te verstrekken. Zie de Quarkus-handleiding voor meer informatie Handleiding voor statistieken.

Tabel 7. Voorbeelden van het gebruik van MicroProfile Metrics-API's.

Functies voor microprofielstatistieken
beschrijving
Примеры

@geteld

Geeft een teller aan die het aantal keren telt dat een geannoteerd object is aangeroepen

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

@ConcurrentGauge

Geeft een meter aan die het aantal gelijktijdige oproepen naar een geannoteerd object telt

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

@Graadmeter

Geeft een metersensor aan die de waarde van een geannoteerd object meet

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

@Metered

Geeft een metersensor aan die de oproepfrequentie van een geannoteerd object bewaakt

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

metrisch

Een annotatie met informatie over metagegevens wanneer een verzoek wordt ontvangen om een ​​metriek in te voeren of te produceren

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

Timed

Geeft een timer aan die de duur van een geannoteerd object bijhoudt

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

Eindpunten van statistieken

Applicatiestatistieken localhost:8080/statistieken/toepassing
Basisstatistieken localhost:8080/statistieken/basis
Leverancierstatistieken localhost:8080/statistieken/leverancier
Alle statistieken localhost:8080/statistieken

MicroProfile Rest-client

Microservices bieden vaak RESTful-eindpunten waarvoor overeenkomstige client-API's nodig zijn om mee te werken. Om RESTful-eindpunten te gebruiken, gebruiken Spring-ontwikkelaars doorgaans RestTemplate. Quarkus biedt MicroProfile Rest Client API's aan om dit probleem op te lossen; voorbeelden van gebruik hiervan worden gegeven in Tabel 8.

В project uit ons voorbeeld het gebruik van RESTful endpoints gebeurt met behulp van de MicroProfile Rest Client. Meer informatie en voorbeelden over dit onderwerp vindt u in de Quarkus-handleiding Rust klantengids.

Tabel 8. Voorbeelden van het gebruik van MicroProfile Rest Client API's.

MicroProfile Rest Client-functies
beschrijving
Примеры

@RegisterRestClient

Registreert een getypte Java-interface als een REST-client

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

@RestClient

Markeert de implementatie van een exemplaar van een getypte REST-clientinterface

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

Aanroeping

Roept een REST-eindpunt aan

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

mp-rest/url

Specificeert het REST-eindpunt

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

Resultaten van

In deze blog, die vooral gericht is op Spring-ontwikkelaars, hebben we kort gekeken hoe je de Spring API's met de MicroProfile API's in Quarkus kunt gebruiken om Java-microservices te ontwikkelen en deze vervolgens te compileren in native binaire code die honderden megabytes RAM bespaart en in een kwestie van milliseconden.

Zoals u al heeft begrepen, kunt u meer informatie over ondersteuning voor de Spring- en MicroProfile-API's, evenals veel andere nuttige informatie, vinden in Quarkus-handleidingen.

Bron: www.habr.com

Voeg een reactie