Kuidas Quarkus ĂŒhendab MicroProfile'i ja Springi

Tere kÔigile! Siin on meie kolmas postitus Quarkuse sarjast!

Kuidas Quarkus ĂŒhendab MicroProfile'i ja Springi

Java mikroteenuste arendamisel arvatakse sageli, et Eclipse MicroProfile ja Spring Boot on eraldi ja omavahel sĂ”ltumatud API-d. Vaikimisi kasutavad programmeerijad tavaliselt neid API-sid, millega nad on juba harjunud, kuna uute raamistikude ja jooksukomponentide Ă”ppimine nĂ”uab palju aega. TĂ€na pĂŒĂŒame lihtsustada mĂ”nede populaarsete MicroProfile API-de omandamist Spring-arendajatele ja nĂ€itame, kuidas saame samaaegselt kasutada Spring API ja uusi kasulikke funktsioone. Quarkus.

Kui rÀÀkida lÀhemalt, siis vaatame esmalt, kuidas Quarkus toetab Spring API, et nÀidata Spring-arendajatele, kuidas kasutada MicroProfile API-d oma igapÀevases töös. SeejÀrel rÀÀgime MicroProfile API-dest, mis osutuvad kasulikuks Spring-arendajatele mikroteenuste loomisel.

Miks just Quarkus? Esiteks, see vĂ”imaldab reaalajas kodeerimist (live coding), st kĂ”ikide MicroProfile API, Spring API ja teiste Java API muudatuste automaatne laadimine toimub ĂŒhe kĂ€su abil: mvn quarkus:dev. Teiseks, meie nĂ€ites kĂ€sitletud funktsioon service Person (see on kompileeritud Springi, MicroProfile'i ja JPA API-dega GraalVMi natiivse pildiga binaarfailiks) kĂ€ivitub vaid 0.055 sekundi jooksul ning kasutab umbes 90 MB RAM-i (RSS) RESTful rakenduse lĂ”pp-punktis. Samuti toimub selle kompileerimine ĂŒhe kĂ€suga: mvn package -Pnative.

Me ei soovita sĂŒveneda MicroProfile'i detailidesse, vaid pĂŒĂŒame aidata Spring-arendajatel mĂ”ista, kuidas Quarkus'is saab kasutada Springi API-sid koos MicroProfile'i API-dega.

Konteinerid ja Kubernetes

Kuna me ei soovi seda artiklit ĂŒle koormata, vaatame siin vaid kĂ”rgema taseme aspekte toetuse kohta Kubernetes, kuna see on oluline mĂ”ista. Quarkus positsioneerib end kui Java-stek Kubernetes'ile, ta on loodud vĂ€hendama Java rakenduste ja teenuste mĂ€lukasutust ja kĂ€ivitamise aega, ning seega suurendama nende tihedust hostis ning vĂ€hendama ĂŒldkulusid.

Quarkus toetab samuti automaatset genereerimist Kubernetes'i ressurside jaoks ja pakub juhenditest Kubernetesel ja Red Hat OpenShift'il juurutamise kohta. Lisaks genereerib Quarkus automaatselt Dockerfile.jvm (JVM pakendamine) ja Dockerfile.native (natiivne pakendamine) failid, mis on vajalikud konteinerite loomiseks.

Ja lĂ”puks, suunates Kubernetes'i kui sihtkeskkonda, ei kasuta Quarkus Java raamistikke, kui sarnast funktsionaalsust on vĂ”imalik rakendada Kubernetes'i platvormil. Tabelis 1 on esitatud Kubernetes'i ja tĂŒĂŒpiliste Java raamistike, mida Springi arendajad kasutavad, funktsionaalse vastavuse kaart.

Tabel 1. Java raamistike ja Kubernetes'i funktsionaalse vastavuse kaart.

Funktsionaalsus
TavapÀrane Spring Boot
Kubernetes

Teenuse avastamine
Eureka
DNS

Konfiguratsioon
Spring Cloud Config
Config Maps / Secrets

Laotamine
Ribbon (kliendi poolel)
Service, Replication Controller (serveri poolel)

Koodi kompileerimine ja kÀivitamine nÀitest

Selles artiklis viitame nÀidiste projektile, kus kasutatakse koos Springi ja MicroProfile'i API-sid ning isegi seda sama Java klassi. Selle nÀite koodi saab kompileerida ja kÀivitada kÀsurealt, lÀhemalt vt faili README.md.

Spring Frameworki API-d

SÔltuvuse sisestamine

Quarkus toetab mitmeid Context and Dependency Injection (CDI) API-sid ja Spring Dependency Injection (Spring DI) API-sid. Kui töötate MicroProfile'iga, Java EE ja Jakarta EE, olete juba hĂ€sti kursis CDI-iga. Teisest kĂŒljest saavad Springi arendajad kasutada Quarkus Extension for Spring DI API-d ĂŒhilduvuse tagamiseks Spring DI-ga. Toetatud Spring DI API kasutamise nĂ€iteid on toodud tabelis 2.

V projekti nĂ€ites kasutatakse nii CDI-d kui ka Springi sĂ”ltuvuste sĂŒstimist. Lisateavet ja nĂ€iteid selle kohta leiate Quarkuse juhendist, mis kannab nime Spring DI Guide.

Tabel 2. Toetatud Spring DI API-de kasutamise nÀited.

Toetatud Spring DI funktsioonid
NĂ€ited

Konstruktorite sĂŒstimine

public PersonSpringController(
   PersonSpringRepository personRepository,  // sĂŒstitud      
   PersonSpringMPService personService) {    // sĂŒstitud
      this.personRepository = personRepository;
      this.personService = personService;
}

VĂ€ljade sĂŒstimine
Autowired
VÀÀrtus

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

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

Teenused

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

   public String getPrefix() {
      return message;
   }
}

