Kā Quarkus apvieno MicroProfile un Spring

Sveiki visiem, lÅ«k, treÅ”ais ieraksts Quarkus sērijā!

Kā Quarkus apvieno MicroProfile un Spring

Izstrādājot Java mikropakalpojumus, bieži tiek uzskatÄ«ts, ka Eclipse mikroprofils Šø Pavasara zābaks ir atseviŔķas un neatkarÄ«gas API. Pēc noklusējuma programmētāji mēdz izmantot API, pie kurām viņi jau ir pieraduÅ”i, jo jaunu ietvaru un izpildlaika komponentu apgÅ«Å”ana aizņem daudz laika. Å odien mēs centÄ«simies vienkārÅ”ot dažu populāru izstrādi MicroProfile API pavasara izstrādātājiem un parādÄ«sim, kā vienlaikus izmantot Spring API un jaunas noderÄ«gas funkcijas Kvarkuss.

Nedaudz detalizētāk mēs vispirms apskatīsim tvērumu un informāciju par to, kā Quarkus atbalsta Spring API, lai parādītu Spring izstrādātājiem, kā ikdienas darbā izmantot MicroProfile API. Pēc tam apskatīsim MicroProfile API, kas noder Spring izstrādātājiem, veidojot mikropakalpojumus.

Kāpēc Quarkus? Pirmkārt, tā ir reāllaika kodÄ“Å”ana, tas ir, automātiska visu MicroProfile API, Spring API un citu Java API izmaiņu pārlādÄ“Å”ana, kas tiek veikta tikai ar vienu komandu: mvn quarkus:dev. Otrkārt, apspriests mÅ«su piemērā pakalpojums Person (kas apkopo no Spring, MicroProfile un JPA API binārā formātā, izmantojot vietējo GraalVM attēlu) sākas tikai 0.055 sekundēs un aizņem apmēram 90 MB RAM (RSS) lietojumprogrammas RESTful galapunktā. Turklāt pati tā kompilācija tiek veikta tikai ar vienu komandu: mvn pakotne -Pnative.

Mēs neiedziļināsimies sīkāk par MicroProfile, izņemot to, lai palīdzētu Spring izstrādātājiem saprast, kā viņi var izmantot Spring API ar MicroProfile API Quarkus.

Konteineri un Kubernetes

Lai Å”is raksts bÅ«tu vienkārÅ”s, mēs Å”eit apskatÄ«sim tikai augsta lÄ«meņa atbalsta aspektus. Kubernetes, jo ir svarÄ«gi saprast. Quarkus ir pozicionēts kā Kubernetes Java steks, tas ir paredzēts, lai samazinātu Java lietojumprogrammu un pakalpojumu atmiņas patēriņu un palaiÅ”anas laiku, kā rezultātā palielinātu to blÄ«vumu resursdatorā un samazinātu kopējās izmaksas.

Kvarkus arÄ« atbalsta auto Ä£enerÄ“Å”anu Kubernetes resursi un piedāvājumi vadÄ«ba izvietoÅ”anai Kubernetes un Red Hat OpenShift platformās. Turklāt Quarkus automātiski Ä£enerē Dockerfile.jvm (JVM iepakojums) un Dockerfile.native (vietējais binārais iepakojums) failus, kas nepiecieÅ”ami konteineru izveidei.

Visbeidzot, koncentrējoties uz Kubernetes kā mērÄ·a izvietoÅ”anas vidi, Quarkus neizmanto Java ietvarus gadÄ«jumos, kad lÄ«dzÄ«ga funkcionalitāte tiek ieviesta paÅ”as Kubernetes platformas lÄ«menÄ«. 1. tabulā ir sniegta funkcionālās atbilstÄ«bas karte starp Kubernetes un tipiskām Java ietvariem, ko izmanto Spring izstrādātāji.

1. tabula. Funkcionālās atbilstības karte starp Java ietvariem un Kubernetes.

