Si i bashkon Quarkus MicroProfile dhe Spring

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

Si i bashkon Quarkus MicroProfile dhe Spring

Në zhvillimin e mikrosherbimeve Java shpesh konsiderohet se Eclipse MicroProfile dhe Spring Boot ë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 MicroProfile për zhvilluesit e Spring dhe do të tregojmë se si të përfshihen njëkohësisht API-të e Spring dhe mundësitë e reja të dobishme Quarkus.

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ë 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 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 Kubernetes, 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 mbështet gjenerimin automatik e burimeve Kubernetes dhe ofron udhëzimet 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ë shembulli i projektit, 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ë API-të e Konteksteve dhe Injeksionit të Varësisë (CDI) dhe API-të e Injeksionit të Varësisë të Spring (Spring DI). Nëse punoni me MicroProfile, Java EE dhe Jakarta EE, 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ë në projektin tonë të shembullit 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 Udhezuesi i Spring DI.

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
Vlera

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bina
@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ë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 Udhëzuesi i Spring Web.

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ë në projektin tonë të shembullit përdoren interfecet e Spring Data JPA, ndërsa informacioni shtesë është në dispozicion në udhëzimin e Quarkus të titulluar Udhëzuesi i Spring Data JPA.

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. Hystrix. 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. Udhëzuesi për Tolerancën ndaj Defekteve.

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

Riprovimi

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

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

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ë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. Udhëzuesi për Shëndetin.

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ë në projektin tonë të shembullit MicroProfile Metrics përdoren për ofrimin e metrikeve të aplikacionit. Informacione të mëtejshme mund të gjenden në udhëzimin e Quarkus Guidë për Metrikat.

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

Metrika

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

E matur

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 localhost:8080/metrics/application
Metrikat bazë localhost:8080/metrics/base
Metrikat e ofruesve localhost:8080/metrics/vendor
TĂ« gjitha metrikat localhost: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ë në projektin tonë të shembullit 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. Udhëzuesi i Rest Klientit.

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

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster