Përshëndetje të gjithëve, dhe këtu është postimi i tretë nga seria mbi Quarkus!

Në zhvillimin e mikrosherbimeve Java shpesh konsiderohet se dhe është një grup API-sh të veçanta dhe të pavarura nga njëra-tjetra. Në mënyrë të paracaktuar, programuesit zakonisht përdorin ato API që ata tashmë janë mësuar, pasi të mësuarit e framework-eve të rinj dhe komponenteve të runtime-it kërkon shumë kohë. Sot do të përpiqemi ta thjeshtojmë mësimin e disa API-ve të njohura dhe do të tregojmë se si të përfshihen njëkohësisht API-të e Spring dhe mundësitë e reja të dobishme .
Nëse shohim më në detaje, së pari do të shqyrtojmë fushën e aplikacionit dhe detajet e mënyrës se si Quarkus mbështet API-të e Spring, për të treguar zhvilluesve të Spring se si mund të përdorin API-të e MicroProfile në punën e tyre të përditshme. Më pas do të flasim për API-të e MicroProfile që do t'u duhen zhvilluesve të Spring për ndërtimin e mikrosherbimeve.
Pse pikërisht Quarkus? Së pari, kjo është kodim në kohë reale (live coding), do të thotë riformatimi automatik i çdo ndryshimi në API-të MicroProfile, API-të e Spring dhe API të tjera Java, që realizohet vetëm me një komandë: mvn quarkus:dev. Së dyti, shembulli që shqyrtojmë në shërbimi Person (ai kompilon nga API-të e Spring, MicroProfile dhe JPA në një skedar binar duke përdorur imazhin natyral GraalVM) starton për vetëm 0.055 sekonda dhe konsumon rreth 90 MB në memorien operative (RSS) në pikën fundore të aplikacionit RESTful. Për më tepër, vetë kompilimi i tij kryhet me vetëm një komandë: mvn package -Pnative.
Nuk do të thellohemi në detajet e MicroProfile, por do të përpiqemi të ndihmojmë zhvilluesit e Spring të kuptojnë se si Quarkus mund të përdorë API-të e Spring së bashku me API-të e MicroProfile.
Kontejnerët dhe Kubernetes
Për të mos e ngarkuar këtë artikull, këtu do të shqyrtojmë vetëm aspektet me nivel të lartë të mbështetjes , pasi kjo është e rëndësishme për t'u kuptuar. Quarkus pozicionohet si një stack Java për Kubernetes, ai është i destinuar të minimizojë konsumin e memorie dhe kohën e startit të aplikacioneve dhe shërbimeve Java, dhe, si pasojë, të rrisë densitetin e vendosjes së tyre në host dhe të zvogëlojë shpenzimet totale.
Quarkus gjithashtu e burimeve Kubernetes dhe ofron për implementimin në platformat Kubernetes dhe Red Hat OpenShift. Për më tepër, Quarkus automatikisht gjeneron skedarët Dockerfile.jvm (paketimi JVM) dhe Dockerfile.native (paketimi i binarëve natyral), të nevojshëm për krijimin e kontejnerëve.
Dhe sĂ« fundmi, duke u orientuar nĂ« Kubernetes si mjedisin e synuar pĂ«r shpĂ«rndarjen, Quarkus nuk pĂ«rdor framework-e Java nĂ« ato raste kur funksionaliteti i ngjashĂ«m Ă«shtĂ« realizuar nĂ« nivelin e vetĂ« плаŃŃĐŸŃĐŒĂ«s Kubernetes. NĂ« tabelĂ«n 1 Ă«shtĂ« paraqitur harta e pĂ«rputhshmĂ«risĂ« funksionale midis Kubernetes dhe framework-eve tipike Java qĂ« pĂ«rdoren nga zhvilluesit e Spring.
Tabela 1. Harta e përputhshmërisë funksionale midis framework-eve Java dhe Kubernetes.
Funksionaliteti
Spring Boot tradicionale
Kubernetes
Zbulimi i shërbimeve
Eureka
DNS
Konfigurimi
Spring Cloud Config
Config Maps / Secrets
Balancimi i ngarkesës
Ribbon (në anën e klientit)
Shërbimi, Replication Controller (në anën e serverit)
Kompilimi dhe ekzekutimi i kodit nga shembulli
Në këtë artikull ne referohemi në , ku përdoren së bashku API-të e Spring dhe MicroProfile dhe madje edhe ai Java klasë. Kodi nga ky shembull mund të komilohet dhe ekzekutohet nga linja e komandës, shihni skedarin README.md për më shumë detaje.
API-të e Spring Framework
Dependency Injection
Quarkus mbështet një gamë të gjerë dhe API-të e Injeksionit të Varësisë të Spring (Spring DI). Nëse punoni me MicroProfile, , do të jeni tashmë mirë të njohur me CDI. Në anën tjetër, zhvilluesit e Spring mund të përdorin Quarkus Extension për API-në e Spring DI për të siguruar përputhshmëri me Spring DI. Shembujt e përdorimit të API-ve të mbështetur të Spring DI paraqiten në tabelën 2.
Në përdoret si CDI ashtu edhe Injeksioni i Varësisë i Spring. Informacione të tjera dhe shembuj mbi këtë temë mund të gjenden në udhëzimin e Quarkus, i cili quhet .
Tabela 2. Shembuj të përdorimit të API-ve të mbështetur të Spring DI.
Funksionet e mbështetura të Spring DI
Shembuj
Injeksioni i Konstruktorit
public PersonSpringController(
PersonSpringRepository personRepository, // injektuar
PersonSpringMPService personService) { // injektuar
this.personRepository = personRepository;
this.personService = personService;
}
Injeksioni i Fushës
@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;
}
}
Korniza e uebit
Përdoruesit e MicroProfile do të pëlqejnë se Quarkus mbështet JAX-RS, MicroProfile Rest Client, JSON-P dhe JSON-B si modelin kryesor të programimit të uebit. Disa zhvillues të Spring do të gëzohen nga mbështetje e sapo shfaqur për Spring Web API në Quarkus, veçanërisht për ndërfaqet që trajtojnë REST. Në përputhje me DI-në e Spring, qëllimi kryesor i mbështetjes së Spring Web API është që zhvilluesit e Spring të mund të përdorin ndërfaqet e Spring Web së bashku me ato të MicroProfile. Shembujt e përdorimit të Spring Web API të mbështetur jepen në tabelën 3, dhe informacion të mëtejshëm dhe shembuj mbi këtë temë mund të gjenden në udhëzimin e Quarkus të quajtur .
Tabela 3. Shembuj të përdorimit të ndërfaqeve të mbështetura të Spring Web.
Funksionet e mbështetura të Spring Web
Shembuj
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (pjese)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Spring Data JPA
Përdoruesit e MicroProfile gjithashtu do të gëzohen se Quarkus mbështet JPA duke përdorur Hibernate ORM. Lajme të mira ka edhe për zhvilluesit e Spring: Quarkus mbështet annotimet dhe llojet e zakonshme të Spring Data JPA. Shembujt e përdorimit të API-ve të mbështetur të Spring Data JPA jepen në tabelën 4.
Në përdoren interfecet e Spring Data JPA, ndërsa informacioni shtesë është në dispozicion në udhëzimin e Quarkus të titulluar .
Tabela 4. Shembuj të përdorimit të ndërfaqeve të mbështetura të Spring Data JPA.
Funksionet e mbështetura të Spring Data JPA
Shembuj
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Repository
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Repozitoret Fragment
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Metoda të derivate të pyetjeve
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Pyetje të përcaktuara nga përdoruesi
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);
}
API-të e MicroProfile
Përballueshmëria (Hetimi i gabimeve)
Struktura e tolerancës ndaj defekteve është shumë e rëndësishme për të parandaluar dështime kaskadë dhe për të krijuar arkitektura mikrosherish më të besueshme. Zhvilluesit e Spring e kanë përdorur për shumë vite për tolerancën ndaj defekteve circuit-breaker. . Megjithatë, Hystrix nuk është përditësuar për një kohë të gjatë, ndërsa toleranca e defekteve të MicroProfile tashmë po zhvillohet aktivisht dhe ka disa vite përvojë në prodhim. Prandaj, për të rritur besueshmërinë e shërbimeve në Quarkus, rekomandohet të përdoren ndërfaqet e API-t të MicroProfile Fault Tolerance, shembujt e të cilëve jepen në tabelën 5. Informacione të tjera mbi këtë mund të gjenden në udhëzuesin Quarkus. .
Tabela 5. Shembuj të përdorimit të ndërfaqeve të API-t të mbështetur nga MicroProfile Fault Tolerance.
Funksionet e MicroProfile Fault Tolerance
Përshkrimi
Shembuj
@Asynchronous
Ekzekutimi i logjikës në një thread të veçantë
@Asynchronous
@Retry
public Future getSalutation() {
...
return future;
}
@Bulkhead
Kufizimi i numrit të kërkesave të njëkohshme
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Trajtimi inteligjent i dështimeve dhe rikuperimi pas dështimeve
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Fallback
Thirrja e logjikës alternative në rast dështimi
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Riprovim në rast dështimi të kërkesës
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Kontrolli i kohës së pritjes në rast dështimi
@Timeout(value = 500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Kontrolli i shërbimeve (Shëndeti i Shërbimit)
Platformat Kubernetes monitorojnë shëndetin e kontejnerëve përmes shërbimeve speciale. Kështu që platforma e poshtme të mund të monitorojë shërbimet, zhvilluesit e Spring zakonisht përdorin HealthIndicator të personalizuar dhe Spring Boot Actuator. Në Quarkus, kjo mund të bëhet përmes MicroProfile Health, që normalisht kryen kontrollin e aktivitetit (liveness check), por mund të konfigurrohet edhe për kontrollin e aktivitetit dhe gatishmërisë (readiness check) në të njëjtën kohë. Shembujt e përdorimit të API-ve të mbështetura nga MicroProfile Health jepen në tabelën 6, dhe informacione të tjera janë të dhëna në udhëzuesin Quarkus. .
Tabela 6. Shembuj të përdorimit të ndërfaqeve të API-t të mbështetur nga MicroProfile Health.
Funksionet e MicroProfile Health
Përshkrimi
Shembuj
@Liveness
Platforma kryen ri-ngarkimin e aplikacioneve të kontejnerizuara që nuk punojnë
Endpoint:
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
Platforma nuk do dërgojë trafik te aplikacionet e containerizuar në rast se ato nuk janë gati
Endpoint:
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();
}
Metrikat
Aplikacionet ofrojnë metrika ose në qëllime operative (për monitorimin e SLA-ve të performancës), ose në ato jo-operative (metrika të biznesit SLA). Zhvilluesit e Spring ofrojnë metrika përmes Spring Boot Actuator dhe Micrometer. Ndërkohë, Quarkus përdor MicroProfile Metrics për ofrimin e metrikeve themelore (JVM dhe sistemi operativ), metrikë të furnizuesve (Quarkus) dhe metrika të aplikacioneve. MicroProfile Metrics kërkon që implementimi të mbështesë formatet e daljes JSON dhe OpenMetrics (Prometheus). Shembujt e përdorimit të API-së MicroProfile Metrics jepen në tabelën 7.
Në MicroProfile Metrics përdoren për ofrimin e metrikeve të aplikacionit. Informacione të mëtejshme mund të gjenden në udhëzimin e Quarkus .
Tabela 7. Shembujt e përdorimit të API-ve për MicroProfile Metrics.
Veçoritë e MicroProfile Metrics
Përshkrimi
Shembuj
@Counted
Shënon një numërues, që numëron numrin e thirrjeve të objektit të annotuar
@Counted(name = "fallbackCounter",
displayName = "Numëruesi i Fall-back",
description = "Numëruesi i Fall-back")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Shënon një matës, që numëron numrin e thirrjeve paralele të objektit të annotuar
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Matësi i Fall-back",
description="Matësi i Fall-back")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
Shënon një matës, që mat vlerën e objektit të annotuar
@Metered(name = "FallbackGauge",
displayName="Matësi i Fall-back",
description="Frekuenca e Fall-back")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Shënon një matës, që ndjek frekuencën e thirrjes së objektit të annotuar
@Metered(name = "MeteredFallback",
displayName="Matësi i Fall-back",
description="Frekuenca e Fall-back")
public String salutationFallback() {
return fallbackSalutation;
}
Annotimi që përmban informacion mbi metadata, kur bëhet kërkesë për të futur ose prodhuar metrikën
@Metric
@Metered(name = "MeteredFallback",
displayName="Matësi i Fall-back",
description="Frekuenca e Fall-back")
public String salutationFallback() {
return fallbackSalutation;
}
Shënon një timer që ndjek kohëzgjatjen e objektit të annotuar
@Timed(name = "TimedFallback",
displayName="Timed FallBack",
description="Përgjigje vonesë")
public String salutationFallback() {
return fallbackSalutation;
}
Pikat e metriksave (Metrics Endpoints)
Metrikat e aplikacioneve :8080/metrics/application
Metrikat bazë :8080/metrics/base
Metrikat e ofruesve :8080/metrics/vendor
TĂ« gjitha metrikat :8080/metrics
Rest-klienti MicroProfile
Mikrosherbimet shpesh ofrojnë pika RESTful, për të cilat kërkohen API përkatëse klienti. Për të përdorur pikat RESTful, zhvilluesit e Spring zakonisht përdorin RestTemplate. Quarkus ofron për zgjidhjen e kësaj problemi API-të e MicroProfile Rest Client, shembuj të përdorimit të të cilave jepen në tabelën 8.
Në përdorimi i pikave RESTful realizohet me MicroProfile Rest Client. Informacione të mëtejshme dhe shembuj rreth kësaj mund të gjenden në udhëzuesin Quarkus. .
Tabela 8. Shembuj të përdorimit të API-të e MicroProfile Rest Client.
Funksionet e MicroProfile Rest Client
Përshkrimi
Shembuj
@RegisterRestClient
Regjistron një ndërfaqe të tipizuar Java si klient REST
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Shënon injektimin e një instance të ndërfaqes tipizuar të klientit REST
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Thirrje
Thërret pikën e REST
System.out.println(
restClient.getSalutation());
mp-rest/url
Përcakton pikën e REST
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Përfundime
Në këtë blog, që është kryesisht i dobishëm për zhvilluesit e Spring, ne e shqyrtova shkurtimisht se si në Quarkus të përdoren API-të e Spring së bashku me API-të e MicroProfile për të zhvilluar mikrosherbime Java dhe më pas t'i kompilojmë ato në kod të natyrshëm, që kursen qindra megabajt të RAM-it dhe e ngarkon për disa milisekonda.
Siç keni kuptuar, informacion të mëtejshëm mbi mbështetje për API-të e Spring dhe MicroProfile, si edhe një mori informacioni tjetër të dobishëm mund të gjenden në .
Burimi: habr.com