Funkcionāls
Tradicionālie pavasara zābaki
Kubernetes

Pakalpojuma atklāŔana
Eureka
DNS

Konfigurācija
Pavasara mākoņa konfigurācija
Konfigurēt kartes/noslēpumus

Slodzes līdzsvaroŔana
Lente (klienta pusē)
Pakalpojums, replikācijas kontrolieris (servera puse)

Koda kompilÄ“Å”ana un palaiÅ”ana no piemēra

Šajā rakstā mēs atsaucamies uz projekta piemērs, kur kopā tiek izmantotas Spring un MicroProfile API un pat viena un tā pati Java klase. Šajā piemērā norādīto kodu var apkopot un palaist no komandrindas; sīkāku informāciju skatiet failā README.md.

Spring Framework API

Atkarības injekcija

Quarkus atbalsta virkni Konteksti un atkarÄ«bas ievadÄ«Å”anas (CDI) API un Spring Dependency Injection (Spring DI) API. Ja strādājat ar MicroProfile, Java EE un Jakarta EE, tad jÅ«s jau ļoti labi pārzināt CDI. No otras puses, Spring izstrādātāji var izmantot Quarkus paplaÅ”inājumu Spring DI API, lai panāktu saderÄ«bu ar Spring DI. AtbalstÄ«to Spring DI API izmantoÅ”anas piemēri ir sniegti 2. tabulā.

Š’ projekts no mÅ«su piemēra Izmanto gan CDI, gan Spring Dependency Injection. PlaŔāku informāciju un piemērus par Å”o tēmu var atrast Quarkus rokasgrāmatā ar nosaukumu Pavasara DI ceļvedis.

2. tabula. AtbalstÄ«to Spring DI API izmantoÅ”anas piemēri.

Atbalstītās pavasara DI funkcijas
piemēri

Konstruktora iesmidzināŔana

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

Lauka injekcija
Autovadu savienojums
Vērtība

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Pupa
@Konfigurācija

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

Komponents

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

Serviss

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

   public String getPrefix() {
      return message;
   }
}

Tīmekļa ietvars

MicroProfile lietotājiem patiks, ka Quarkus atbalsta JAX-RS, MicroProfile Rest Client, JSON-P un JSON-B kā primāro tÄ«mekļa programmÄ“Å”anas modeli. Pavasara izstrādātāji bÅ«s apmierināti ar Quarkus neseno atbalstu Spring Web API, jo Ä«paÅ”i REST saskarnēm. LÄ«dzÄ«gi kā Spring DI, galvenais Spring Web API atbalsta mērÄ·is ir ļaut Spring izstrādātājiem izmantot Spring Web API kopā ar MicroProfile API. Piemēri, kā izmantot atbalstÄ«tās Spring Web API, ir sniegti 3. tabulā, un vairāk informācijas un piemērus par Å”o tēmu var atrast Quarkus apmācÄ«bā ar nosaukumu Pavasara tÄ«mekļa ceļvedis.

3. tabula. AtbalstÄ«to Spring Web API izmantoÅ”anas piemēri.

Atbalstītās pavasara tīmekļa funkcijas
piemēri

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (daļēja)

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

Pavasara datu JPA

MicroProfile lietotāji arÄ« novērtēs, ka Quarkus atbalsta JPA, izmantojot hibernate ORM. Ir arÄ« labas ziņas Spring izstrādātājiem: Quarkus atbalsta izplatÄ«tās Spring Data JPA anotācijas un veidus. AtbalstÄ«to Spring Data JPA API izmantoÅ”anas piemēri ir sniegti 4. tabulā.
Š’ projekts no mÅ«su piemēra Tiek izmantotas Spring Data JPA API, un plaŔāka informācija ir pieejama Quarkus apmācÄ«bā ar nosaukumu Pavasara datu JPA rokasgrāmata.

