Kako Quarkus spaja MicroProfile i Spring

Pozdrav svima, i dobrodošli u treći post iz serije o Quarkusu!

Kako Quarkus spaja MicroProfile i Spring

Prilikom razvoja Java mikroslužbi, često se smatra da Eclipse MicroProfile i Spring Boot – to su odvojeni i nezavisni API koji se međusobno ne oslanjaju. Po defaultu, programeri obično koriste one API-je koje već poznaju, budući da učenje novih frameworka i runtime komponenti zahteva puno vremena. Danas ćemo pokušati olakšati učenje nekih popularnih MicroProfile API-ja za Spring programere i pokazati kako simultano koristiti Spring API i nove korisne mogućnosti. Quarkus.

Ako malo detaljnije, prvo ćemo razmotriti područje primene i detalje o tome kako Quarkus podržava Spring API, kako bismo pokazali Spring programerima kako mogu primeniti MicroProfile API u svakodnevnom radu. Zatim ćemo govoriti o MicroProfile API-jima koji će imati koristi Spring programerima prilikom izrade mikroslužbi.

Zašto baš Quarkus? Prvo, to je live coding, što znači automatsko ponovno učitavanje svih promena u MicroProfile API, Spring API i drugim Java API-ima, što se izvršava jednom komandom: mvn quarkus:dev. Drugo, u našem uključenju usluge Person (kompajlira se iz Spring, MicroProfile i JPA API-ja u binarni fajl koristeći nativnu sliku GraalVM) pokreće se za samo 0.055 sekundi i zahteva oko 90 MB RAM-a (RSS) na krajnjoj tački RESTful aplikacije. Njegova sama kompilacija se izvršava jednom komandom: mvn package -Pnative. Nećemo se zadržavati na detaljima MicroProfile-a, već ćemo pokušati pomoći Spring programerima da razumeju kako se u Quarkusu mogu koristiti Spring API zajedno sa MicroProfile API-jima.

Kontejneri i Kubernetes

Da ne preopterećujemo ovaj članak, ovde ćemo se fokusirati samo na visoke aspekte podrške

, što je važno razumeti. Quarkus se pozicionira kao Java stack za Kubernetes, ima za cilj minimizirati potrošnju memorije i vreme pokretanja Java aplikacija i usluga, i kao posledicu, povećati gustinu njihovog rasporeda na hostu i smanjiti ukupne troškove. KubernetesQuarkus takođe

podržava automatsku generaciju Kubernetes resursa i nudi za implementaciju na Kubernetes i Red Hat OpenShift platformama. Osim toga, Quarkus automatski generiše Dockerfile.jvm (JVM pakovanje) i Dockerfile.native (nativno binarno pakovanje) datoteke potrebne za izradu kontejnera. priručnika za implementaciju na platformama Kubernetes i Red Hat OpenShift. Osim toga, Quarkus automatski generira datoteke Dockerfile.jvm (pakiranje JVM-a) i Dockerfile.native (pakiranje izvorne binarne verzije) potrebne za izradu kontejnera.

I na kraju, oslanjajući se na Kubernetes kao na ciljano okruženje za implementaciju, Quarkus ne koristi Java okvire u slučajevima kada je slična funkcionalnost realizirana na razini same platforme Kubernetes. U tablici 1 prikazana je karta funkcionalnog usklađivanja između Kubernetesa i tipičnih Java okvira koji se koriste od strane Spring programera.

Tablica 1. Karta funkcionalnog usklađivanja Java okvira i Kubernetesa.

Funkcionalnost
Tradicionalni Spring Boot
Kubernetes

Service discovery
Eureka
DNS

Konfiguracija
Spring Cloud Config
Config Maps / Secrets

Balansiranje opterećenja
Ribbon (na strani klijenta)
Servis, Replication Controller (na strani poslužitelja)

Kompilacija i pokretanje koda iz primjera

U ovom članku referiramo se na primjer projekta, gdje se zajedno koriste API sučelja Spring i MicroProfile, pa čak i onaj Java razred. Kod iz ovog primjera može se kompajlirati i pokrenuti iz komandne linije, više informacija potražite u datoteci README.md.

API sučelja Spring Framework

Dependency Injection

Quarkus podržava cijeli niz API sučelja Contexts and Dependency Injection (CDI) i API sučelja Spring Dependency Injection (Spring DI). Ako radite s MicroProfileom, Java EE i Jakarta EE, već ste dobro upoznati s CDI. S druge strane, Spring programeri mogu koristiti Quarkus Extension for Spring DI API za osiguranje kompatibilnosti s Spring DI. Primjeri korištenja podržavanih Spring DI API-ja prikazani su u tablici 2.

U u projektu iz našeg primjera koriste se kako CDI, tako i Spring Dependency Injection. Dodatne informacije i primjere na ovu temu možete pronaći u priručniku Quarkus pod nazivom Spring DI Guide.

Tablica 2. Primjeri korištenja podržavanih API sučelja Spring DI.

