Tere kÔigile, ja see on kolmas postitus Quarkuse seeriast!

Java-mikroteenuste arendamisel arvatakse sageli, et ja on eraldi ja omavahel sĂ”ltumatud API-d. Ăldiselt kasutavad arendajad neid API-sid, millega nad juba harjunud on, kuna uute raamistike ja runtime-komponentide Ă”ppimine nĂ”uab palju aega. TĂ€na pĂŒĂŒame lihtsustada mĂ”nede populaarsete ja nĂ€itame, kuidas samal ajal kasutada Springi API-d ja uusi kasulikke vĂ”imalusi. .
Natukene tĂ€psemalt öeldes vaatame kĂ”igepealt ĂŒle, kuidas Quarkus toetab Springi API-liideseid, et nĂ€idata Springi arendajatele, kuidas saavad MicroProfile API-sid oma igapĂ€evases töös rakendada. Siis rÀÀgime MicroProfile API-dest, mis on kasulikud Springi arendajatele mikroteenuste loomisel.
Miks just Quarkus? Esiteks on see live coding, see tĂ€hendab, et MicroProfile API, Spring API ja teiste Java API muutuste automaatne uuesti laadimine toimub ĂŒhe kĂ€suga: mvn quarkus:dev. Teiseks, antud on Person teenus (mis kompileeritakse Springi, MicroProfile ja JPA API-dest binaarfailiks kasutades GraalVM-i natiivset pilti) kĂ€ivitatav vaid 0.055 sekundi jooksul ja vajab umbes 90 MB mĂ€lu (RSS) RESTful rakenduse lĂ”pp-punktis. Samuti saab selle kompileerimise teha ĂŒhe kĂ€suga: mvn package -Pnative.
Me ei hakka MicroProfile'i ĂŒksikasjadesse sĂŒvenema, vaid pĂŒĂŒame aidata Springi arendajatel mĂ”ista, kuidas Quarkuses saab kasutada Springi API-sid koos MicroProfile API-dega.
Konteinerid ja Kubernetes
Kuna ei tahaks seda artiklit ĂŒle koormata, vaatleme siin ainult kĂ”rgtaseme aspekte. Kuna see on oluline mĂ”ista. Quarkust positsioneeritakse Java-stĂ€kina Kubernetesile, mille eesmĂ€rk on minimeerida mĂ€lukulu ja Java rakenduste ja teenuste kĂ€ivitusaega, mis omakorda suurendab nende koha tihedust ja vĂ€hendab ĂŒldkulusid.
Quarkus toetab ka Kubernetes ressursse ja pakub Kubernetes ja Red Hat OpenShift platvormidele juurutamiseks. Lisaks genereerib Quarkus automaatselt Dockerfile.jvm (JVM pakendamine) ja Dockerfile.native (natiivne binaarpakendamine) failid, mis on vajalikud konteinerite loomiseks.
Ja lÔpuks, keskendudes Kubernetesile kui sihtkeskkonnale, ei kasuta Quarkus Java raamistikke olukordades, kus sarnane funktsionaalsus on rakendatud Kubernetes'i tasemel. Tabelis 1 on esitatud Kubernetes'i ja tavaliste Java raamistike, mida Spring arendajad kasutavad, funktsionaalne vastavuskaart.
Tabel 1. Java raamistike ja Kubernetes'i funktsionaalse vastavuse kaart.
Funktsionaalsus
Traditsiooniline Spring Boot
Kubernetes
Teenuse avastamine
Eureka
DNS
Seadistus
Spring Cloud Config
Config Maps / Secrets
Koormuse tasakaalustamine
Ribbon (kliendi poolel)
Teenuse, replikatsioonikontroller (serveri poolel)
Koodi kompileerimine ja kÀivitamine nÀitest
Selles artiklis viitame , 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, lisainfot vt README.md failist.
Spring Framework'i API-d
SĂ”ltuvuse sĂŒstimine
Quarkus toetab mitmeid ja Spring Dependency Injection (Spring DI) API-sid. Kui töötate MicroProfile'i, , siis olete juba CDI-ga hĂ€sti tuttav. Teisest kĂŒljest saavad Springi arendajad kasutada Quarkus Extension for Spring DI API, et tagada ĂŒhilduvus Spring DI-ga. Toetatud Spring DI API-de kasutamise nĂ€ited on esitatud tabelis 2.
Uues kasutatakse nii CDI-d kui ka Spring Dependency Injection'i. Lisainfot ja nÀiteid selle kohta leiate Quarkus'i juhendist, mille nimetus on .
Tabel 2. NĂ€ited toetatud Spring DI API-de kasutamisest.
Toetatud Spring DI funktsioonid
NĂ€ited
Constructor Injection
public PersonSpringController(
PersonSpringRepository personRepository, // sisse injectitud
PersonSpringMPService personService) { // sisse injectitud
this.personRepository = personRepository;
this.personService = personService;
}
Field Injection
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Configuration
@Configuration
public class AppConfiguration {
@Bean(name = "capitalizeFunction")
public StringFunction capitalizer() {
return String::toUpperCase;
}
}
@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
@Override
public String apply(String s) {
return s;
}
}
@Service
public class MessageProducer {
@Value("${greeting.message}")
String message;
public String getPrefix() {
return message;
}
}
Veebiraamistik
MicroProfile'i kasutajatele meeldib, et Quarkus toetab JAX-RS-i, MicroProfile Rest Client-i, JSON-P-d ja JSON-B-d peamise veebiprogrammeerimise mudelina. Spring-i arendajatele tuleb rÔÔmuna Quarkuse uus tugi Spring Web API-le, eriti REST-iga seotud liideste osas. Nagu Spring DI puhul, on Spring Web API toe peamine eesmÀrk, et Spring-i arendajad saaksid kasutada Spring Web API-sid koos MicroProfile API-dega. Toetatud Spring Web API-de kasutamise nÀited on esitatud tabelis 3, samas kui lisainfot ja nÀiteid selle teema kohta leiate Quarkuse juhendist, mille pealkiri on .
Tabel 3. Toetatud Spring Web API-de kasutamise nÀited.
Toetatud Spring Web omadused
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
MicroProfile'i kasutajatele meeldib ka, et Quarkus toetab JPA-d, kasutades Hibernate ORM-i. Ka Spring-i arendajatele on hĂ€id uudiseid: Quarkus toetab ĂŒldtunnustatud Spring Data JPA annotatsioone ja tĂŒĂŒpe. Toetatud Spring Data JPA API-de kasutamise nĂ€ited on toodud tabelis 4.
Uues kasutatakse Spring Data JPA API-sid, samas kui lisainformation on saadaval Quarkuse juhendis pealkirjaga .
Tabel 4. Toetatud Spring Data JPA API-de kasutamise nÀited.
Toetatud Spring Data JPA omadused
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 {
...
}
Derived query methods
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
Rikketolerantsus (Fault tolerance)
Veakuskonstruktsioonid on kriitilise tÀhtsusega, et vÀltida kaskaadvÔrke ja luua usaldusvÀÀrseid mikroteenuste arhitektuure. Spring-arendajad on juba aastaid kasutanud veakindlustamiseks circuit-breakereid. . Kuid Hystrix ei ole pikka aega uuendatud, samas kui MicroProfile'i vigaaktseptsioon on aktiivselt arenenud ja sellel on juba mitu aastat tootmises kasutamist. SeetÔttu soovitatakse Quarkuses teenuste usaldusvÀÀrsuse suurendamiseks kasutada MicroProfile Fault Tolerance API-sid, mille kasutusnÀiteid on esitatud tabelis 5. Lisainfot selle kohta leiate Quarkus'i juhendist. .
Tabel 5. NĂ€ited MicroProfile Fault Tolerance toetatavate API-de kasutamisest.
MicroProfile Fault Tolerance funktsioonid
Kirjeldus
NĂ€ited
@Asynchronous
Loogika tÀitmine eraldi niidis
@Asynchronous
@Retry
public Future getSalutation() {
...
return future;
}
@Bulkhead
Samaaegsete pÀringute arvu piiramine
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Nutikas tÔrgete töötlemine 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";
}
PÀringu ebaÔnnestumisel edasine proovimine
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Ooteaja kontrollimine ebaÔnnestumise korral
@Timeout(value = 500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Teenuste kontrollimine (Service Health)
Kubernetes platvormid jÀlgivad konteinerite tÔhusust spetsiaalsete teenuste abil. Et alampiirkond saaks teenuseid jÀlgida, kasutavad Spring-arendajad tavaliselt kohandatavaid HealthIndicator ja Spring Boot Actuator. Quarkuses saab seda teha MicroProfile Health abil, mis vaikimisi teostab töövÔimekuse kontrollimist (liveness check), kuid saab seadistada ka samaaegseks liveness ja readiness (valmiduse) kontrollimiseks. NÀited toetatud MicroProfile Health API kasutamisest on esitatud tabelis 6 ning lisainformatsioon on esitatud Quarkus'i juhendis. .
Tabel 6. NĂ€ited MicroProfile Health toetatavate API-de kasutamisest.
MicroProfile Health funktsioonid
Kirjeldus
NĂ€ited
@Liveness
Platvorm taaskÀivitab riknenud konteineriseeritud rakendused
LÔpp-punkt:
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
Platvorm ei suuna liiklust konteinerisse, kui see ei ole valmis
LÔpp-punkt:
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ÔÔtmised
Rakendused pakuvad mÔÔdikuid kas operatiivsetel eesmĂ€rkidel (SLA-taseme jĂ”udluse jĂ€lgimine) vĂ”i mitteoperatiivsetel eesmĂ€rkidel (Ă€ri-SLA mÔÔdikud). Spring-arendajad pakuvad mÔÔdikuid Spring Boot Actuator'i ja Micrometeri kaudu. Quarkus kasutab omakorda MicroProfile Metrics'i, et anda esmaseid mÔÔdikuid (JVM ja opsĂŒsteem), teenusepakkuja mÔÔdikud (Quarkus) ja rakenduse mÔÔdikud. MicroProfile Metrics nĂ”uab, et rakendus toetaks vĂ€ljundvorminguid JSON ja OpenMetrics (Prometheus). NĂ€iteid MicroProfile Metrics API kasutamisest on esitatud tabelis 7.
Uues MicroProfile Metrics kasutatakse rakenduse mÔÔdikute esitamiseks. TÀiendavaid andmeid leiate Quarkuse juhendist .
Tabel 7. NĂ€ited MicroProfile Metrics API kasutamisest.
MicroProfile Metrics'i funktsioonid
Kirjeldus
NĂ€ited
@Counted
MÀÀrab teadaande counter, mis loendab antud objekti kÔnesid
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
MÀÀrab teadaande gauge, mis loendab antud objekti paralleelseid kÔnesid
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
MÀÀrab teadaande gauge, mis mÔÔdab antud objekti vÀÀrtust
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
MÀÀrab teadaande meter, mis jÀlgib antud objekti kÔne sagedust
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Annotatsioon, mis sisaldab teavet metaandmete kohta, mil rakendatakse mÔÔdiku loomise vÔi saatmise pÀring
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
MÀÀrab ajasturi, mis jÀlgib antud objekti kestust
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Metrika lÔpp-punktid (Metrics Endpoints)
Rakenduste metrikad :8080/metrics/application
PÔhimetriika :8080/metrics/base
Teenusepakkuja metrikad :8080/metrics/vendor
KÔik metrikad :8080/metrics
MicroProfile REST klient
Mikroteenused pakuvad sageli RESTful lĂ”pp-punkte, mille jaoks on vajalikud vastavad kliendiliidese API-d. RESTful lĂ”pp-punktide kasutamiseks kasutavad Springi arendajad tavaliselt RestTemplate'i. Quarkus pakub selle ĂŒlesande lahendamiseks MicroProfile REST Client'i API-liideseid, mille kasutamise nĂ€ited on toodud tabelis 8.
Uues RESTful lÔpp-punktide kasutamine toimub MicroProfile REST Client'i abil. Lisateavet ja nÀiteid selle teema kohta leiate Quarkus'i juhendist .
Tabel 8. NĂ€ited MicroProfile REST Client'i API-liideste kasutamisest.
MicroProfile REST Client'i 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
MĂ€rgistab tĂŒĂŒbitud REST klientliidese eksemplari sisestamise
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Kutsumine
Kutsuda REST lÔpp-punkt
System.out.println(
restClient.getSalutation());
mp-rest/url
MÀÀratleb REST lÔpp-punkti
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Summary
Selles blogis, mis on ennekĂ”ike kasulik Spring arendajatele, vaatame lĂŒhidalt, kuidas Quarkus kasutada Springi API-liideseid koos MicroProfile API-liideseid, et arendada Java mikroteenuseid ja seejĂ€rel kompileerida need kohandatud binaarkoodiks, mis sÀÀstab sadu megabaite mĂ€lu ja kĂ€ivitub mĂ”ne millisekundi jooksul.
Nagu te juba aru saite, leidub tÀiendavat teavet Springi ja MicroProfile API-liidese toetuse kohta, samuti palju muud kasulikku teavet .
Allikas: habr.com