4. tabula. AtbalstÄ«to Spring Data JPA API izmantoÅ”anas piemēri.

Atbalstītās Spring Data JPA funkcijas
piemēri

CrudRepository

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

Krātuve
JpaRepozitorijs
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repozitorija fragmenti

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

Atvasinātās vaicājumu metodes

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Lietotāja definēti vaicājumi

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

Kļūdu tolerance

Kļūdu tolerances konstrukcijas ir ļoti svarÄ«gas, lai novērstu kaskādes atteices un izveidotu uzticamas mikropakalpojumu arhitektÅ«ras. Pavasara izstrādātāji jau daudzus gadus ir izmantojuÅ”i slēdžus, lai nodroÅ”inātu kļūdu toleranci. Histrikss. Tomēr Hystrix nav atjaunināts ilgu laiku, bet MicroProfile kļūdu tolerance tagad aktÄ«vi attÄ«stās, un tai ir vairāku gadu ražoÅ”anas izmantoÅ”ana. Tāpēc, lai uzlabotu Quarkus pakalpojumu uzticamÄ«bu, ieteicams izmantot MicroProfile Fault Tolerance API, kuru piemēri ir izmantoti 5. tabulā. PlaŔāku informāciju par to skatiet Quarkus rokasgrāmatā. Bojājumu tolerances rokasgrāmata.

5. tabula. AtbalstÄ«to MicroProfile kļūdu tolerances API izmantoÅ”anas piemēri.

Mikroprofila kļūdu tolerances līdzekļi
Apraksts
piemēri

@Asinhroni

Loģikas izpilde atseviŔķā pavedienā

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

@Bulkhead

Ierobežojiet vienlaicīgu pieprasījumu skaitu

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

@CircuitBreaker

Gudra kļūmju apstrāde un atkopÅ”anās no kļūmēm

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

@Atkāpties

Alternatīvas loģikas izsaukŔana neveiksmes gadījumā

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

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

otrreiz izskatīt

Ja pieprasījums neizdodas, mēģiniet vēlreiz

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

Taimautu

Atteices kontroles taimauts

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

Pārbaudes pakalpojumi (pakalpojuma veselība)

Kubernetes platformas uzrauga konteineru stāvokli, izmantojot Ä«paÅ”us pakalpojumus. Lai pamata platforma varētu pārraudzÄ«t pakalpojumus, Spring izstrādātāji parasti izmanto pielāgotu HealthIndicator un Spring Boot Actuator. Programmā Quarkus to var izdarÄ«t, izmantojot MicroProfile Health, kas pēc noklusējuma veic dzÄ«vÄ«guma pārbaudi, taču to var konfigurēt, lai vienlaikus pārbaudÄ«tu dzÄ«vÄ«gumu un gatavÄ«bu. AtbalstÄ«to MicroProfile Health API lietoÅ”anas piemēri ir sniegti 6. tabulā, un papildu informācija ir sniegta Quarkus rokasgrāmatā. VeselÄ«bas rokasgrāmata.

6. tabula. AtbalstÄ«to MicroProfile Health API lietoÅ”anas piemēri.

MicroProfile Health funkcijas
Apraksts
piemēri

@Dzīvīgums

Platforma atsāknē konteinerizētās lietojumprogrammas
Galapunkts:
saimnieks:8080/veselība/tieŔraide

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

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

@Gatavība

Platforma nenosūtīs trafiku uz konteinerizētajām lietojumprogrammām, ja tā nav gatava
Galapunkts:
saimniekdators:8080/veselība/gatavs

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

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

Metrika

