Hoe Quarkus MicroProfile en Spring kombineer

Hallo almal, hier is die derde plasing in die Quarkus-reeks!

Hoe Quarkus MicroProfile en Spring kombineer

Wanneer Java-mikrodienste ontwikkel word, word dit dikwels geglo dat Verduistering MicroProfile и Springstewel is afsonderlike en onafhanklike API's. By verstek is programmeerders geneig om die API's te gebruik waaraan hulle reeds gewoond is, aangesien die aanleer van nuwe raamwerke en looptydkomponente baie tyd neem. Vandag sal ons probeer om die ontwikkeling van 'n paar gewilde te vereenvoudig MicroProfile API vir Spring-ontwikkelaars en wys jou hoe om die Spring API en nuwe nuttige kenmerke gelyktydig te gebruik Kwark.

In 'n bietjie meer besonderhede sal ons eers kyk na die omvang en besonderhede van hoe Quarkus Spring API's ondersteun om Spring-ontwikkelaars te wys hoe om die MicroProfile API in hul daaglikse werk te gebruik. Dan sal ons die MicroProfile API's dek, wat nuttig is vir Spring-ontwikkelaars wanneer hulle mikrodienste skep.

Hoekom Quarkus? Eerstens is dit regstreekse kodering, dit wil sê outomatiese herlaai van enige veranderinge in die MicroProfile API, Spring API en ander Java API's, wat uitgevoer word met net een opdrag: mvn quarkus:dev. Tweedens, bespreek in in ons voorbeeld die Persoon-diens (wat van Spring-, MicroProfile- en JPA-API's saamstel in 'n binêre deur die inheemse GraalVM-beeld te gebruik) begin binne net 0.055 sekondes en neem ongeveer 90 MB RAM (RSS) op die RESTful-toepassingseindpunt op. Boonop word die samestelling daarvan self uitgevoer met net een opdrag: mvn package -Pnative.

Ons gaan nie in detail oor MicroProfile in nie, behalwe om Spring-ontwikkelaars te help verstaan ​​hoe hulle Spring API's met MicroProfile API's in Quarkus kan gebruik.

Houers en Kubernetes

Om hierdie artikel eenvoudig te hou, sal ons slegs die hoëvlak-aspekte van ondersteuning hier dek. Kubernetes, want dit is belangrik om te verstaan. Quarkus is geposisioneer as 'n Java-stapel vir Kubernetes, dit is ontwerp om geheueverbruik en opstarttyd van Java-toepassings en -dienste te minimaliseer, en as gevolg daarvan hul digtheid op die gasheer te verhoog en algehele koste te verminder.

Quarkus ook ondersteun outomatiese generasie Kubernetes hulpbronne en aanbiedinge gidse vir ontplooiing op Kubernetes- en Red Hat OpenShift-platforms. Daarbenewens genereer Quarkus outomaties die Dockerfile.jvm (JVM verpakking) en Dockerfile.native (inheemse binêre verpakking) lêers wat nodig is om houers te skep.

Ten slotte, deur op Kubernetes as die teiken-ontplooiingsomgewing te fokus, gebruik Quarkus nie Java-raamwerke in gevalle waar soortgelyke funksionaliteit op die vlak van die Kubernetes-platform self geïmplementeer word nie. Tabel 1 verskaf 'n kaart van die funksionele korrespondensie tussen Kubernetes en tipiese Java-raamwerke wat deur Spring-ontwikkelaars gebruik word.

Tabel 1. Kaart van funksionele korrespondensie tussen Java-raamwerke en Kubernetes.

funksionele
Tradisionele Spring Boot
Kubernetes

Diens ontdekking
Eureka
DNS

opset
Spring Cloud Config
Stel kaarte/geheime op

Vrag balansering
Lint (kliëntkant)
Diens, replikasiebeheerder (bedienerkant)

Samestelling en uitvoer van die kode uit die voorbeeld

In hierdie artikel verwys ons na voorbeeld projek, waar die Spring- en MicroProfile API's en selfs dieselfde Java-klas saam gebruik word. Die kode in hierdie voorbeeld kan saamgestel en uitgevoer word vanaf die opdragreël, sien die README.md-lêer vir besonderhede.

Spring Framework API's

Afhanklikheid Inspuiting

Quarkus ondersteun 'n reeks van Konteks en afhanklikheidsinspuiting (CDI) API's en Spring Dependency Injection (Spring DI) API's. As jy met MicroProfile werk, Java EE en Jakarta EE, dan is jy reeds baie vertroud met CDI. Aan die ander kant kan Spring-ontwikkelaars die Quarkus-uitbreiding vir Spring DI API gebruik om verenigbaarheid met Spring DI te bereik. Voorbeelde van die gebruik van die ondersteunde Spring DI API's word in Tabel 2 gegee.

В projek uit ons voorbeeld Gebruik beide CDI en Spring Dependency Injection. Meer inligting en voorbeelde oor hierdie onderwerp kan gevind word in die Quarkus-gids genaamd Lente DI Gids.

Tabel 2. Voorbeelde van die gebruik van die ondersteunde Spring DI API's.

Ondersteunde Spring DI-kenmerke
voorbeelde

Konstrukteur-inspuiting

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

Veldinspuiting
Outobedraad
waarde

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@ Konfigurasie

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

Diens

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

   public String getPrefix() {
      return message;
   }
}

Webraamwerk

MicroProfile-gebruikers sal daarvan hou dat Quarkus JAX-RS, MicroProfile Rest Client, JSON-P en JSON-B ondersteun as die primêre webprogrammeringsmodel. Spring-ontwikkelaars sal tevrede wees met Quarkus se onlangse ondersteuning vir die Spring Web API, veral REST-koppelvlakke. Soortgelyk aan Spring DI, is die hoofdoel van Spring Web API-ondersteuning om Spring-ontwikkelaars in staat te stel om Spring Web API's te gebruik in samewerking met MicroProfile API's. Voorbeelde van hoe om die ondersteunde Spring Web API's te gebruik, word in Tabel 3 verskaf, en meer inligting en voorbeelde oor hierdie onderwerp kan gevind word in die Quarkus-tutoriaal genaamd Lente Webgids.

Tabel 3. Voorbeelde van die gebruik van die ondersteunde Spring Web API's.

Ondersteunde lentewebkenmerke
voorbeelde

@RestController
@RequestMapping

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

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

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

Spring DataJPA

MicroProfile-gebruikers sal ook waardeer dat Quarkus JPA ondersteun deur die Hibernate ORM te gebruik. Daar is ook goeie nuus vir Spring-ontwikkelaars: Quarkus ondersteun algemene Spring Data JPA-aantekeninge en -tipes. Voorbeelde van die gebruik van die ondersteunde Spring Data JPA API's word in Tabel 4 gegee.
В projek uit ons voorbeeld Spring Data JPA API's word gebruik en meer inligting is beskikbaar in die Quarkus-tutoriaal genoem Lentedata JPA-gids.

Tabel 4. Voorbeelde van die gebruik van ondersteunde Spring Data JPA API's.

Ondersteunde Spring Data JPA-kenmerke
voorbeelde

CrudRepository

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

bewaarplek
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Bewaarplekfragmente

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

Afgeleide navraagmetodes

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Gebruiker-gedefinieerde navrae

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

Mikroprofiel-API's

Fout verdraagsaamheid

Fouttoleransie-konstrukte is baie belangrik vir die voorkoming van kaskadefoute en die skep van betroubare mikrodiensargitekture. Spring-ontwikkelaars gebruik stroombrekers al vir baie jare vir foutverdraagsaamheid. Hystrix. Hystrix is ​​egter lanklaas opgedateer, maar MicroProfile se Fault Tolerance ontwikkel nou aktief en het etlike jare se produksiegebruik agter die rug. Daarom, om die betroubaarheid van dienste in Quarkus te verbeter, word dit aanbeveel om die MicroProfile Fault Tolerance API's te gebruik, waarvan voorbeelde in Tabel 5 gebruik word. Vir meer inligting hieroor, sien die Quarkus-handleiding Gids vir foutverdraagsaamheid.

Tabel 5. Voorbeelde van die gebruik van ondersteunde MicroProfile Fault Tolerance API's.

Mikroprofiel-fouttoleransie-kenmerke
Beskrywing
voorbeelde

@Asinchroon

Voer logika in 'n aparte draad uit

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

@Skoot

Beperk die aantal gelyktydige versoeke

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

@CircuitBreaker

Slim hantering van mislukking en herstel van mislukkings

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

@Terugval

Roep alternatiewe logika in geval van mislukking

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

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

Weer

Herprobeer op versoek mislukking

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

tydverstreke

Foutbeheer-uitteltyd

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

Kontroleer dienste (Diensgesondheid)

Kubernetes-platforms monitor die gesondheid van houers deur spesiale dienste te gebruik. Om die onderliggende platform toe te laat om dienste te monitor, gebruik Spring-ontwikkelaars gewoonlik 'n pasgemaakte HealthIndicator en Spring Boot Actuator. In Quarkus kan dit gedoen word met behulp van MicroProfile Health, wat by verstek 'n lewendheidkontrole uitvoer, maar gekonfigureer kan word om gelyktydig lewendheid en gereedheid na te gaan. Voorbeelde van hoe om die ondersteunde MicroProfile Health API's te gebruik, word in Tabel 6 verskaf, en bykomende inligting word in die Quarkus-handleiding verskaf Gesondheidsgids.

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

MicroProfile Health kenmerke
Beskrywing
voorbeelde

@Lewendigheid

Die platform herlaai het mislukte houertoepassings
Eindpunt:
gasheer: 8080/gesondheid/lewendig

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

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

@Gereedheid

Die platform sal nie verkeer na houertoepassings stuur as dit nie gereed is nie
Eindpunt:
gasheer: 8080/gesondheid/gereed

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

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

Metrieke

Toepassings verskaf maatstawwe vir óf operasionele doeleindes (om prestasie-SLA's te monitor) of nie-operasionele doeleindes (besigheid-SLA's). Spring-ontwikkelaars verskaf statistieke met behulp van Spring Boot Actuator en Micrometer. Op sy beurt gebruik Quarkus MicroProfile Metrics om basislynmetrieke (JVM en bedryfstelsel), verskaffermetrieke (Quarkus) en toepassingsmetrieke te verskaf. MicroProfile Metrics vereis dat die implementering JSON en OpenMetrics (Prometheus) uitvoerformate ondersteun. Voorbeelde van die gebruik van die MicroProfile Metrics API word in Tabel 7 gegee.

В projek uit ons voorbeeld MicroProfile Metrics word gebruik om toepassingsmetrieke te verskaf. Vir meer inligting, sien die Quarkus-handleiding Metrieke Gids.

Tabel 7. Voorbeelde van die gebruik van MicroProfile Metrics API's.

Mikroprofielstatistieke kenmerke
Beskrywing
voorbeelde

@Getel

Dui 'n teller aan wat die aantal kere tel wat 'n geannoteerde voorwerp geroep is

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

@ConcurrentGauge

Dui 'n meter aan wat die aantal gelyktydige oproepe na 'n geannoteerde voorwerp tel

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

@meter

Dui 'n metersensor aan wat die waarde van 'n geannoteerde voorwerp meet

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

@Gemete

Dui 'n metersensor aan wat die oproepfrekwensie van 'n geannoteerde voorwerp monitor

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

metrieke

'n Aantekening wat inligting oor metadata bevat wanneer 'n versoek ontvang word om 'n maatstaf in te voer of te produseer

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

snel

Dui 'n tydhouer aan wat die duur van 'n geannoteerde voorwerp naspoor

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

Metrieke eindpunte

Toepassingsstatistieke localhost:8080/metrics/toepassing
Basiese maatstawwe localhost:8080/metrics/basis
Verkoper maatstawwe localhost:8080/metrics/verkoper
Alle maatstawwe localhost:8080/metriek

MicroProfile Rest Client

Mikrodienste verskaf dikwels RUSTIGE eindpunte wat ooreenstemmende kliënt API's vereis om mee te werk. Om RESTful eindpunte te gebruik, gebruik Spring-ontwikkelaars gewoonlik RestTemplate. Quarkus bied MicroProfile Rest Client API's om hierdie probleem op te los, voorbeelde van gebruik daarvan word in Tabel 8 gegee.

В projek uit ons voorbeeld die gebruik van RESTful eindpunte word gedoen met behulp van die MicroProfile Rest Client. Meer inligting en voorbeelde oor hierdie onderwerp kan gevind word in die Quarkus-handleiding Res Kliëntgids.

Tabel 8. Voorbeelde van die gebruik van MicroProfile Rest Client API's.

MicroProfile Rest Client Kenmerke
Beskrywing
voorbeelde

@RegisterRestClient

Registreer 'n getikte Java-koppelvlak as 'n REST-kliënt

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

@RestClient

Merk die implementering van 'n geval van 'n getikte REST-kliëntkoppelvlak

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

aanroeping

Bel 'n REST eindpunt

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

mp-res/url

Spesifiseer die REST eindpunt

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

Resultate van

In hierdie blog, wat hoofsaaklik op Spring-ontwikkelaars gemik is, het ons vinnig gekyk na hoe om die Spring API's met die MicroProfile API's in Quarkus te gebruik om Java-mikrodienste te ontwikkel en dit dan saam te stel in inheemse binêre kode wat honderde megagrepe RAM spaar en begin in 'n kwessie van millisekondes.

Soos u reeds verstaan ​​het, kan meer inligting oor ondersteuning vir die Spring- en MicroProfile API's, sowel as baie ander nuttige inligting, gevind word in Quarkus handleidings.

Bron: will.com

Voeg 'n opmerking