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