Podržane funkcije Spring DI
Primjeri

Constructor Injection

public PersonSpringController(
   PersonSpringRepository personRepository,  // injected      
   PersonSpringMPService personService) {    // injected
      this.personRepository = personRepository;
      this.personService = personService;
}

Field Injection
Autowired
Vrijednost

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Configuration

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

Component

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

Service

@Service
public class MessageProducer {
   @Value("${greeting.message}")
   String message;

   public String getPrefix() {
      return message;
   }
}

Web okvir

Korisnicima MicroProfile bit će drago što Quarkus podržava JAX-RS, MicroProfile Rest Client, JSON-P i JSON-B kao osnovni model za web programiranje. Razvojni programeri koji koriste Spring će se obradovati nedavnom podrškom Spring Web API-a u Quarkusu, posebice za sučelja koja se odnose na REST. Na sličan način kao i kod Spring DI, glavni cilj podrške Spring Web API-u je omogućiti Spring programerima korištenje Spring Web API sučelja zajedno s MicroProfile API sučeljima. Primjeri korištenja podržanih Spring Web API-a prikazani su u Tablici 3, a dodatne informacije i primjere o ovoj temi možete pronaći u Quarkus vodiču pod nazivom Spring Web Guide.

Tablica 3. Primjeri korištenja podržanih Spring Web API sučelja.

Podržane funkcije Spring Web
Primjeri

@RestController
@RequestMapping

@RestController
@RequestMapping("/person")
public class PersonSpringController {
   ...
   ...
   ...
}

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (djelomično)

@GetMapping(path = "/greet/{id}",
   produces = "text/plain")
   public String greetPerson(
   @PathVariable(name = "id") long id) {
   ...
   ...
   ...
}

Spring Data JPA

Korisnicima MicroProfile također će se svidjeti što Quarkus podržava JPA korištenjem Hibernate ORM-a. Postoji dobra vijest i za Spring programere: Quarkus podržava uobičajene anotacije i tipove Spring Data JPA. Primjeri korištenja podržanih Spring Data JPA API-ja prikazani su u Tablici 4.
U u projektu iz našeg primjera koriste se Spring Data JPA API sučelja, a dodatne informacije dostupne su u Quarkus vodiču pod nazivom Spring Data JPA Guide.

Tablica 4. Primjeri korištenja podržanih Spring Data JPA API sučelja.

Podržane funkcije Spring Data JPA
Primjeri

CrudRepository

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repository Fragments

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

Derived query methods

public interface PersonRepository extends CrudRepository {

    List findByName(String name);
    
    Person findByNameBySsn(String ssn);
    