Lietojumprogrammas nodroÅ”ina metriku gan darbÄ«bas mērÄ·iem (veiktspējas SLA pārraudzÄ«bai), gan neekspluatācijas mērÄ·iem (biznesa SLA). Pavasara izstrādātāji nodroÅ”ina metriku, izmantojot Spring Boot Actuator un Micrometer. Savukārt Quarkus izmanto MicroProfile Metrics, lai nodroÅ”inātu bāzes metriku (JVM un operētājsistēmu), piegādātāju metriku (Quarkus) un lietojumprogrammu metriku. MicroProfile Metrics pieprasa, lai ievieÅ”ana atbalstÄ«tu JSON un OpenMetrics (Prometheus) izvades formātus. MicroProfile Metrics API izmantoÅ”anas piemēri ir sniegti 7. tabulā.

Š’ projekts no mÅ«su piemēra MicroProfile Metrics tiek izmantotas, lai nodroÅ”inātu lietojumprogrammu metriku. Papildinformāciju skatiet Quarkus rokasgrāmatā Metrikas rokasgrāmata.

7. tabula. MicroProfile Metrics API izmantoÅ”anas piemēri.

Mikroprofila metrikas līdzekļi
Apraksts
piemēri

@Saskaitīts

Apzīmē skaitītāju, kas uzskaita, cik reižu anotēts objekts ir izsaukts

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

@ConcurrentGauge

Apzīmē mērītāju, kas skaita vienlaicīgu izsaukumu skaitu anotētam objektam

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

@Gauge

Apzīmē mērinstrumentu sensoru, kas mēra anotēta objekta vērtību

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

@Metered

Apzīmē skaitītāja sensoru, kas uzrauga anotēta objekta izsaukuma biežumu

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

metrisks

Anotācija, kas satur informāciju par metadatiem, kad tiek saņemts pieprasījums ievadīt vai izveidot metriku

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

Laiks

Norāda taimeri, kas izseko anotētā objekta ilgumu

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

Metrikas galapunkti

Lietojumprogrammu rādītāji localhost:8080/metrics/aplikācija
Pamata rādītāji localhost:8080/metrics/bāze
Pārdevēja rādītāji localhost:8080/metrics/pārdevējs
Visi rādītāji localhost:8080/metrika

MicroProfile Rest Client

Mikropakalpojumi bieži nodroÅ”ina RESTful galapunktus, ar kuriem darbam ir nepiecieÅ”amas atbilstoÅ”as ā€‹ā€‹klientu API. Lai izmantotu RESTful galapunktus, Spring izstrādātāji parasti izmanto RestTemplate. Å Ä«s problēmas risināŔanai Quarkus piedāvā MicroProfile Rest Client API, kuru izmantoÅ”anas piemēri ir sniegti 8. tabulā.

Š’ projekts no mÅ«su piemēra RESTful galapunktu izmantoÅ”ana tiek veikta, izmantojot MicroProfile Rest Client. PlaŔāku informāciju un piemērus par Å”o tēmu var atrast Quarkus rokasgrāmatā AtpÅ«tas klientu ceļvedis.

8. tabula. MicroProfile Rest Client API izmantoÅ”anas piemēri.

MicroProfile Rest klienta funkcijas
Apraksts
piemēri

@RegisterRestClient

Reģistrē drukātu Java interfeisu kā REST klientu

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

@RestClient

AtzÄ«mē drukāta REST klienta interfeisa gadÄ«juma ievieÅ”anu

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

Uzaicinājums

Izsauc REST galapunktu

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

mp-rest/url

Norāda REST galapunktu

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

Rezultāti

Šajā emuārā, kas galvenokārt paredzēts Spring izstrādātājiem, mēs īsi apskatījām, kā izmantot Spring API ar MicroProfile API programmā Quarkus, lai izstrādātu Java mikropakalpojumus un pēc tam tos apkopotu vietējā binārajā kodā, kas ietaupa simtiem megabaitu RAM un tiek palaists milisekundes jautājums.

Kā jau sapratāt, vairāk informācijas par atbalstu Spring un MicroProfile API, kā arī daudz citas noderīgas informācijas var atrast Quarkus rokasgrāmatas.

Avots: www.habr.com

Pievieno komentāru