Përshëndetje të gjithëve, dhe ja postimi i tretë nga seria rreth Quarkus!

Kur zhvilloni mikroshërbime Java, shpesh mendoni se dhe është një grup API-sh të ndara dhe të pavarura nga njëra-tjetra. Si rregull, programuesit zakonisht përdorin ato API që janë mësuar me to, pasi studimi i kornizave të reja dhe komponenteve runtime kërkon shumë kohë. Sot do të përpiqemi të thjeshtojmë mësimin e disa API-ve të njohura dhe do të tregojmë se si të angazhojmë njëkohësisht API-të e Spring dhe mundësitë e reja të dobishme .
Nëse shkojmë pak më në detaje, së pari do të shqyrtojmë fushën e aplikimit dhe detajet e mënyrës se si Quarkus mbështet API-të e Spring, për t'u treguar zhvilluesve të Spring se si të aplikojnë API-të MicroProfile në punën e tyre të përditshme. Më pas do të flasim për API-të MicroProfile, të cilat do t'i ndihmojnë zhvilluesit e Spring në krijimin e mikroshërbimeve.
Pse pikërisht Quarkus? Së pari, është kodim i gjallë (live coding), domethënë ajo që ndodh automatikisht është rikthimi i çdo ndryshimi në API-të MicroProfile, API-të Spring dhe API-të e tjera Java, që kryhet me një komandë të vetme: mvn quarkus:dev. Së dyti, që po 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 brenda 0.055 sekondash dhe konsumon rreth 90 MB në memorie (RSS) në pikën përfundimtare të aplikacionit RESTful. Kompilimi i tij realizohet me një komandë të vetme: mvn package -Pnative.
Nuk do të thellohemi në detajet e MicroProfile, por do të mundohemi të ndihmojmë zhvilluesit e Spring të kuptojnë se si mund të përdoren API-të e Spring në Quarkus së bashku me API-të e MicroProfile.
Kontenierët dhe Kubernetes
Për të mos e mbingarkuar këtë artikull, ne do të shqyrtojmë këtu vetëm aspektet e nivelit të lartë të mbështetjes , pasi kjo është e rëndësishme për t'u kuptuar. Quarkus pozicionohet si një stek Java për Kubernetes, e cila ka për qëllim të minimizojë konsumimin e memories dhe kohën e nisjes së aplikacioneve dhe shërbimeve Java dhe, si pasojë, të rrisë densitetin e vendosjes së tyre në host dhe të ulë kostot totale.
Quarkus gjithashtu e burimeve Kubernetes dhe ofron për implementim në platformat Kubernetes dhe Red Hat OpenShift. Për më tepër, Quarkus automatikisht gjeneron skedarët Dockerfile.jvm (paketim JVM) dhe Dockerfile.native (paketim binar natyral), të nevojshëm për krijimin e kontenjereve.
Dhe në fund, duke u orientuar në Kubernetes si ambientin e tij të synuar për implementim, Quarkus nuk përdor kornizat Java në rastet kur funksionaliteti i ngjashëm është zbatuar në nivelin e vetë platformës Kubernetes. Tabela 1 paraqet një hartë të përputhshmërisë funksionale mes Kubernetes dhe kornizave standarde Java që përdoren nga zhvilluesit e Spring.
Tabela 1. Harta e përputhshmërisë funksionale mes kornizave Java dhe Kubernetes.
Funksionaliteti
Spring Boot tradicional
Kubernetes
Zbulimi i shërbimeve
Eureka
DNS
Konfigurimi
Spring Cloud Config
Config Maps / Secrets
Balancimi i ngarkesës
Ribbon (nga ana e klientit)
Shërbimi, Controller i riprodhimit (nga ana e serverit)
Kompilim dhe ekzekutim i kodit nga shembulli
Në këtë artikull ne referohemi në , ku bashkëpunohet me API-të e Spring dhe MicroProfile dhe madje edhe ai java klasën e famshme. Kodi nga ky shembull mund të kompozohet dhe ekzekutohet nga linja e komandës, shihni më shumë në skedarin README.md.
API-të e Spring Framework
Injektimi i varësisë
Quarkus mbështet një gamë të gjerë dhe API-të e injektimit të varësive të Spring (Spring DI). Nëse po punoni me MicroProfile, , atëherë jeni tashmë të njohur me CDI. Nga ana tjetër, zhvilluesit e Spring mund të përdorin Quarkus Extension for Spring DI API për të siguruar përputhshmërinë me Spring DI. Shembujt e përdorimit të API-ve të mbështetura nga Spring DI janë paraqitur në tabela 2.
Në përdor si CDI ashtu edhe Spring Dependency Injection. Informacione të tjera dhe shembuj rreth kësaj teme mund të gjenden në udhëzimin Quarkus, i quajtur .
Tabela 2. Shembuj të përdorimit të API-ve të mbështetura nga Spring DI.
Funksionet e mbështetura të Spring DI
Shembuj
Injection me Konstruktor
public PersonSpringController(
PersonSpringRepository personRepository, // injektuar
PersonSpringMPService personService) { // injektuar
this.personRepository = personRepository;
this.personService = personService;
}
Injection në Fushë
@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ërdoruesve të MicroProfile do t'u pëlqejë që Quarkus mbështet JAX-RS, MicroProfile Rest Client, JSON-P dhe JSON-B si modelin kryesor të programimit të uebit. Zhvilluesit e Spring do të gëzohen nga mbështetja e re e Quarkus për Spring Web API, veçanërisht për ndërfaqet që lidhen me REST. Në përputhje me Spring DI, qëllimi kryesor i mbështetjes për Spring Web API është që zhvilluesit e Spring të mund të përdorin ndërfaqet e API-ve të Spring Web së bashku me ato të MicroProfile. Shembujt e përdorimit të API-ve të mbështetur të Spring Web Jepen në tabelën 3, ndërsa informacione të tjera dhe shembuj mbi këtë temë mund të gjenden në udhëzuesin e Quarkus, i quajtur .
Tabela 3. Shembujt e përdorimit të API-ve të mbështetur 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 (pjesërisht)
@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ë pëlqejnë se Quarkus mbështet JPA me përdorimin e Hibernate ORM. Ka edhe lajme të mira për zhvilluesit e Spring: Quarkus mbështet annotimet dhe tipet e zakonshme të Spring Data JPA. shembujt e përdorimit të API-ve të mbështetura të Spring Data JPA paraqiten në tabelën 4.
Në përdoren API-të e Spring Data JPA, dhe informacioni shtesë është në dispozicion në udhëzuesin Quarkus të quajtur .
Tabela 4. Shembujt e përdorimit të API-ve 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);
}
Fraksionet e Repository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Metodat e pyetjeve të derivezuara
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ërdoruesve
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
Tolerance ndaj dështimeve (Fault tolerance)
Konstruksionet e tolerancës ndaj defekteve janë shumë të rëndësishme për parandalimin e dështimeve kaskadë dhe krijimin e arkitekturave të besueshme të mikroshërbimeve. Zhvilluesit e Spring kanë përdorur për një kohë të gjatë circuit-breaker për qëllime të tolerancës ndaj defekteve. . Megjithatë, Hystrix nuk është përditësuar për një kohë të gjatë, ndërsa toleranca ndaj defekteve e MicroProfile është aktivisht në zhvillim dhe ka disa vite përvojë në prodhim. Prandaj, për të rritur besueshmërinë e shërbimeve në Quarkus, rekomandohet të përdoren API-të e MicroProfile Fault Tolerance, shembujt e përdorimit të të cilave jepen në tabelën 5. Informacione shtesë mbi këtë mund të gjenden në udhëzuesin e Quarkus. .
Tabela 5. Shembujt e përdorimit të API-ve të mbështetura të 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
Përpunimi inteligjent i gabimeve dhe rikuperimi nga dështimet
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Fallback
Thirrje e logjikës alternative në rast dështimi
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Rivendosje 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ërbimeve)
Platforma Kubernetes monitoron shëndetin e kontejnerëve përmes shërbimeve të veçanta. Për të lejuar platformën në shtresë poshtë të monitorojë shërbimet, zhvilluesit e Spring zakonisht përdorin HealthIndicator dhe Spring Boot Actuator. Në Quarkus, kjo mund të bëhet përmes MicroProfile Health, të cilat për default kryejnë kontroll të gjallërisë (liveness check), por mund të konfigurohen gjithashtu për të kontrolluar njëherësh gjallërinë dhe gatishmërinë (readiness). Shembujt e përdorimit të API-ve të mbështetura të MicroProfile Health jepen në tabelën 6, dhe informacione të tjera janë të disponueshme në udhëzimin e Quarkus. .
Tabela 6. Shembuj të përdorimit të API-ve të mbështetura të MicroProfile Health.
Funksionalitetet e MicroProfile Health
Përshkrimi
Shembuj
@Liveness
Platforma fytyra riparon aplikacionet kontejnerizuese që nuk funksionojnë.
Pika:
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 të dërgojë trafik në aplikacionet e containerizuara në rast se ato nuk janë gati
Pika:
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();
}
Metricat
Aplikacionet ofrojnë metrika për qëllime operative (për monitorimin e parametrave të performancës SLA) ose jooperuese (parametrat e biznesit SLA). Zhvilluesit e Spring ofrojnë metrika përmes Spring Boot Actuator dhe Micrometer. Nga ana tjetër, Quarkus përdor MicroProfile Metrics për të ofruar metrika themelore (JVM dhe sistemi operativ), metrika të ofruara nga shitësit (Quarkus), dhe metrika aplikacionesh. MicroProfile Metrics kërkon që implementimi të mbështesë formate dalëse JSON dhe OpenMetrics (Prometheus). Shembuj për përdorimin e MicroProfile Metrics API jepen në tabelën 7.
Në MicroProfile Metrics përdoren për ofrimin e metrikave të aplikacionit. Informacione shtesë mund të gjenden në udhëzuesin e Quarkus. .
Tabela 7. Shembuj të përdorimit të API-ve MicroProfile Metrics.
Funksionet e MicroProfile Metrics
Përshkrimi
Shembuj
@Counted
Tregon një numërues, i cili llogarit numrin e thirrjeve të objektit të annotuar
@Counted(name = "fallbackCounter",
displayName = "Numëruesi i Zëvendësimit",
description = "Numëruesi i Zëvendësimit")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Tregon një sensor, i cili llogarit numrin e thirrjeve paralele të objektit të annotuar
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Paralel i Zëvendësimit",
description="Paralel i Zëvendësimit")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
Tregon një sensor, i cili mat vlerën e objektit të annotuar
@Metered(name = "FallbackGauge",
displayName="Sensori i Zëvendësimit",
description="Frekuenca e Zëvendësimit")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Tregon një sensor që ndjek frekuencën e thirrjeve për objektin e annotuar
@Metered(name = "MeteredFallback",
displayName = "Frekuenca e Matur",
description = "Frekuenca e Zëvendësimit")
public String salutationFallback() {
return fallbackSalutation;
}
Annotation që përmban informacion mbi metadata, kur bëhet një kërkesë për të regjistruar ose prodhuar një metrikë
@Metric
@Metered(name = "MeteredFallback",
displayName = "Frekuenca e Matur",
description = "Frekuenca e Zëvendësimit")
public String salutationFallback() {
return fallbackSalutation;
}
Përcakton një timer që ndjek kohëzgjatjen e objektit të annotuar
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Vonesa rezervuese")
public String salutationFallback() {
return fallbackSalutation;
}
Pikat e fundit të metrikës (Metrics Endpoints)
Metrikat e aplikacioneve :8080/metrics/application
Metrikat bazë :8080/metrics/base
Metrikat e ofruesit :8080/metrics/vendor
TĂ« gjitha metrikat :8080/metrics
Klienti Rest MicroProfile
Mikrosërvicat shpesh ofrojnë pika përfundimtare RESTful, për të cilat nevojiten API-të e klientit përkatëse. Për të përdorur pikat përfundimtare RESTful, zhvilluesit e Spring zakonisht përdorin RestTemplate. Quarkus ofron për këtë qëllim API-in e Klientit Rest të MicroProfile, të cilat ilustrohen në tabelën 8.
Në përdorimi i pikat përfundimtare RESTful kryhet përmes Klientit Rest të MicroProfile. Informacione të tjera dhe shembuj mbi këtë temë mund të gjenden në udhëzimin e Quarkus .
Tabelë 8. Shembuj të përdorimit të API-ve të Klientit Rest të MicroProfile.
Karakteristikat e Klientit Rest të MicroProfile
Përshkrimi
Shembuj
@RegisterRestClient
Regjistron një interface të tipizuar Java si një klient REST
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Shënon implementimin e një instance të interfesit të tipizuar të klientit REST
@Autowired // ose @Inject
@RestClient
MyRestClient restClient;
Thirrje
Thirr një pikë fundore REST
System.out.println(
restClient.getSalutation());
mp-rest/url
Përcakton pikën fundore REST
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Përfundimet
NĂ« kĂ«tĂ« blog, i cili do tĂ« jetĂ« veçanĂ«risht i dobishĂ«m pĂ«r zhvilluesit Spring, ne do tĂ« shqyrtojmĂ« shkurtimisht se si tĂ« pĂ«rdorim API-tĂ« Spring me API-tĂ« MicroProfile nĂ« Quarkus pĂ«r tĂ« zhvilluar mikroshĂ«rbime Java dhe pastaj tâi kompilohet ato nĂ« njĂ« kod binar natyror qĂ« kursen qindra megabajt memorie dhe ngarkon nĂ« pak milisekonda.
Siç e keni kuptuar, informacion të mëtejshëm në lidhje me mbështetje për API-të Spring dhe MicroProfile, si dhe shumë informacione të tjera të dobishme mund të gjeni në .
Burimi: habr.com