Veebiraamistik

MicroProfile kasutajad hindavad, et Quarkus toetab JAX-RS, MicroProfile Rest Client, JSON-P ja JSON-B kui peamist veebirakenduste mudelit. Springi arendajad on meeldivalt ĂŒllatunud Quarkusesse lisandunud Spring Web API toe ĂŒle, eriti REST-iga seotud liideste osas. Nagu Spring DI puhul, on Spring Web API toe peamine eesmĂ€rk see, et Springi arendajad saaksid kasutada Spring Web API liideseid koos MicroProfile API-dega. Toetatud Spring Web API-de kasutamise nĂ€ited on toodud tabelis 3 ning lisainfot ja nĂ€iteid selle kohta leiate Quarkuse juhendist, mille nimi on Spring Web Guide.

Tabel 3. Toetatud Spring Web API-de kasutamise nÀited.

Toetatud Spring Web funktsioonid
NĂ€ited

@RestController
@RequestMapping

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

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

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

Spring Data JPA

MicroProfilei kasutajatele meeldib ka see, et Quarkus toetab JPA-d Hibernate ORM-i abil. Head uudised on ka Spring-arendajatele: Quarkus toetab levinud Spring Data JPA annotatsioone ja tĂŒĂŒpe. Tabelis 4 on toodud nĂ€ited toetatud Spring Data JPA API-de kasutamisest.
V projekti nÀites kasutatakse Spring Data JPA API-sid ja lisainformatsioon on saadaval Quarkuse juhendis, mille pealkiri on Spring Data JPA juhend.

Tabel 4. NĂ€ited toetatud Spring Data JPA API-de kasutamisest.

Toetatud funktsioonid Spring Data JPA
NĂ€ited

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repository Fragments

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

Deriveeritud pÀringumeetodid

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Kasutaja mÀÀratud pÀringud

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-d

Vea taluvus (Fault tolerance)

TalitĂ”rje konstruktsioonid on ĂŒliolulised, et vĂ€ltida kaskaadset pĂ€randit ja luua usaldusvÀÀrseid mikroteenuste arhitektuure. Springi arendajad on juba aastaid kasutanud talitĂ”rjet millestki circuit-breaker. Hystrix. Kuid Hystrix pole juba pikka aega uuendatud, samas kui MicroProfile'i talitĂ”rje on aktiivselt arenenud ja sellel on juba mitme aasta tootmisest saadud kogemus. SeetĂ”ttu soovitatakse Quarkuses teenuste usaldusvÀÀrsuse tĂ”stmiseks kasutada MicroProfile'i talitĂ”rje API-sid, mille kasutamise nĂ€iteid on toodud tabelis 5. TĂ€iendavaid ĂŒksikasju leiate Quarkuse juhendist. TalitĂ”rje juhend.

Tabel 5. Toetatud MicroProfile'i talitÔrje API-de kasutamise nÀidised.

MicroProfile'i talitÔrje funktsioonid
Kirjeldus
NĂ€ited

@Asynchronous

Loogika tÀitmine eraldi lÔimes

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

@Bulkhead

Samaaegsete pÀringute arvu piiramine

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

@CircuitBreaker

Ahned tÔrgete kÀsitlemine ja taastumine

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

@Fallback

Alternatiivse loogika kutsumine tÔrke korral

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

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

Uuesti

Taaskatsumine tÔrke korral

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

Ooteaeg

TÔrke korral kontrolliaeg

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

Teenuste kontroll (Service Health)

Kubernetes platvormid jÀlgivad konteinerite tervislikkust spetsiaalsete teenuste abil. Alusplatvorm peab teenuseid jÀlgima, seetÔttu kasutavad Spring-arendajad tavaliselt kohandatud HealthIndicator ja Spring Boot Actuator. Quarkus'e puhul saab seda teha MicroProfile Health abil, mis vaikimisi teostab töövÔimekuse kontrolli (liveness check), kuid saab samuti seadistada nii töövÔimekuse kui ka valmisoleku (readiness) samaaegseks kontrollimiseks. Toetatud MicroProfile Health API-de kasutamise nÀited on esitatud tabelis 6, lisainformatsioon on toodud Quarkus'i juhendis. Tervisejuhend.

Tabel 6. Toetatud MicroProfile Health API-de kasutamise nÀited.

MicroProfile Health funktsioonid
Kirjeldus
NĂ€ited

@Liveness

Platvorm taaskÀivitab rikkis konteineriseeritud rakendused
LÔpp-punkt:
host:8080/health/live

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

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

@Valmidus

Platvorm ei suuna liiklust konteineriseeritud rakendustele, kui need ei ole valmis.
LÔpp-punkt:
host:8080/health/ready

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

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

MÔÔdikud

Rakendused provisioniseerivad mÔÔdikute vĂ”i operatiivsetes eesmĂ€rkides (SLA tulemuslikkuse jĂ€lgimiseks) vĂ”i mitteoperatiivsetes (Ă€ritulemuste SLA). Spring-arendajad provisioniseerivad mÔÔdikuid Spring Boot Actuatori ja Micrometer'i abil. Quarkus omakorda kasutab MicroProfile Metrics'i, et provisioniseerida pĂ”himeetriad (JVM ja operatsioonisĂŒsteem), mĂŒĂŒgi-mÔÔdikud (Quarkus) ja rakenduse mÔÔdikud. MicroProfile Metrics nĂ”uab, et rakendus toetaks vĂ€ljundiformaate JSON ja OpenMetrics (Prometheus). NĂ€ited MicroProfile Metrics API kasutamisest on toodud tabelis 7.

V projekti nÀites MicroProfile Metrics'i kasutatakse rakenduse mÔÔdikute provisioniseerimiseks. TÀiendavat teavet leiate Quarkus juhendist. MÔÔdikute juhend.

Tabel 7. MicroProfile Metrics API-de nÀidiste kasutamine.

MicroProfile Metrics funktsioonid
Kirjeldus
NĂ€ited

@Counted

TÀhistab count-eriteavitus, mis loendab mÀrgistatud objekti kutsumise arvu.

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

@ConcurrentGauge

TÀhistab gauge-eriala, mis loendab mÀrgistatud objekti paralleelseid kutsungeid.

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

@Gauge

TÀhistab gauge-eriala, mis mÔÔdab mÀrgistatud objekti vÀÀrtust.

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

@Metered

TÀhistab meter-eriala, mis jÀlgib mÀrgistatud objekti kutsumise sagedust.

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

MÔÔdik

Annotatsioon, mis sisaldab metaandmeid, kui esitatakse mÔÔdikute loomise vÔi muutmise pÀring.

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

Ajastatud

MÔÔdab ajastust, mis jÀlgib annotatiivse objekti kestust

@Timed(name = "TimedFallback",
   displayName="Ajastatud tagastus",
   description="Tagastamise viivitus")
public String salutationFallback() {
   return fallbackSalutation;
}

MÔÔdikute lÔpp-punktid (Metrics Endpoints)

Rakenduse mÔÔdikud localhost:8080/metrics/application
PÔhimÔÔdikud localhost:8080/metrics/base
Tehase mÔÔdikud localhost:8080/metrics/vendor
KÔik mÔÔdikud localhost:8080/metrics

Rest-klient MicroProfile

Mikroteenused pakuvad sageli RESTful lÔpp-punkte, millega toimetamiseks on vajalikud vastavad kliendi API-d. Springi arendajad kasutavad tavaliselt RestTemplate'i, kuid Quarkus pakub selle jaoks MicroProfile Rest Client API liideseid, mille kasutamise nÀidised on tabelis 8.

V projekti nÀites RESTful lÔpp-punktide kasutamine toimub MicroProfile Rest Client abil. Lisainfot ja nÀiteid selle kohta leiate Quarkuse juhendist. Rest Klientide Juhend.

Tabel 8. NĂ€ited MicroProfile Rest Client API liideste kasutamisest.

MicroProfile Rest Client funktsioonid
Kirjeldus
NĂ€ited

@RegisterRestClient

Registreerib tĂŒĂŒbitud Java liidese REST kliendina

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

@RestClient

TĂ€histab tĂŒĂŒbistatud REST-klientliidese eksemplari rakendamist

@Autowired // vÔi @Inject
@RestClient
MyRestClient restClient;

Kutse

Kutsed REST-lÔpp-punkti

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

mp-rest/url

MÀÀrab REST-lÔpp-punkti

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

KokkuvÔte

Selles blogis, mis on eelkĂ”ige kasulik Spring arendajatele, vaatame lĂŒhidalt, kuidas Quarkus'is kasutada Spring'iga seotud API-liideseid koos MicroProfile'i API-liidestega, et arendada Java mikroteenuseid ja seejĂ€rel kompileerida neid natiivseks binaarkoodiks, mis sÀÀstab sadu megabait mĂ€lu ja kĂ€ivitub mĂ”ne millisekundi jooksul.

Nagu te juba aru saite, on tÀiendavat teavet Spring'i ja MicroProfile'i API-liideste toetamise kohta ning hulgaliselt muud kasulikku teavet saadaval Quarkusi kÀsiraamatutes.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster