Si Quarkus bashkon MicroProfile dhe Spring

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

Si Quarkus bashkon MicroProfile dhe Spring

Kur zhvilloni mikroshërbime Java, shpesh mendoni se Eclipse MicroProfile dhe Spring Boot ë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 MicroProfile për zhvilluesit e Spring dhe do të tregojmë se si të angazhojmë njëkohësisht API-të e Spring dhe mundësitë e reja të dobishme Quarkus.

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ë shembullin tonë 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 Kubernetes, 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 mbështet gjenerimin automatik e burimeve Kubernetes dhe ofron udhëzimeve 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ë shembulli i projektit, 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ë API-të e konteksteve dhe injektimit të varësive (CDI) dhe API-të e injektimit të varësive të Spring (Spring DI). Nëse po punoni me MicroProfile, Java EE dhe Jakarta EE, 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ë projekti nga shembulli ynë 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 Spring DI Guide.

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
Vlera

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

@Value("${fallbackSalutation}")
String fallbackSalutation;

Bean
@Configuration

@Configuration
public class AppConfiguration {
   @Bean(name = "capitalizeFunction")
   public StringFunction capitalizer() {
      return String::toUpperCase;
   }
}

Komponent

@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
   @Override
   public String apply(String s) {
      return s;
   }
}

Shërbimi

@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 Udhëzuesi për Spring Web.

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ë projekti nga shembulli ynë përdoren API-të e Spring Data JPA, dhe informacioni shtesë është në dispozicion në udhëzuesin Quarkus të quajtur Udhëzuesi Spring Data JPA.

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. Hystrix. 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. Udhëzuesi i Tolerancës ndaj Defekteve.

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

Rivendosje në rast dështimi të kërkesës

@Retry(maxRetries=3)
public String getSalutation() {
   makeRemoteCall(); //...
}

Kohë Skadimi

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. Udhëzuesi i Shëndetit.

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ë projekti nga shembulli ynë MicroProfile Metrics përdoren për ofrimin e metrikave të aplikacionit. Informacione shtesë mund të gjenden në udhëzuesin e Quarkus. Udhëzues për Metrikën.

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;
}

Metrikë

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;
}

E matur

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 localhost:8080/metrics/application
Metrikat bazë localhost:8080/metrics/base
Metrikat e ofruesit localhost:8080/metrics/vendor
TĂ« gjitha metrikat localhost: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ë projekti nga shembulli ynë 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 Udhëzuesi për Klientin Rest.

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ë udhëzimet Quarkus.

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster