Tere kõigile ja tere tulemast Quarkuse sarja kolmandasse postitusse!

Java mikroteenuste arendamisel eeldatakse sageli, et и – on eraldi ja sõltumatud API-d. Vaikimisi kipuvad programmeerijad kasutama API-sid, millega nad on juba harjunud, kuna uute raamistike ja käitusaja komponentide õppimine võtab palju aega. Täna püüame lihtsustada mõne populaarse õppimist ja näita, kuidas kasutada nii Spring API-t kui ka uusi kasulikke funktsioone samaaegselt .
Veidi üksikasjalikumalt käsitleme kõigepealt Quarkuse Spring API-de toetamise ulatust ja üksikasju, et näidata Springi arendajatele, kuidas MicroProfile API-t oma igapäevatöös kasutada. Seejärel käsitleme MicroProfile API-sid, mis Springi arendajatele mikroteenuste loomisel kasulikud on.
Miks Quarkus? Esiteks on see reaalajas kodeerimine, st MicroProfile API, Spring API ja teiste Java API-de muudatuste automaatne uuestilaadimine, mida tehakse vaid ühe käsuga: mvn quarkus:dev. Teiseks, Personi teenus (kompileeritud Springi, MicroProfile'i ja JPA API-dest binaarfailiks, kasutades natiivset GraalVM-i kujutist) käivitub kõigest 0.055 sekundiga ja võtab RESTfuli rakenduse lõpp-punktis umbes 90 MB mälu (RSS). Ja selle kompileerimine ise toimub vaid ühe käsuga: mvn package -Pnative.
Me ei süvene MicroProfile'i üksikasjadesse, kuid püüame aidata Springi arendajatel mõista, kuidas Springi API-sid saab Quarkuses koos MicroProfile'i API-dega kasutada.
Konteinerid ja Kubernetes
Selle artikli ülekoormamise vältimiseks käsitleme siin ainult tugiteenuste üldisi aspekte. , sest seda on oluline mõista. Quarkus on Kubernetesi jaoks Java-virn, mis on loodud Java-rakenduste ja -teenuste mälutarbimise ja käivitusaja minimeerimiseks ning selle tulemusel nende tiheduse suurendamiseks hostis ja üldkulude vähendamiseks.
Quarkus ka Kubernetes'i ressursid ja pakkumised Kubernetes ja Red Hat OpenShift platvormidel juurutamiseks. Lisaks genereerib Quarkus automaatselt konteinerite loomiseks vajalikud Dockerfile.jvm (JVM-pakend) ja Dockerfile.native (natiivne binaarpakend) failid.
Lõpuks, kuna Quarkus on juurutuskeskkonnana suunatud Kubernetesele, ei kasuta see Java raamistikke juhtudel, kus sarnane funktsionaalsus on rakendatud Kubernetesi platvormi tasandil. Tabel 1 annab funktsionaalse vastenduse Kubernetesi ja Springi arendajate poolt kasutatavate tüüpiliste Java raamistike vahel.
Tabel 1. Java raamistike ja Kubernetes'i funktsionaalse vastavuse kaart.
Funktsionaalne
Traditsiooniline vedrusaabas
Kubernetes
Teenuse avastamine
Eureka
DNS
konfiguratsioon
Spring Cloudi konfiguratsioon
Konfiguratsioonikaardid / saladused
Koormuse tasakaalustamine
Lint (kliendi pool)
Teenus, replikatsioonikontroller (serveripoolne)
Näidiskoodi kompileerimine ja käivitamine
Selles artiklis viitame , mis kasutab koos Springi ja MicroProfile'i API-sid ning isegi seda Java klassi. Selle näite koodi saab kompileerida ja käivitada käsurealt, üksikasju vaadake failist README.md.
Spring Frameworki API-d
Sõltuvuse süstimine
Quarkus toetab laia valikut ja Spring Dependency Injection (Spring DI) API-d. Kui töötate MicroProfile'iga, , siis olete CDI-ga juba tuttav. Teisest küljest saavad Springi arendajad kasutada Spring DI API jaoks mõeldud Quarkuse laiendust, et tagada ühilduvus Spring DI-ga. Toetatud Spring DI API-de kasutamise näited on toodud tabelis 2.
В Kasutatakse nii CDI-d kui ka Spring Dependency Injectioni. Lisateavet ja näiteid selle teema kohta leiate Quarkuse käsiraamatust nimega .
Tabel 2. Näited toetatud Spring DI API-de kasutamisest.
Toetatud Spring DI funktsioonid
näited
Konstruktori süstimine
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Väljasüst
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Konfiguratsioon
@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 kasutajad hindavad seda, et Quarkus toetab peamise veebiprogrammeerimismudelina JAX-RS-i, MicroProfile Rest Clienti, JSON-P-d ja JSON-B-d. Springi arendajad on rõõmsad, et Quarkus lisas hiljuti toe Spring Web API-dele, eriti REST-teadlikele liidestele. Sarnaselt Spring DI-ga on Spring Web API toe peamine eesmärk võimaldada Springi arendajatel kasutada Spring Web API-sid koos MicroProfile API-dega. Toetatud Spring Web API-de kasutamise näited on esitatud tabelis 3 ning lisateavet ja näiteid leiate Quarkuse juhendist nimega .
Tabel 3. Näited toetatud Spring Web API-de kasutamisest.
Spring Webi toetatud funktsioonid
näited
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@KüpsiseValue
@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 kasutajad hindavad ka seda, et Quarkus toetab JPA-d Hibernate ORM-i kaudu. Head uudised Springi arendajatele: Quarkus toetab tavalisi Spring Data JPA annotatsioone ja tüüpe. Näiteid toetatud Spring Data JPA API-de kasutamise kohta on toodud tabelis 4.
В Kasutatakse Spring Data JPA API-sid ja lisateavet leiate Quarkuse juhendist nimega .
Tabel 4. Näited toetatud Spring Data JPA API-de kasutamisest.
Spring Data JPA toetatud funktsioonid
näited
CrudRepositorio
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Hoidla
JpaRepositoorium
Leheküljendus- ja sortimishoidla
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Hoidla fragmendid
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Tuletatud 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ääratletud 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);
}
Mikroprofiili API-d
Veakindlus
Rikketaluvuse konstruktsioonid on olulised kaskaadvigade vältimiseks ja robustsete mikroteenuste arhitektuuride loomiseks. Springi arendajad on rikketaluvuse tagamiseks kaitselüliteid aastaid kasutanud. Siiski pole Hystrixit pikka aega uuendatud, samas kui MicroProfile'i rikketaluvus on praegu aktiivselt arenduses ja sellel on mitu aastat tootmiskasutust. Seetõttu on Quarkuse teenuste usaldusväärsuse parandamiseks soovitatav kasutada MicroProfile'i rikketaluvuse API-sid, mille näited on toodud tabelis 5. Lisateavet selle kohta leiate Quarkuse käsiraamatust. .
Tabel 5. Näited toetatud MicroProfile'i rikketaluvuse API-de kasutamisest.
MicroProfile'i rikketaluvuse funktsioonid
Kirjeldus
näited
@Asünkroonne
Loogika käivitamine eraldi lõimes
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Bulkhead
Samaaegsete päringute arvu piiramine
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Nutikas rikete käsitlemine ja rikete taastamine
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Varuvariant
Alternatiivse loogika kutsumine ebaõnnestumise korral
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Proovi uuesti taotluse nurjumisel
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Rikke jälgimise ajalõpp
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Teenuse tervisekontroll
Kubernetes platvormid jälgivad konteinerite tervist spetsiaalsete teenuste abil. Selleks, et alusplatvorm saaks teenuseid jälgida, kasutavad Springi arendajad tavaliselt konfigureeritavat HealthIndicatorit ja Spring Boot Actuatorit. Quarkuses saab seda teha MicroProfile Healthi abil, mis vaikimisi teostab reaalajas kontrolli, kuid mida saab konfigureerida nii, et see kontrolliks samaaegselt nii reaalajas olekut kui ka valmisolekut. Toetatud MicroProfile Health API-de kasutamise näited on esitatud tabelis 6 ja lisateavet leiate Quarkuse juhendist. .
Tabel 6. Toetatud MicroProfile Health API-de kasutamise näited.
MicroProfile Healthi funktsioonid
Kirjeldus
näited
@Liveness
Platvorm taaskäivitab katkised konteinerdatud rakendused
Lõpp-punkt:
host:8080/tervis/live
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Valmisolek
Platvorm ei saada konteinerdatud rakendusele liiklust, kui see pole valmis.
Lõpp-punkt:
host: 8080/tervis/valmis
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Mõõdikud
Rakendused avaldavad mõõdikuid kas operatiivsetel (jõudluse SLA jälgimine) või mitteoperatiivsetel (äri SLA mõõdikud) eesmärkidel. Springi arendajad avaldavad mõõdikuid Spring Boot Actuatori ja Micrometeri abil. Quarkus omakorda kasutab MicroProfile Metricsi baasmõõdikute (JVM ja OS), tarnija mõõdikute (Quarkus) ja rakenduse mõõdikute avaldamiseks. MicroProfile Metrics nõuab, et implementatsioon toetaks JSON-i ja OpenMetricsi (Prometheus) väljundvorminguid. MicroProfile Metricsi API kasutamise näited on esitatud tabelis 7.
В Mikroprofiili mõõdikuid kasutatakse rakenduse mõõdikute esitamiseks. Lisateavet leiate Quarkuse käsiraamatust. .
Tabel 7. Näited MicroProfile Metrics API-de kasutamisest.
MicroProfile'i mõõdikute funktsioonid
Kirjeldus
näited
@Loetud
Näitab loendurit, mis loendab, mitu korda annoteeritud objekti kutsutakse.
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Tähistab mõõdikut, mis loendab annoteeritud objektile tehtud paralleelsete kõnede arvu.
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
Tähistab mõõdikut, mis mõõdab märgitud objekti väärtust.
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Mõõdetud
Tähistab mõõdikut, mis jälgib annoteeritud objekti kutsumise sagedust.
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Mõõdiku lisamise või genereerimise taotluse saamisel metaandmetega seotud märkus
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Tähistab taimerit, mis jälgib märkustega objekti kestust.
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Mõõdikute lõpp-punktid
Rakenduse mõõdikud :8080/mõõdikud/rakendus
Põhinäitajad :8080/metrics/base
Tarnija mõõdikud :8080/mõõdikud/müüja
Kõik mõõdikud :8080/meetrika
MicroProfile'i puhkeoleku klient
Mikroteenused pakuvad sageli RESTfuli lõpp-punkte, mis vajavad töötamiseks vastavaid kliendi API-sid. RESTfuli lõpp-punktide kasutamiseks kasutavad Springi arendajad tavaliselt RestTemplate'i. Quarkus seevastu pakub selleks ülesandeks MicroProfile'i REST-kliendi API-sid, mille näited on toodud tabelis 8.
В RESTfuli lõpp-punkte kasutatakse MicroProfile'i Rest Clienti abil. Lisateavet ja näiteid selle teema kohta leiate Quarkuse käsiraamatust. .
Tabel 8. Näited MicroProfile'i Rest Clienti API-de kasutamisest.
MicroProfile'i Rest kliendi funktsioonid
Kirjeldus
näited
@RegisterRestClient
Registreerib trükitud Java-liidese REST-kliendina
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Tähistab tüüpitud REST-kliendiliidese eksemplari süstimist
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Kutsumine
Kutsub välja 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
Tulemused
Selles blogipostituses, mis on mõeldud peamiselt Springi arendajatele, vaatasime lühidalt, kuidas Quarkus kasutab Springi API-sid koos MicroProfile'i API-dega Java mikroteenuste arendamiseks ja seejärel nende kompileerimiseks natiivseteks binaarfailideks, mis säästavad sadu megabaite muutmälu ja käivituvad millisekunditega.
Nagu näete, leiate lisateavet Springi ja MicroProfile'i API toe kohta ning palju muud kasulikku teavet siit .
Allikas: www.habr.com