    Optional 
       findByNameBySsnIgnoreCase(String ssn);

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

User-defined queries

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 sučelja MicroProfile

Otpornost na greške (Fault tolerance)

Konstrukcije otpornosti na greške su vrlo važne za sprečavanje kaskadnih kvarova i stvaranje pouzdanih mikroservisnih arhitektura. Spring programeri već dugi niz godina koriste circuit-breaker-e za otpornost na greške. Hystrix. Međutim, Hystrix se već dugo nije ažurirao, dok se MicroProfile-ova otpornost na greške aktivno razvija i ima nekoliko godina produkcijskog korišćenja iza sebe. Stoga se za povećanje pouzdanosti servisa u Quarkusu preporučuje primena MicroProfile Fault Tolerance API interfejsa, čiji se primeri korišćenja nalaze u tabeli 5. Dodatne informacije o tome mogu se naći u Quarkus priručniku. Vodič za otpornost na greške.

Tabela 5. Primeri korišćenja podržanih MicroProfile Fault Tolerance API interfejsa.

Funkcije MicroProfile Fault Tolerance
Opis
Primjeri

@Asynchronous

Izvršavanje logike u posebnoj niti

@Asynchronous
@Retry
public Future getSalutation() {
   ...
   return future;
}

@Bulkhead

Ograničenje broja simultanih zahteva

@Bulkhead(5)
public void fiveConcurrent() {
   makeRemoteCall(); //...
}

@CircuitBreaker

Pametno upravljanje greškama i oporavak od grešaka

@CircuitBreaker(delay=500 // milisekundi
   failureRatio = .75,
   requestVolumeThreshold = 20,
   successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

@Fallback

Pozivanje alternativne logike u slučaju greške

@Timeout(500) // milisekundi
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

public String fallback() {
   return "hello";
}

Retry

Ponovo pokušajte u slučaju greške zahteva

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

Timeout

Vreme čekanja prilikom greške

@Timeout(value = 500) // milisekundi
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

Proveravanje servisa (Service Health)

Kubernetes platforme prate ispravnost kontejnera pomoću specijalizovanih servisa. Da bi niža platforma mogla da nadgleda servise, Spring programeri obično koriste prilagodljive HealthIndicator i Spring Boot Actuator. U Quarkusu to se može učiniti putem MicroProfile Health, koje po defaultu vrše proveru rada (liveness check), ali se mogu konfigurisati da istovremeno proveravaju liveness i readiness (spremnost). Primeri korišćenja podržanih MicroProfile Health API interfejsa nalaze se u tabeli 6, a dodatne informacije su predstavljene u Quarkus priručniku. Vodič za zdravlje.

Tabela 6. Primeri korišćenja podržanih MicroProfile Health API interfejsa.

Funkcije MicroProfile Health
Opis
Primjeri

@Liveness

Platforma vrši ponovno pokretanje neispravnih kontejnerizovanih aplikacija
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 neće slati promet na kontejnerizirane aplikacije u slučaju njihove nespremnosti
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();  
}

Metrije

Aplikacije pružaju metrike ili u operativne svrhe (za praćenje SLA performansi), ili u neoperativne (poslovne KPI). Spring programeri pružaju metrike putem Spring Boot Actuator i Micrometer. S druge strane, Quarkus koristi MicroProfile Metrics za pružanje osnovnih metrika (JVM i operativni sustav), vendorskih metrika (Quarkus) i metrika aplikacija. MicroProfile Metrics zahtijeva da implementacija podržava izlazne formate JSON i OpenMetrics (Prometheus). Primjeri korištenja MicroProfile Metrics API prikazani su u tablici 7.

U u projektu iz našeg primjera MicroProfile Metrics koriste se za pružanje metrika aplikacija. Dodatne informacije možete pronaći u vodiču Quarkus Vodič za metrike.

Tablica 7. Primjeri korištenja MicroProfile Metrics API.

Funkcije MicroProfile Metrics
Opis
Primjeri

@Counted

Označava counter koji broji broj poziva obeleženog objekta

@Counted(name = "fallbackCounter", 
  displayName = "Fallback Counter", 
  description = "Fallback Counter")
public String salutationFallback() {
   return fallbackSalutation;
}

@ConcurrentGauge

Označava mernu tačku koja broji broj paralelnih poziva obeleženog objekta

@ConcurrentGuage(
  name = "fallbackConcurrentGauge", 
  displayName="Fallback Concurrent", 
  description="Fallback Concurrent")
public String salutationFallback() {
   return fallbackSalutation;
}

@Gauge

Označava mernu tačku koja meri vrednost obeleženog objekta

@Metered(name = "FallbackGauge",
   displayName="Fallback Gauge",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

@Metered

Označava mernu tačku koja prati učestalost poziva obeleženog objekta

@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

Metod

Annotation koja sadrži informacije o metapodacima kada stigne zahtev za kreiranje ili proizvodnju metrike

@Metric
@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

Mereno vreme

Označava tajmer koji prati trajanje obeleženog objekta

@Timed(name = "TimedFallback",
   displayName="Timed Fallback",
   description="Fallback delay")
public String salutationFallback() {
   return fallbackSalutation;
}

Krajnje točke metrika (Metrics Endpoints)

Metrike aplikacija localhost:8080/metrics/application
Osnovne metrike localhost:8080/metrics/base
Metrike dobavljača localhost:8080/metrics/vendor
Sve metrike localhost:8080/metrics

Rest-klijent MicroProfile

Mikroservisi često pružaju RESTful krajnje točke, za rad s kojima su potrebni odgovarajući klijentski API-ji. Da bi koristili RESTful krajnje točke, Spring developeri obično koriste RestTemplate. Quarkus nudi MicroProfile Rest Client API-je za tu svrhu, a primjeri korištenja su navedeni u Tablici 8.

U u projektu iz našeg primjera Korištenje RESTful krajnjih točaka ostvaruje se pomoću MicroProfile Rest Client-a. Dodatne informacije i primjere na ovu temu možete pronaći u vodiču za Quarkus. Vodič za Rest Client.

Tablica 8. Primjeri korištenja MicroProfile Rest Client API-ja.

Funkcije MicroProfile Rest Client
Opis
Primjeri

@RegisterRestClient

Registrira tipizirani Java interfejs kao REST klijent.

@RegisterRestClient
@Path("/")
public interface MyRestClient {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getSalutation();
}

@RestClient

Označava uvođenje instance tipiziranog REST klijent interfejsa.

@Autowired // or @Inject
@RestClient
MyRestClient restClient;

Invokacija

Poziva REST krajnju točku.

System.out.println(
   restClient.getSalutation());

mp-rest/url

Postavlja REST krajnju točku.

application.properties:
org.example.MyRestClient/mp-rest/url=
   http://localhost:8081/myendpoint

Zaključci

U ovom blogu, koji će prvenstveno biti koristan Spring developerima, ukratko ćemo razmotriti kako koristiti Spring API-je zajedno s MicroProfile API-jima u Quarkusu za razvoj Java mikroservisa i njihovu kompilaciju u nativni binarni kod, što štedi stotine megabajta RAM-a i omogućuje pokretanje u milisekundama.

Kao što ste već shvatili, dodatne informacije o podršci za Spring i MicroProfile API-je, kao i mnogo drugih korisnih informacija možete pronaći u vodičima za Quarkus.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster