Hur Quarkus förenar MicroProfile och Spring

Hej alla, och hÀr Àr det tredje inlÀgget i serien om Quarkus!

Hur Quarkus förenar MicroProfile och Spring

NÀr man utvecklar Java-mikrotjÀnster anses det ofta att Eclipse MicroProfile och Spring Boot Àr separata och oberoende API:er. Som standard tenderar programmerare att anvÀnda de API:er de redan Àr bekanta med, eftersom det tar tid att lÀra sig nya ramverk och runtime-komponenter. Idag ska vi försöka förenkla inlÀrningen av nÄgra populÀra MicroProfile API för Spring-utvecklare och vi kommer att visa hur man kan anvÀnda Spring API och nya anvÀndbara funktioner samtidigt. Quarkus.

Om vi gÄr in lite mer detaljerat, sÄ först ska vi titta pÄ anvÀndningsomrÄdena och detaljerna kring hur Quarkus stöder Spring API:er, för att visa Spring-utvecklare hur de kan anvÀnda MicroProfile API i sitt dagliga arbete. DÀrefter kommer vi att gÄ igenom MicroProfile API som kommer att vara till nytta för Spring-utvecklare vid skapandet av mikrotjÀnster.

Varför just Quarkus? För det första möjliggör det live coding, vilket innebÀr automatisk omstart av alla Àndringar i MicroProfile API, Spring API och andra Java API, och det görs med endast ett kommando: mvn quarkus:dev. För det andra, det vi diskuterar i vÄrt exempel Person-tjÀnsten (som kompileras frÄn API:erna Spring, MicroProfile och JPA till en binÀr fil med hjÀlp av GraalVM:s inbyggda bild) startar pÄ bara 0,055 sekunder och upptar cirka 90 MB i RAM (RSS) pÄ den RESTful-applikations slutpunkten. SjÀlvklart sÄ görs sjÀlva kompileringen med bara ett kommando: mvn package -Pnative.

Vi ska inte gÄ in pÄ detaljer kring MicroProfile, utan bara försöka hjÀlpa Spring-utvecklare att förstÄ hur API:er frÄn Spring kan anvÀndas tillsammans med MicroProfile API i Quarkus.

Containrar och Kubernetes

För att inte överbelasta den hÀr artikeln kommer vi hÀr bara att gÄ igenom hög-nivÄ aspekter av stödet Kubernetes, eftersom det Àr viktigt att förstÄ. Quarkus marknadsförs som en Java-stack för Kubernetes, som syftar till att minimera minnesanvÀndning och starttider för Java-applikationer och tjÀnster, och dÀrmed öka deras kapacitet i en vÀrd och minska de totala kostnaderna.

Quarkus stöder ocksÄ autogenerering av Kubernetes-resurser och erbjuder manualen för distribution pÄ Kubernetes-plattformar och Red Hat OpenShift. Dessutom genererar Quarkus automatiskt Dockerfile.jvm (JVM-packaging) och Dockerfile.native (native binary packaging) filer som krÀvs för att skapa containrar.

Och slutligen, med Kubernetes som mÄlmiljö för distribution, anvÀnder Quarkus inte Java-ramverk nÀr motsvarande funktionalitet implementeras pÄ Kubernetes-plattformens nivÄ. Tabell 1 visar en karta över funktionalitetens överensstÀmmelse mellan Kubernetes och typiska Java-ramverk som anvÀnds av Spring-utvecklare.

Tabell 1. Karta över funktionalitetens överensstÀmmelse mellan Java-ramverk och Kubernetes.

Funktionalitet
Traditionell Spring Boot
Kubernetes

TjÀnstupptÀckning
Eureka
DNS

Konfiguration
Spring Cloud Config
Config Maps / Secrets

Lastbalansering
Ribbon (pÄ klientsidan)
TjÀnst, Replication Controller (pÄ serversidan)

Kompilera och kör koden frÄn exemplet

I denna artikel hÀnvisar vi till exempelprojektet, dÀr API:erna frÄn bÄde Spring och MicroProfile anvÀnds tillsammans, samt den specifika Java-klassen. Koden frÄn det hÀr exemplet kan kompileras och köras frÄn kommandoraden; se README.md-filen för mer information.

API:er frÄn Spring Framework

Beroendeinjektion

Quarkus stöder en mĂ€ngd olika API:er för Contexts and Dependency Injection (CDI) och API:er för Spring Dependency Injection (Spring DI). Om du arbetar med MicroProfile, Java EE och Jakarta EE, Ă€r du redan vĂ€l bekant med CDI. Å andra sidan kan Spring-utvecklare anvĂ€nda Quarkus Extension for Spring DI API för att sĂ€kerstĂ€lla kompatibilitet med Spring DI. Exempel pĂ„ anvĂ€ndning av de stödda Spring DI API:erna ges i Tabell 2.

I projektet frÄn vÄrt exempel anvÀnder bÄde CDI och Spring Dependency Injection. Mer information och exempel om detta finns i Quarkus-guiden som kallas Spring DI Guide.

Tabell 2. Exempel pÄ anvÀndning av stödda API:er för Spring DI.

Stödda funktioner för Spring DI
Exempel

Konstruktörsinjektion

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

FĂ€ltinjektion
Autowired
VĂ€rde

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bön
@Configuration

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

TjÀnst

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

   public String getPrefix() {
      return message;
   }
}

Webb-ramverk

MicroProfile-anvÀndare kommer att uppskatta att Quarkus stödjer JAX-RS, MicroProfile Rest Client, JSON-P och JSON-B som sin primÀra modell för webbprogrammering. Spring-utvecklare kommer att bli glada över det nyligen tillagda stödet för Spring Web API i Quarkus, sÀrskilt för de grÀnssnitt som ansvarar för REST. PÄ samma sÀtt som med Spring DI Àr huvudmÄlet med stödet för Spring Web API att Spring-utvecklare ska kunna anvÀnda Spring Web API:er tillsammans med MicroProfile API:er. Exempel pÄ hur de stödda Spring Web API:erna anvÀnds ges i tabell 3, och mer information och exempel om detta finns i Quarkus-guiden som heter Spring Web Guide.

Tabell 3. Exempel pÄ hur de stödda Spring Web API:erna anvÀnds.

Stödda funktioner för Spring Web
Exempel

@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) {
   ...
   ...
   ...
}

Spring Data JPA

MicroProfile-anvÀndare kommer ocksÄ att uppskatta att Quarkus stödjer JPA genom Hibernate ORM. För Spring-utvecklare finns det ocksÄ goda nyheter: Quarkus stödjer de vanliga annoteringarna och typerna i Spring Data JPA. Exempel pÄ hur de stödda Spring Data JPA API:erna anvÀnds ges i tabell 4.
I projektet frÄn vÄrt exempel anvÀnds API:er frÄn Spring Data JPA, och mer information finns i Quarkus-guiden som heter Spring Data JPA Guide.

Tabell 4. Exempel pÄ hur de stödda Spring Data JPA API:erna anvÀnds.

Stödda funktioner för Spring Data JPA
Exempel

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repository Fragment

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

API:er frÄn MicroProfile

FelsÀkerhet (Fault tolerance)

Funktionalitet för felhantering Àr mycket viktig för att förhindra kaskadfel och skapa pÄlitliga mikrotjÀnstarkitekturer. Spring-utvecklare har under mÄnga Är anvÀnt kretsbrytare för felhantering. Hystrix. Men Hystrix har inte uppdaterats pÄ lÀnge, medan MicroProfile:s felhantering nu aktivt utvecklas och har flera Ärs produktionserfarenhet bakom sig. DÀrför rekommenderas anvÀndning av MicroProfile Fault Tolerance API:er i Quarkus för att öka tjÀnsternas tillförlitlighet, med exempel som ges i tabell 5. Ytterligare information finns i Quarkus-handboken. Felhanteringsguide.

Tabell 5. Exempel pÄ anvÀndning av stödda MicroProfile Fault Tolerance API:er.

Funktioner för MicroProfile Fault Tolerance
Beskrivning
Exempel

@Asynkron

Utför logik i en separat trÄd

@Asynkron
@Retry
public Future getSalutation() {
   ...
   return future;
}

@Bulkhead

BegrÀnsning av antalet samtidiga förfrÄgningar

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

@CircuitBreaker

Intelligent felhantering och ÄterhÀmtning efter fel

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

@Fallback

Anropa alternativ logik vid fel

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

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

Retry

Upprepa vid fel i förfrÄgan

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

Timeout

Kontrolltid för vÀntan vid fel

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

TjÀnsteövervakning (Service Health)

Kubernetes-plattformar övervakar hÀlsan hos containrar med speciella tjÀnster. För att den underliggande plattformen ska kunna övervaka tjÀnster anvÀnder Spring-utvecklare vanligtvis anpassade HealthIndicator och Spring Boot Actuator. I Quarkus kan detta göras med MicroProfile Health, som som standard utför hÀlsokontroller (liveness check) men ocksÄ kan stÀllas in för att samtidigt kontrollera liveness och readiness (beredskap). Exempel pÄ anvÀndning av stödda MicroProfile Health API:er ges i tabell 6, och ytterligare information finns i Quarkus-handboken. HÀlsoguide.

Tabell 6. Exempel pÄ anvÀndning av stödda MicroProfile Health API:er.

Funktioner för MicroProfile Health
Beskrivning
Exempel

@Liveness

Plattformen utför omstart av trasiga containrar av applikationer
Endpoint:
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();  
}

@Readiness

Plattformen kommer inte att skicka trafik till containeriserade applikationer om de inte Àr redo
Endpoint:
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();  
}

MÀtvÀrden

Applikationer tillhandahĂ„ller metrik antingen för operativa syften (för att övervaka SLA-prestanda) eller för icke-operativa (affĂ€rs-SLA-mĂ„tt). Spring-utvecklare tillhandahĂ„ller metrik via Spring Boot Actuator och Micrometer. Å sin sida anvĂ€nder Quarkus MicroProfile Metrics för att tillhandahĂ„lla grundlĂ€ggande metrik (JVM och operativsystem), leverantörsmetrik (Quarkus) och applikationsmetrik. MicroProfile Metrics krĂ€ver att implementeringen stödjer utdataformaten JSON och OpenMetrics (Prometheus). Exempel pĂ„ anvĂ€ndning av MicroProfile Metrics API finns i tabell 7.

I projektet frÄn vÄrt exempel MicroProfile Metrics anvÀnds för att tillhandahÄlla applikationsmetrik. Mer information finns i Quarkus-handledningen Metrikguide.

Tabell 7. Exempel pÄ anvÀndning av MicroProfile Metrics API.

Funktioner för MicroProfile Metrics
Beskrivning
Exempel

@Counted

Anger en counter som rÀknar antalet anrop pÄ den annoterade objektet

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

@ConcurrentGauge

Anger en gauge som rÀknar antalet samtidiga anrop pÄ den annoterade objektet

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

@Gauge

Anger en gauge som mÀter vÀrdet pÄ den annoterade objektet

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

@Metered

Anger en meter som spÄrar frekvensen av anropet till den annoterade objektet

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

Metrik

Annotation som innehÄller metadata-information nÀr en begÀran om att skapa eller producera en metrik görs

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

TidsinstÀlld

Anger en timer som spÄrar varaktigheten av den annoterade objektet

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

Metrikslutpunkter (Metrics Endpoints)

Applikationsmetrier localhost:8080/metrics/application
GrundlÀggande metrier localhost:8080/metrics/base
Leverantörsmetrier localhost:8080/metrics/vendor
Alla metrier localhost:8080/metrics

Restklient för MicroProfile

MikrotjÀnster erbjuder ofta RESTful slutanrop som krÀver motsvarande klient-API:er. För att anvÀnda RESTful slutanrop tillÀmpar Spring-utvecklare vanligtvis RestTemplate. Quarkus erbjuder istÀllet MicroProfile Rest Client API:er, vars exempel finns i tabell 8.

I projektet frÄn vÄrt exempel anvÀndningen av RESTful slutanrop görs med MicroProfile Rest Client. Mer information och exempel hittar du i Quarkus-handboken Rest Client Guide.

Tabell 8. Exempel pÄ anvÀndning av MicroProfile Rest Client API:er.

Funktioner i MicroProfile Rest Client
Beskrivning
Exempel

@RegisterRestClient

Registrerar ett typat Java-grÀnssnitt som en REST-klient

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

@RestClient

Markerar en instans av det typade REST-klientgrÀnssnittet för injektion

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

Anrop

Anropar REST-slutpunkten

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

mp-rest/url

Anger REST-slutpunkten

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

Sammanfattning

I den hÀr bloggen, som frÀmst Àr till nytta för Spring-utvecklare, har vi kortfattat gÄtt igenom hur Quarkus anvÀnder API:erna frÄn Spring tillsammans med MicroProfiles API:er för att utveckla Java-mikrotjÀnster och sedan kompilera dem till nativa binÀrkod som sparar hundratals megabyte RAM och startar pÄ nÄgra millisekunder.

Som du redan har förstÄtt, finns det mer information om stödet för Spring- och MicroProfile-API:er samt mycket annan nyttig information i Quarkus-handböcker.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster