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

Java mikroteenuste arendamisel arvatakse sageli, et ja 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 ja nĂ€itame, kuidas saame samaaegselt kasutada Spring API ja uusi kasulikke funktsioone. .
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 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 , 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 Kubernetes'i ressurside jaoks ja pakub 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 , 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 ja Spring Dependency Injection (Spring DI) API-sid. Kui töötate MicroProfile'iga, , 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 kasutatakse nii CDI-d kui ka Springi sĂ”ltuvuste sĂŒstimist. Lisateavet ja nĂ€iteid selle kohta leiate Quarkuse juhendist, mis kannab nime .
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
@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 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 .
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 kasutatakse Spring Data JPA API-sid ja lisainformatsioon on saadaval Quarkuse juhendis, mille pealkiri on .
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. . 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. .
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";
}
Taaskatsumine tÔrke korral
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
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. .
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 MicroProfile Metrics'i kasutatakse rakenduse mÔÔdikute provisioniseerimiseks. TÀiendavat teavet leiate Quarkus juhendist. .
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;
}
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;
}
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 :8080/metrics/application
PÔhimÔÔdikud :8080/metrics/base
Tehase mÔÔdikud :8080/metrics/vendor
KÔik mÔÔdikud :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 RESTful lÔpp-punktide kasutamine toimub MicroProfile Rest Client abil. Lisainfot ja nÀiteid selle kohta leiate Quarkuse juhendist. .
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 .
Allikas: habr.com
