Hoe Quarkus MicroProfile en Spring combineert

Hallo allemaal en welkom bij de derde post in de Quarkus-serie!

Hoe Quarkus MicroProfile en Spring combineert

Bij het ontwikkelen van Java-microservices wordt er vaak vanuit gegaan dat Eclipse-microprofiel и Lente laars – dit zijn afzonderlijke en onafhankelijke API’s. Programmeurs gebruiken standaard de API's waar ze al aan gewend zijn, omdat het leren van nieuwe frameworks en runtime-componenten veel tijd kost. Vandaag zullen we proberen de ontwikkeling van enkele populaire MicroProfile API voor Spring-ontwikkelaars en laten zien hoe je zowel de Spring API als nieuwe handige functies tegelijkertijd kunt gebruiken kwark.

We gaan eerst wat uitgebreider in op de omvang 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 introduceren we de MicroProfile API, die handig is voor Spring-ontwikkelaars bij het bouwen van microservices.

Waarom Quarkus? Ten eerste is er sprake van live-codering, dat wil zeggen het automatisch opnieuw laden van alle wijzigingen in de MicroProfile API, Spring API en andere Java API's, wat gebeurt met slechts één opdracht: mvn quarkus:dev. In de tweede plaats degene die in overweging wordt genomen in ons voorbeeld De Person-service (die wordt gecompileerd vanuit de Spring-, MicroProfile- en JPA-API's naar een binair bestand met behulp van een native GraalVM-image) start in slechts 0.055 seconden en neemt ongeveer 90 MB in beslag in het geheugen (RSS) op het RESTful-toepassingseindpunt. Bovendien wordt de compilatie zelf uitgevoerd met slechts één opdracht: mvn package -Pnative.

We gaan niet in op de details van MicroProfile, maar we proberen Spring-ontwikkelaars te helpen begrijpen hoe Spring API's samen met MicroProfile API's in Quarkus kunnen worden gebruikt.

Containers en Kubernetes

Om dit artikel niet te vol te maken, bespreken we hier alleen de belangrijkste aspecten van ondersteuning. Kubernetes, omdat het belangrijk is om te begrijpen. Quarkus wordt 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 de dichtheid ervan op de host te vergroten en de totale kosten te verlagen.

Quarkus ook ondersteunt autogeneratie Kubernetes-bronnen en -aanbiedingen gidsen over implementatie op Kubernetes- en Red Hat OpenShift-platformen. Daarnaast genereert Quarkus automatisch de bestanden Dockerfile.jvm (JVM-verpakking) en Dockerfile.native (native binaire verpakking) die nodig zijn om containers te maken.

Ten slotte gebruikt Quarkus, door Kubernetes als doelimplementatieomgeving te kiezen, geen Java-frameworks in gevallen waarin vergelijkbare functionaliteit al op het Kubernetes-platformniveau zelf is geïmplementeerd. Tabel 1 biedt een functionele koppeling 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
Configuratiekaarten / Geheimen

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

De voorbeeldcode compileren en uitvoeren

In dit artikel verwijzen we naar voorbeeldproject, waar de Spring en MicroProfile API's samen worden gebruikt, en zelfs dezelfde Java-klasse. 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 breed scala aan 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 bent u al bekend met CDI. Spring-ontwikkelaars kunnen daarentegen de Quarkus Extension voor Spring DI API gebruiken om compatibiliteit met Spring DI te garanderen. Voorbeelden van het gebruik van de ondersteunde Spring DI API's vindt u in Tabel 2.

В project van ons voorbeeld Zowel CDI als Spring Dependency Injection worden gebruikt. Meer informatie en voorbeelden over dit onderwerp vindt u in de Quarkus-handleiding genaamd Spring 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;
   }
}

Diensten

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

   public String getPrefix() {
      return message;
   }
}

Webframework

Gebruikers van MicroProfile zullen het waarderen dat Quarkus JAX-RS, MicroProfile Rest Client, JSON-P en JSON-B ondersteunt als primair webprogrammeermodel. Spring-ontwikkelaars zullen blij zijn om te horen dat Quarkus onlangs ondersteuning heeft toegevoegd voor de Spring Web API, met name de REST-gerelateerde interfaces. Net als bij Spring DI is het hoofddoel van de Spring Web API-ondersteuning om Spring-ontwikkelaars de mogelijkheid te bieden om Spring Web API's te gebruiken in combinatie met MicroProfile API's. Voorbeelden van het gebruik van de ondersteunde Spring Web API's worden gegeven in Tabel 3. Meer informatie en voorbeelden over dit onderwerp vindt u in de Quarkus-handleiding genaamd Spring Webgids.

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

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

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PadVariabele
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (gedeeltelijk)

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

Lente gegevens JPA

Gebruikers van MicroProfile zullen ook blij zijn met de ondersteuning die Quarkus biedt voor JPA met 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 vindt u in Tabel 4.
В project van ons voorbeeld Er wordt gebruik gemaakt van Spring Data JPA API's en meer informatie is beschikbaar in de Quarkus-gids genaamd Spring Data JPA-handleiding.

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

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

CrudRepository

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

bewaarplaats
JpaRepository
Paging- en sorteringsrepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repository Fragmenten

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

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 essentieel om opeenvolgende fouten te voorkomen en robuuste microservicearchitecturen te bouwen. Spring-ontwikkelaars gebruiken al jaren circuit-breakers voor fouttolerantie hystrix. Hystrix is ​​echter al geruime tijd niet meer bijgewerkt, terwijl de Fault Tolerance van MicroProfile momenteel actief in ontwikkeling is en al enkele jaren in productie is. Om de betrouwbaarheid van de services in Quarkus te verbeteren, wordt daarom aanbevolen de MicroProfile Fault Tolerance API's te gebruiken, waarvan voorbeelden in Tabel 5 worden gegeven. Meer informatie hierover vindt u in de Quarkus-handleiding. Fouttolerantiegids.

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

MicroProfile fouttolerantiefuncties
beschrijving
Примеры

@Asynchronous

Logica uitvoeren in een aparte thread

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

@Bulkhead

Beperking van het aantal gelijktijdige verzoeken

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

@CircuitBreaker

Slimme storingsafhandeling en storingsherstel

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

@Terugval

Alternatieve logica aanroepen bij een storing

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

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

Opnieuw proberen

Opnieuw proberen bij mislukte aanvraag

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

Timeout

Time-out voor foutbewaking

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

Service Gezondheidscontrole

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

Tabel 6. Voorbeelden van het gebruik van de ondersteunde MicroProfile Health API's.

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

@Liveness

Het platform start kapotte containertoepassingen 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 een containertoepassing als deze nog niet gereed 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

Toepassingen leveren statistieken voor operationele doeleinden (het bewaken van SLA-prestatiegegevens) en voor niet-operationele doeleinden (bedrijfs-SLA-gegevens). Spring-ontwikkelaars leveren meetgegevens met behulp van Spring Boot Actuator en Micrometer. Quarkus gebruikt op zijn beurt MicroProfile Metrics om basismetrieken (JVM en OS), leveranciersmetrieken (Quarkus) en applicatiemetrieken te leveren. Voor MicroProfile Metrics is het vereist dat de implementatie JSON- en OpenMetrics- (Prometheus) uitvoerformaten ondersteunt. Voorbeelden van het gebruik van de MicroProfile Metrics API vindt u in Tabel 7.

В project van ons voorbeeld MicroProfile Metrics worden gebruikt om applicatiemetriek te verstrekken. Raadpleeg de Quarkus-handleiding voor meer informatie. Metriekgids.

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

Functies van MicroProfile Metrics
beschrijving
Примеры

@Geteld

Geeft een teller aan die bijhoudt hoe vaak het geannoteerde object wordt aangeroepen.

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

@ConcurrentGauge

Geeft een meter aan die het aantal parallelle aanroepen naar het geannoteerde object telt.

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

@Graadmeter

Geeft een maatstaf aan die de waarde van het geannoteerde object meet.

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

@Metered

Geeft een meter aan die de frequentie van het aanroepen van een geannoteerd object bijhoudt.

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

metrisch

Annotatie met informatie over metagegevens wanneer een verzoek wordt ontvangen om een ​​metrische gegevens 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 het geannoteerde object bijhoudt.

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

Metriek-eindpunten

Toepassingsmetrieken localhost:8080/metriek/applicatie
Basismetrieken localhost:8080/metriek/basis
Leveranciersstatistieken localhost:8080/metrics/leverancier
Alle statistieken localhost:8080/metriek

MicroProfile Rest-client

Microservices stellen vaak RESTful-eindpunten beschikbaar waarvoor de bijbehorende client-API's moeten worden gebruikt. Om RESTful-eindpunten te gebruiken, gebruiken Spring-ontwikkelaars doorgaans de RestTemplate. Quarkus biedt de MicroProfile Rest Client API-interfaces om dit probleem op te lossen. Voorbeelden van het gebruik hiervan vindt u in Tabel 8.

В project van ons voorbeeld RESTful-eindpunten worden gebruikt via MicroProfile Rest Client. Meer informatie en voorbeelden over dit onderwerp vindt u in de Quarkus-handleiding Rest Client-handleiding.

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 injectie 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

Geeft een REST-eindpunt op

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

Resultaten van

In deze blog, die voornamelijk bedoeld is voor Spring-ontwikkelaars, hebben we kort gekeken naar hoe Quarkus Spring API's samen met MicroProfile API's gebruikt om Java-microservices te ontwikkelen en deze vervolgens te compileren naar native binaries die honderden megabytes RAM besparen en binnen milliseconden opstarten.

Zoals u kunt zien, kunt u meer informatie over Spring en MicroProfile API-ondersteuning, evenals veel andere nuttige informatie, vinden in Quarkus-handleidingen.

Bron: www.habr.com

Voeg een reactie