Hur Quarkus kombinerar MicroProfile och Spring

Hej alla, här är det tredje inlägget i Quarkus-serien!

Hur Quarkus kombinerar MicroProfile och Spring

När man utvecklar Java-mikrotjänster tror man ofta att Eclipse MicroProfile и Fjäderkänga är separata och oberoende API:er. Som standard tenderar programmerare att använda de API:er de redan är vana vid, eftersom att lära sig nya ramverk och runtime-komponenter tar mycket tid. Idag kommer vi att försöka förenkla utvecklingen av några populära MicroProfile API för Spring-utvecklare och visa dig hur du samtidigt använder Spring API och nya användbara funktioner quarkus.

I lite mer detalj kommer vi först att titta på omfattningen och detaljerna om hur Quarkus stöder Spring API:er för att visa Spring-utvecklare hur man använder MicroProfile API i sitt dagliga arbete. Sedan kommer vi att täcka MicroProfile API, som är användbara för Spring-utvecklare när de skapar mikrotjänster.

Varför Quarkus? För det första är detta livekodning, det vill säga automatisk omladdning av eventuella ändringar i MicroProfile API, Spring API och andra Java API:er, som utförs med bara ett kommando: mvn quarkus:dev. För det andra diskuteras i i vårt exempel tjänsten Person (som kompilerar från Spring, MicroProfile och JPA API:er till en binär med den inbyggda GraalVM-bilden) startar på bara 0.055 sekunder och tar upp cirka 90 MB RAM (RSS) på RESTful-applikationens slutpunkt. Dessutom utförs själva kompileringen med bara ett kommando: mvn package -Pnative.

Vi kommer inte att gå in på detaljer om MicroProfile, annat än att hjälpa Spring-utvecklare att förstå hur de kan använda Spring API:er med MicroProfile API:er i Quarkus.

Containers och Kubernetes

För att hålla den här artikeln enkel kommer vi bara att täcka de höga aspekterna av support här. Kubernetes, för det är viktigt att förstå. Quarkus är placerad som en Java-stack för Kubernetes, den är utformad för att minimera minnesförbrukning och starttid för Java-applikationer och -tjänster, och som ett resultat öka deras täthet på värden och minska de totala kostnaderna.

Quarkus också stöder automatisk generering Kubernetes resurser och erbjudanden guider för distribution på Kubernetes och Red Hat OpenShift-plattformar. Dessutom genererar Quarkus automatiskt filerna Dockerfile.jvm (JVM-paketering) och Dockerfile.native (native binära förpackningar) som behövs för att skapa behållare.

Slutligen, genom att fokusera på Kubernetes som måldistributionsmiljön, använder Quarkus inte Java-ramverk i de fall där liknande funktionalitet implementeras på Kubernetes-plattformens nivå. Tabell 1 ger en karta över den funktionella överensstämmelsen mellan Kubernetes och typiska Java-ramverk som används av Spring-utvecklare.

Tabell 1. Karta över funktionell överensstämmelse mellan Java-ramverk och Kubernetes.

funktionell
Traditionell vårkänga
Kubernetes

Service upptäckt
Eureka
DNS

konfiguration
Spring Cloud Config
Konfigurera kartor/hemligheter

Lastbalansering
Band (klientsidan)
Service, Replikeringskontroller (serversidan)

Kompilera och köra koden från exemplet

I den här artikeln hänvisar vi till exempelprojekt, där Spring och MicroProfile API:er och till och med samma Java-klass används tillsammans. Koden i det här exemplet kan kompileras och köras från kommandoraden, se filen README.md för detaljer.

Spring Framework API:er

Beroende på injektion

Quarkus stöder en rad Contexts and Dependency Injection (CDI) API:er och Spring Dependency Injection (Spring DI) API:er. Om du arbetar med MicroProfile, Java EE och Jakarta EE, då är du redan mycket bekant med CDI. Å andra sidan kan Spring-utvecklare använda Quarkus Extension for Spring DI API för att uppnå kompatibilitet med Spring DI. Exempel på användning av Spring DI API:er som stöds ges i Tabell 2.

В projekt från vårt exempel Använder både CDI och Spring Dependency Injection. För mer information och exempel om detta ämne, se Quarkus-guiden som heter Spring DI Guide.

Tabell 2. Exempel på användning av Spring DI API:er som stöds.

Fjäder DI-funktioner som stöds
Примеры

Konstruktörinsprutning

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

Fältinjektion
Autowired
Värde

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Böna
@Konfiguration

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

Komponent

@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;
   }
}

Web ramverk

MicroProfile-användare kommer att älska att Quarkus stöder JAX-RS, MicroProfile Rest Client, JSON-P och JSON-B som den primära webbprogrammeringsmodellen. Spring-utvecklare kommer att vara nöjda med Quarkus senaste stöd för Spring Web API, särskilt REST-gränssnitt. I likhet med Spring DI är huvudmålet med Spring Web API-stöd att göra det möjligt för Spring-utvecklare att använda Spring Web API:er tillsammans med MicroProfile API:er. Exempel på hur man använder Spring Web API:er som stöds finns i Tabell 3, och mer information och exempel om detta ämne finns i Quarkus handledning som heter Vårens webbguide.

Tabell 3. Exempel på användning av Spring Web API:er som stöds.

Våra webbfunktioner som stöds
Примеры

@RestController
@RequestMapping

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

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

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

Vårdata JPA

MicroProfile-användare kommer också att uppskatta att Quarkus stöder JPA med Hibernate ORM. Det finns också goda nyheter för Spring-utvecklare: Quarkus stöder vanliga Spring Data JPA-anteckningar och typer. Exempel på användning av Spring Data JPA API:er som stöds ges i tabell 4.
В projekt från vårt exempel Spring Data JPA API:er används och mer information finns tillgänglig i Quarkus handledning som heter Spring Data JPA Guide.

Tabell 4. Exempel på användning av Spring Data JPA API:er som stöds.

Fjäderdata JPA-funktioner som stöds
Примеры

CrudRepository

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

förvaret
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Förvarsfragment

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

Härledda frågemetoder

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Användardefinierade frågor

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:er

Feltolerans

Feltoleranskonstruktioner är mycket viktiga för att förhindra kaskadfel och skapa pålitliga mikrotjänstarkitekturer. Fjäderutvecklare har använt effektbrytare för feltolerans i många år. hystrix. Hystrix har dock inte uppdaterats på länge, men MicroProfiles Fault Tolerance utvecklas nu aktivt och har flera års produktionsanvändning bakom sig. För att förbättra tillförlitligheten hos tjänsterna i Quarkus rekommenderas det därför att använda MicroProfile Fault Tolerance APIs, vars exempel används i Tabell 5. För mer information om detta, se Quarkus-manualen Feltoleransguide.

Tabell 5. Exempel på användning av MicroProfile Fault Tolerance API:er som stöds.

MicroProfile Feltoleransfunktioner
beskrivning
Примеры

@Asynkron

Utför logik i en separat tråd

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

@Skott

Begränsa antalet samtidiga förfrågningar

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

@Strömbrytare

Smart felhantering och återhämtning från fel

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

@Retirera

Anropar alternativ logik vid fel

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

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

Försök igen

Försök igen på begäran misslyckande

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

Timeout

Tidsgräns för felkontroll

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

Kontrolltjänster (Service Health)

Kubernetes-plattformar övervakar tillståndet hos containrar med hjälp av speciella tjänster. För att tillåta den underliggande plattformen att övervaka tjänster, använder Spring-utvecklare vanligtvis en anpassad HealthIndicator och Spring Boot Actuator. I Quarkus kan detta göras med hjälp av MicroProfile Health, som som standard utför en liveness-kontroll, men kan konfigureras för att samtidigt kontrollera liveness och beredskap. Exempel på hur man använder de stödda MicroProfile Health API:erna finns i Tabell 6, och ytterligare information finns i Quarkus manual Hälsoguide.

Tabell 6: Användningsexempel på MicroProfile Health API:er som stöds.

MicroProfile Health-funktioner
beskrivning
Примеры

@Livighet

Plattformen startar om misslyckade containeriserade applikationer
Slutpunkt:
värd:8080/hälsa/live

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

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

@Beredskap

Plattformen kommer inte att skicka trafik till containeriserade applikationer om den inte är klar
Slutpunkt:
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();  
}

Metrik

Applikationer tillhandahåller mätvärden för antingen operativa ändamål (för att övervaka prestanda-SLA) eller icke-operativa ändamål (affärs-SLA). Spring-utvecklare tillhandahåller mätvärden med hjälp av Spring Boot Actuator och Micrometer. Quarkus använder i sin tur MicroProfile Metrics för att tillhandahålla baslinjemått (JVM och operativsystem), leverantörsmått (Quarkus) och applikationsmått. MicroProfile Metrics kräver att implementeringen stöder JSON och OpenMetrics (Prometheus) utdataformat. Exempel på användning av MicroProfile Metrics API ges i Tabell 7.

В projekt från vårt exempel MicroProfile Metrics används för att tillhandahålla programmått. För mer information, se Quarkus manual Mätvärdesguide.

Tabell 7. Exempel på användning av MicroProfile Metrics API:er.

MicroProfile Metrics funktioner
beskrivning
Примеры

@Räknat

Betecknar en räknare som räknar antalet gånger ett kommenterat objekt har anropats

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

@ConcurrentGauge

Betecknar en mätare som räknar antalet samtidiga anrop till ett kommenterat objekt

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

@Mätare

Betecknar en mätsensor som mäter värdet på ett kommenterat objekt

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

@Mätad

Betecknar en mätarsensor som övervakar samtalsfrekvensen för ett kommenterat objekt

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

metrisk

En anteckning som innehåller information om metadata när en begäran tas emot om att ange eller producera ett mått

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

Timed

Indikerar en timer som spårar varaktigheten av ett kommenterat objekt

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

Mätvärdes slutpunkter

Applikationsstatistik lokalvärd:8080/metrics/applikation
Grundläggande mått lokalvärd:8080/metrics/base
Leverantörsmått lokalvärd:8080/metrics/leverantör
Alla mätvärden lokalvärd:8080/mått

MicroProfile Rest Client

Mikrotjänster tillhandahåller ofta RESTful-slutpunkter som kräver motsvarande klient-API:er att arbeta med. För att använda RESTful-slutpunkter använder Spring-utvecklare vanligtvis RestTemplate. Quarkus erbjuder MicroProfile Rest Client API:er för att lösa detta problem, exempel på användning ges i Tabell 8.

В projekt från vårt exempel Användningen av RESTful endpoints görs med hjälp av MicroProfile Rest Client. Mer information och exempel om detta ämne finns i Quarkus manual Rest Client Guide.

Tabell 8. Exempel på användning av MicroProfile Rest Client API:er.

MicroProfile Rest Client-funktioner
beskrivning
Примеры

@RegisterRestClient

Registrerar ett maskinskrivet Java-gränssnitt som en REST-klient

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

@RestClient

Markerar implementeringen av en instans av ett skrivet REST-klientgränssnitt

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

Åkallan

Anropar en REST-slutpunkt

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

mp-rest/url

Anger REST-slutpunkten

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

Resultat av

I den här bloggen, som främst riktar sig till Spring-utvecklare, tog vi en snabb titt på hur man använder Spring API:erna med MicroProfile API:erna i Quarkus för att utveckla Java-mikrotjänster och sedan kompilera dem till inbyggd binär kod som sparar hundratals megabyte RAM och lanseras i en fråga om millisekunder.

Som du redan förstått kan mer information om support för Spring och MicroProfile API:er, samt mycket annan användbar information, hittas i Quarkus manualer.

Källa: will.com

Lägg en kommentar