Hvernig Quarkus sameinar MicroProfile og Spring

Sæl öll, hér er þriðja færslan í Quarkus seríunni!

Hvernig Quarkus sameinar MicroProfile og Spring

Þegar Java örþjónustur eru þróaðar er oft talið að Eclipse MicroProfile и Vorstígvél eru aðskilin og sjálfstæð API. Sjálfgefið hefur forritarar tilhneigingu til að nota API sem þeir eru þegar vanir, þar sem að læra nýja ramma og keyrsluhluta tekur mikinn tíma. Í dag munum við reyna að einfalda þróun sumra vinsælla MicroProfile API fyrir Spring forritara og sýna þér hvernig á að nota Spring API samtímis og nýja gagnlega eiginleika Kvarkus.

Í aðeins meiri smáatriðum munum við fyrst skoða umfang og upplýsingar um hvernig Quarkus styður Spring API til að sýna Spring forritara hvernig á að nota MicroProfile API í daglegu starfi sínu. Síðan munum við fjalla um MicroProfile API, sem eru gagnleg fyrir Spring forritara þegar þeir búa til örþjónustur.

Af hverju Quarkus? Í fyrsta lagi er þetta lifandi kóðun, það er sjálfvirk endurhleðsla á öllum breytingum á MicroProfile API, Spring API og öðrum Java API, sem er framkvæmd með aðeins einni skipun: mvn quarkus:dev. Í öðru lagi, talið í í okkar dæmi Persónuþjónustan (sem safnar saman úr Spring, MicroProfile og JPA API í tvöfalda með því að nota innfædda GraalVM mynd) byrjar á aðeins 0.055 sekúndum og tekur um 90 MB af vinnsluminni (RSS) á RESTful umsóknarendapunktinum. Þar að auki er samantekt þess sjálf framkvæmd með aðeins einni skipun: mvn pakki -Pnative.

Við munum ekki fara í smáatriði um MicroProfile, annað en að hjálpa Spring forriturum að skilja hvernig þeir geta notað Spring API með MicroProfile API í Quarkus.

Gámar og Kubernetes

Til að halda þessari grein einfaldri munum við aðeins fjalla um háþróaða þætti stuðnings hér. Kubernetes, vegna þess að það er mikilvægt að skilja. Quarkus er staðsettur sem Java stafla fyrir Kubernetes, hann er hannaður til að lágmarka minnisnotkun og ræsingartíma Java forrita og þjónustu, og þar af leiðandi auka þéttleika þeirra á hýsilinn og draga úr heildarkostnaði.

Quarkus líka styður sjálfvirka kynslóð Kubernetes auðlindir og tilboð leiðsögumenn til dreifingar á Kubernetes og Red Hat OpenShift kerfum. Að auki býr Quarkus sjálfkrafa til Dockerfile.jvm (JVM umbúðir) og Dockerfile.native (native binary packaging) skrár sem þarf til að búa til ílát.

Að lokum, með því að einbeita sér að Kubernetes sem markdreifingarumhverfi, notar Quarkus ekki Java ramma í þeim tilvikum þar sem svipuð virkni er innleidd á vettvangi Kubernetes vettvangsins sjálfs. Tafla 1 gefur upp kort af virknisamsvörun milli Kubernetes og dæmigerðra Java ramma sem Spring forritarar nota.

Tafla 1. Kort af virknisamsvörun milli Java ramma og Kubernetes.

Virkni
Hefðbundin vorstígvél
Kubernetes

Þjónustuuppgötvun
Eureka
DNS

Stillingar
Vorskýjastilling
Stilla kort/leyndarmál

Hlaðajafnvægi
Borði (viðskiptavinur megin)
Þjónusta, afritunarstýring (miðlarahlið)

Að setja saman og keyra kóðann úr dæminu

Í þessari grein vísum við til dæmi um verkefni, þar sem Spring og MicroProfile API og jafnvel sami Java flokkur eru notaðir saman. Kóðann í þessu dæmi er hægt að setja saman og keyra frá skipanalínunni, sjá README.md skrána fyrir frekari upplýsingar.

Spring Framework API

Háð innspýting

Quarkus styður úrval af Contexts and Dependency Injection (CDI) APIs og Spring Dependency Injection (Spring DI) API. Ef þú ert að vinna með MicroProfile, Java EE og Jakarta EE, þá ertu nú þegar mjög kunnugur CDI. Aftur á móti geta Spring forritarar notað Quarkus Extension for Spring DI API til að ná fram samhæfni við Spring DI. Dæmi um notkun studdu Spring DI API eru gefin í töflu 2.

В verkefni frá okkar fordæmi Notar bæði CDI og Spring Dependency Injection. Fyrir frekari upplýsingar og dæmi um þetta efni, sjá Quarkus handbókina sem heitir Vor DI Leiðbeiningar.

Tafla 2. Dæmi um notkun studd Spring DI API.

Styður Spring DI eiginleikar
dæmi

Constructor Injection

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

Innspýting á vettvangi
Sjálfvirkt snúið
gildi

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Stillingar

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

Component

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

þjónusta

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

   public String getPrefix() {
      return message;
   }
}

Veframmi

MicroProfile notendur munu elska að Quarkus styður JAX-RS, MicroProfile Rest Client, JSON-P og JSON-B sem aðal vefforritunarlíkanið. Vorhönnuðir munu vera ánægðir með nýlegan stuðning Quarkus við Spring Web API, sérstaklega REST viðmót. Líkt og Spring DI er aðalmarkmið Spring Web API stuðningsins að gera Spring forritara kleift að nota Spring Web API í tengslum við MicroProfile API. Dæmi um hvernig á að nota studdu Spring Web API er að finna í töflu 3 og frekari upplýsingar og dæmi um þetta efni er að finna í Quarkus kennslunni sem heitir Vorvefleiðarvísir.

Tafla 3. Dæmi um notkun studd Spring Web API.

Styður Spring Web Features
dæmi

@ RestController
@RequestMapping

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

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

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

Vorgögn JPA

MicroProfile notendur munu einnig meta að Quarkus styður JPA með því að nota Hibernate ORM. Það eru líka góðar fréttir fyrir Spring forritara: Quarkus styður algengar Spring Data JPA athugasemdir og tegundir. Dæmi um notkun studdu Spring Data JPA API eru í töflu 4.
В verkefni frá okkar fordæmi Spring Data JPA API eru notuð og frekari upplýsingar eru fáanlegar í Quarkus kennslunni sem heitir Spring Data JPA Guide.

Tafla 4. Dæmi um notkun studd Spring Data JPA API.

Styður Spring Data JPA eiginleikar
dæmi

CrudRepository

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

Geymsla
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Geymslubrot

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

Afleiddar fyrirspurnaaðferðir

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Notendaskilgreindar fyrirspurnir

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

Bilunarþol

Bilunarþolsbyggingar eru mjög mikilvægar til að koma í veg fyrir bilanir í steypum og búa til áreiðanlega örþjónustuarkitektúr. Vorframleiðendur hafa notað aflrofa fyrir bilanaþol í mörg ár. Hystrix. Hins vegar hefur Hystrix ekki verið uppfært í langan tíma, en MicroProfile's Fault Tolerance er nú í virkri þróun og hefur nokkurra ára framleiðslunotkun að baki. Þess vegna, til að bæta áreiðanleika þjónustu í Quarkus, er mælt með því að nota MicroProfile Fault Tolerance API, dæmi um þau eru notuð í töflu 5. Fyrir frekari upplýsingar um þetta, sjá Quarkus handbókina Leiðbeiningar um bilanaþol.

Tafla 5. Dæmi um notkun studd MicroProfile Fault Tolerance API.

MicroProfile villuþol eiginleika
Lýsing
dæmi

@Ósamstilltur

Framkvæma rökfræði í sérstökum þræði

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

@Þil

Takmarkaðu fjölda beiðna samtímis

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

@CircuitBreaker

Snjöll meðhöndlun bilana og endurheimt frá bilunum

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

@Fallback

Hringir í aðra rökfræði ef bilun verður

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

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

Reyna

Reyndu aftur ef beiðni mistekst

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

Tímamörk

Tímamörk bilunarstýringar

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

Athugunarþjónusta (Service Health)

Kubernetes pallar fylgjast með heilsu gáma með því að nota sérstaka þjónustu. Til að leyfa undirliggjandi vettvangi að fylgjast með þjónustu, nota Spring verktaki venjulega sérsniðinn HealthIndicator og Spring Boot Actuator. Í Quarkus er hægt að gera þetta með því að nota MicroProfile Health, sem framkvæmir sjálfgefið athugun á lífgildi, en hægt er að stilla það til að kanna samtímis lífleika og viðbúnað. Dæmi um hvernig á að nota studdu MicroProfile Health API eru í töflu 6 og viðbótarupplýsingar eru veittar í Quarkus handbókinni Heilsuleiðbeiningar.

Tafla 6: Dæmi um notkun á studdum MicroProfile Health API.

MicroProfile Health eiginleikar
Lýsing
dæmi

@Lífsgleði

Endurræsingar vettvangsins misheppnuðust gámaforrit
Endapunktur:
gestgjafi:8080/heilsa/lifandi

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

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

@Viðbúið

Vettvangurinn mun ekki senda umferð í gámaforrit ef hann er ekki tilbúinn
Endapunktur:
gestgjafi:8080/heilsa/tilbúinn

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

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

Mælingar

Forrit veita mælikvarða annaðhvort í rekstrarlegum tilgangi (til að fylgjast með frammistöðu SLAs) eða ekki-rekstrarlegum tilgangi (Business SLAs). Vorhönnuðir veita mælikvarða með því að nota Spring Boot Actuator og Micrometer. Aftur á móti notar Quarkus MicroProfile Metrics til að veita grunnmælingar (JVM og stýrikerfi), sölumælingar (Quarkus) og forritamælingar. MicroProfile Metrics krefst þess að útfærslan styðji JSON og OpenMetrics (Prometheus) úttakssnið. Dæmi um notkun MicroProfile Metrics API eru gefin í töflu 7.

В verkefni frá okkar fordæmi MicroProfile Metrics eru notaðar til að veita forritamælingar. Fyrir frekari upplýsingar, sjá Quarkus handbókina Leiðbeiningar um mælikvarða.

Tafla 7. Dæmi um notkun MicroProfile Metrics API.

Eiginleikar MicroProfile Metrics
Lýsing
dæmi

@Talið

Táknar teljara sem telur hversu oft hefur verið hringt í athugasemd með athugasemdum

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

@ConcurrentGauge

Táknar mælikvarða sem telur fjölda samhliða símtölum í athugasemd með athugasemdum

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

@Mæjari

Táknar mæliskynjara sem mælir gildi hlutar með athugasemdum

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

@Mælt

Táknar mæliskynjara sem fylgist með símtalstíðni merkts hlutar

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

Metric

Skýring sem inniheldur upplýsingar um lýsigögn þegar beiðni berst um að slá inn eða framleiða mæligildi

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

Tímasett

Gefur til kynna tímamælir sem fylgist með tímalengd hlutar með athugasemdum

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

Mælingar endapunktar

Forritsmælingar localhost:8080/mælingar/forrit
Grunnmælingar localhost:8080/mælingar/grunnur
Mælingar söluaðila localhost:8080/mælingar/söluaðili
Allar mælingar localhost:8080/mælingar

MicroProfile Rest viðskiptavinur

Örþjónustur bjóða oft upp á RESTful endapunkta sem krefjast samsvarandi API viðskiptavina til að starfa á þeim. Til að nota RESTful endapunkta nota Spring verktaki venjulega RestTemplate. Quarkus býður upp á MicroProfile Rest Client API til að leysa þetta vandamál, dæmi um notkun eru gefin í töflu 8.

В verkefni frá okkar fordæmi notkun RESTful endapunkta er gerð með því að nota MicroProfile Rest Client. Frekari upplýsingar og dæmi um þetta efni er að finna í Quarkus handbókinni Rest Viðskiptavinahandbók.

Tafla 8. Dæmi um notkun MicroProfile Rest Client API.

Eiginleikar MicroProfile Rest Client
Lýsing
dæmi

@RegisterRestClient

Skráir vélritað Java viðmót sem REST biðlara

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

@RestClient

Merkir innleiðingu á tilviki vélritaðs REST biðlaraviðmóts

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

ákall

Hringir í REST endapunkt

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

mp-rest/url

Tilgreinir REST endapunkt

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

Niðurstöður

Í þessu bloggi, sem er fyrst og fremst ætlað að Spring forritara, skoðuðum við fljótlega hvernig á að nota Spring API með MicroProfile API í Quarkus til að þróa Java örþjónustur og setja þær síðan saman í innfæddan tvíundarkóða sem sparar hundruð megabæta af vinnsluminni og opnar í spurning um millisekúndur.

Eins og þú hefur þegar skilið, er að finna frekari upplýsingar um stuðning við Spring og MicroProfile API, sem og margar aðrar gagnlegar upplýsingar í Quarkus handbækur.

Heimild: www.habr.com

Bæta við athugasemd