Quarkusek MicroProfile eta Spring nola konbinatzen dituen

Kaixo guztioi, hona hemen Quarkus serieko hirugarren mezua!

Quarkusek MicroProfile eta Spring nola konbinatzen dituen

Java mikrozerbitzuak garatzean, askotan hori uste da Eclipse Mikrofilua ΠΈ Udaberriko bota API bereiziak eta independenteak dira. Lehenespenez, programatzaileek dagoeneko ohituta dauden APIak erabili ohi dituzte, marko eta exekuzio-denborako osagai berriak ikasteak denbora asko eskatzen baitu. Gaur egun ezagun batzuen garapena errazten saiatuko gara Spring garatzaileentzako MicroProfile APIa eta Spring APIa eta funtzio erabilgarri berriak nola erabili aldi berean erakutsiko dizu Quarkuak.

Xehetasun apur bat gehiagorekin, lehenik eta behin Quarkus-ek Spring APIak onartzen dituen esparrua eta xehetasunak aztertuko ditugu Spring garatzaileei MicroProfile APIa eguneroko lanean nola erabili erakusteko. Ondoren, MicroProfile APIak landuko ditugu, Spring garatzaileentzat erabilgarriak diren mikrozerbitzuak sortzerakoan.

Zergatik Quarkus? Lehenik eta behin, zuzeneko kodeketa da, hau da, MicroProfile APIan, Spring APIan eta beste Java APIetan egindako aldaketak automatikoki birkargatzea, komando bakarrarekin egiten dena: mvn quarkus:dev. Bigarrenik, kontuan hartuta gure adibidean Person zerbitzua (Spring, MicroProfile eta JPA APIetatik bitar batean konpilatzen da jatorrizko GraalVM irudia erabiliz) 0.055 segundotan hasten da eta 90 MB inguru (RSS) hartzen ditu RESTful aplikazioaren amaierako puntuan. Gainera, bere konpilazioa bera komando bakarrarekin egiten da: mvn package -Pnative.

Ez dugu MicroProfileri buruzko xehetasunetan sartuko, Spring garatzaileei Spring APIak Quarkus-en MicroProfile APIekin nola erabil ditzaketen ulertzeaz gain.

Ontziak eta Kubernetes

Artikulu hau sinplea izan dadin, laguntzaren goi-mailako alderdiak bakarrik landuko ditugu hemen. Kubernetes, ulertzea garrantzitsua delako. Quarkus Kubernetes-erako Java pila gisa kokatuta dago, Java aplikazio eta zerbitzuen memoria-kontsumoa eta abiarazte-denbora gutxitzeko diseinatuta dago, eta, ondorioz, ostalariaren dentsitatea handitzeko eta kostu orokorrak murrizteko.

Quarkus ere sorkuntza automatikoa onartzen du Kubernetes baliabideak eta eskaintzak lidergoa Kubernetes eta Red Hat OpenShift plataformetan hedatzeko. Gainera, Quarkusek automatikoki sortzen ditu edukiontziak sortzeko beharrezkoak diren Dockerfile.jvm (JVM paketatzea) eta Dockerfile.native (jatorrizko bilketa bitarra) fitxategiak.

Azkenik, Kubernetes helburu hedatzeko ingurune gisa zentratuz, Quarkusek ez ditu Java esparruak erabiltzen Kubernetes plataformaren mailan antzeko funtzionalitateak ezartzen diren kasuetan. 1. taulak Spring garatzaileek erabiltzen dituzten Kubernetes eta Java esparru tipikoen arteko korrespondentzia funtzionalaren mapa eskaintzen du.

1. taula. Java frameworken eta Kubernetesen arteko korrespondentzia funtzionalaren mapa.

funtzionala
Udaberriko bota tradizionala
Kubernetes

Zerbitzuaren aurkikuntza
Eureka
DNS

Konfigurazioa
Spring Cloud konfigurazioa
Konfiguratu Mapak/Sekretuak

Karga orekatzea
Zinta (bezeroaren aldean)
Zerbitzua, Erreplikazio-kontrolatzailea (zerbitzariaren aldean)

Adibideko kodea konpilatu eta exekutatzea

Artikulu honetan aipatzen dugu proiektu adibidea, non Spring eta MicroProfile APIak eta baita Java klase bera ere elkarrekin erabiltzen diren. Adibide honetako kodea komando-lerrotik konpilatu eta exekutatu daiteke, ikusi README.md fitxategia xehetasunetarako.

Spring Framework APIak

Mendekotasun Injekzioa

Quarkus-ek sorta bat onartzen du Testuinguruak eta Dependency Injection (CDI) APIak eta Spring Dependency Injection (Spring DI) APIak. MicroProfile-rekin lanean ari bazara, Java EE eta Jakarta EE, orduan dagoeneko oso ezaguna duzu CDI. Bestalde, Spring garatzaileek Quarkus Extension for Spring DI APIa erabil dezakete Spring DIrekin bateragarritasuna lortzeko. Onartutako Spring DI APIak erabiltzeko adibideak 2. taulan ematen dira.

Π’ proiektua gure adibidetik CDI eta Spring Dependency Injection erabiltzen ditu. Gai honi buruzko informazio eta adibide gehiago lortzeko, ikusi Quarkus izeneko gida Udaberriko DI Gida.

2. taula. Onartutako Spring DI APIak erabiltzeko adibideak.

Onartutako Spring DI Ezaugarriak
ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Eraikitzaile Injekzioa

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

Eremu Injekzioa
Automatikoki kableatua
Balio

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Konfigurazioa

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

zerbitzua

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

   public String getPrefix() {
      return message;
   }
}

Web esparrua

MicroProfile erabiltzaileek Quarkus-ek JAX-RS, MicroProfile Rest Client, JSON-P eta JSON-B onartzen dituela web programazio-eredu nagusi gisa. Spring garatzaileak pozik egongo dira Quarkusek Spring Web APIrako azken laguntzarekin, bereziki REST interfazeekin. Spring DIren antzera, Spring Web API laguntzaren helburu nagusia Spring garatzaileek Spring Web APIak MicroProfile APIekin batera erabiltzeko aukera ematea da. Onartutako Spring Web APIak erabiltzeko adibideak 3. taulan ematen dira, eta gai honi buruzko informazio eta adibide gehiago Quarkus izeneko tutorialean aurki daitezke. Udaberriko Web Gida.

3. taula. Onartutako Spring Web APIak erabiltzeko adibideak.

Onartutako Spring Web Ezaugarriak
ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

@RestController
@RequestMapping

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

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

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

Spring DataJPA

MicroProfile erabiltzaileek ere eskertuko dute Quarkusek JPA onartzen duela Hibernate ORM erabiliz. Spring garatzaileentzat ere albiste onak daude: Quarkusek Spring Data JPA oharrak eta mota arruntak onartzen ditu. Onartutako Spring Data JPA APIak erabiltzeko adibideak 4. taulan ematen dira.
Π’ proiektua gure adibidetik Spring Data JPA APIak erabiltzen dira eta informazio gehiago eskuragarri dago Quarkus izeneko tutorialean Spring Data JPA gida.

4. taula. Onartutako Spring Data JPA APIak erabiltzeko adibideak.

Onartutako Spring Data JPA Ezaugarriak
ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

CrudRepository

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

Biltegi
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Biltegiko zatiak

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

Kontsulta metodo eratorriak

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Erabiltzaileak definitutako kontsultak

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

MicroProfile APIak

Akatsen tolerantzia

Akats-tolerantziaren eraikuntzak oso garrantzitsuak dira kaskadako hutsegiteak saihesteko eta mikrozerbitzuen arkitektura fidagarriak sortzeko. Udaberriko garatzaileek urte asko daramatzate akatsen tolerantziarako etengailuak erabiltzen. Hystrix. Hala ere, Hystrix ez da denbora luzez eguneratu, baina MicroProfile-ren Fault Tolerance aktiboki garatzen ari da eta hainbat urtez ekoizpen erabilera du atzean. Hori dela eta, Quarkus-en zerbitzuen fidagarritasuna hobetzeko, MicroProfile Fault Tolerance APIak erabiltzea gomendatzen da, eta horien adibideak 5. taulan erabiltzen dira. Honi buruzko informazio gehiago lortzeko, ikusi Quarkus eskuliburua. Akatsen Tolerantzia Gida.

5. taula. Onartutako MicroProfile Fault Tolerance APIak erabiltzeko adibideak.

MikroProfile Akatsen Tolerantzia Ezaugarriak
Description
ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

@Asinkronoa

Logika aparteko hari batean exekutatzen

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

@ Bulkhead

Mugatu aldibereko eskaera kopurua

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

@CircuitBreaker

Hutsegite adimenduna kudeatzea eta hutsegiteetatik berreskuratzea

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

@Erori

Porrotaren kasuan logika alternatiboa deitzea

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

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

Saiatu berriro

Saiatu berriro eskaerak huts egiten badu

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

Denbora-muga

Hutsegiteak kontrolatzeko denbora-muga

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

Zerbitzuak egiaztatzea (Zerbitzuaren osasuna)

Kubernetes plataformek edukiontzien osasuna kontrolatzen dute zerbitzu bereziak erabiliz. Azpiko plataformak zerbitzuak kontrolatzeko aukera izan dezan, Spring garatzaileek HealthIndicator eta Spring Boot Actuator pertsonalizatuak erabiltzen dituzte normalean. Quarkus-en, MicroProfile Health erabiliz egin daiteke, lehenespenez bizitasun egiaztapena egiten duena, baina aldi berean bizitasuna eta presttasuna egiaztatzeko konfigura daiteke. Onartutako MicroProfile Health APIak erabiltzeko adibideak 6. taulan ematen dira, eta informazio gehigarria Quarkus eskuliburuan. Osasun Gida.

6. taula: Onartutako MicroProfile Health APIen erabilera-adibideak.

MicroProfile Health ezaugarriak
Description
ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

@Bizitasuna

Plataformak berrabiarazten ditu edukiontzidun aplikazio hutsak
Amaiera:
ostalaria:8080/health/live

@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(ready ? true:false)
     .withData("mydata", data)
     .build();  
}

@Prestasuna

Plataformak ez du trafikoa bidaliko edukiontzidun aplikazioetara prest ez badago
Amaiera:
ostalaria:8080/osasuna/prest

@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(live ? true:false)
     .withData("mydata", data)
     .build();  
}

Metrikak

Aplikazioek helburu operatiboetarako (errendimendu-SLA-ak kontrolatzeko) edo helburu ez-operatiboetarako (negozio-SLA-ak) eskaintzen dituzte. Spring garatzaileek neurketak eskaintzen dituzte Spring Boot Actuator eta Mikrometroa erabiliz. Era berean, Quarkusek MicroProfile Metrics erabiltzen du oinarrizko neurriak (JVM eta sistema eragilea), hornitzaileen neurriak (Quarkus) eta aplikazioaren neurriak emateko. MicroProfile Metrics-ek inplementazioak JSON eta OpenMetrics (Prometheus) irteera formatuak onartzen dituela eskatzen du. MicroProfile Metrics APIa erabiltzeko adibideak 7. taulan ematen dira.

Π’ proiektua gure adibidetik MicroProfile Metrics aplikazioaren metrikak emateko erabiltzen dira. Informazio gehiago lortzeko, ikusi Quarkus eskuliburua Metrikoen Gida.

7. taula. MicroProfile Metrics APIak erabiltzeko adibideak.

MicroProfile Metrics Ezaugarriak
Description
ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

@zenbatua

Adierazitako objektu bati zenbat aldiz deitu zaion zenbatzen duen kontagailu bat adierazten du

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

@ConcurrentGauge

Apuntatutako objektu bati aldibereko deiak zenbatzen dituen neurgailu bat adierazten du

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

@Gauge

Apuntatutako objektu baten balioa neurtzen duen neurgailu-sentsore bat adierazten du

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

@neurtuta

Apuntatutako objektu baten dei-maiztasuna kontrolatzen duen neurgailu-sentsore bat adierazten du

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

Metric

Metadatuei buruzko informazioa jasotzen duen oharpena, metrika bat sartzeko edo sortzeko eskaera jasotzen denean

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

Epea

Apuntatutako objektu baten iraupena kontrolatzen duen tenporizadorea adierazten du

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

Metrikak Amaiera-puntuak

Aplikazio-neurriak localhost:8080/metrics/application
Oinarrizko neurketak localhost:8080/metrics/base
Saltzaileen neurketak localhost:8080/metrics/saltzailea
Neurri guztiak localhost:8080/metrikoa

MicroProfile Rest Bezeroa

Mikrozerbitzuek sarritan RESTful amaierako puntuak eskaintzen dituzte, dagozkion bezeroen APIak behar dituztenak lan egiteko. RESTful amaierako puntuak erabiltzeko, Springeko garatzaileek RestTemplate erabiltzen dute normalean. Quarkusek MicroProfile Rest Client APIak eskaintzen ditu arazo hau konpontzeko, eta horien erabilera-adibideak 8. taulan ematen dira.

Π’ proiektua gure adibidetik RESTful amaierako puntuen erabilera MicroProfile Rest Client erabiliz egiten da. Gai honi buruzko informazio eta adibide gehiago Quarkus eskuliburuan aurki daitezke Atseden bezeroaren gida.

8. taula. MicroProfile Rest Client APIak erabiltzeko adibideak.

MicroProfile Rest Bezeroaren Ezaugarriak
Description
ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

@RegisterRestClient

Idatzitako Java interfazea REST bezero gisa erregistratzen du

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

@RestClient

Idatzitako REST bezero-interfaze baten instantzia baten ezarpena markatzen du

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

deitura

REST amaierako puntu batera deitzen du

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

mp-rest/url

REST amaiera-puntua zehazten du

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

Emaitzak

Spring garatzaileei zuzendutako blog honetan, Spring APIak Quarkus-en MicroProfile APIekin nola erabili aztertu dugu, Java mikrozerbitzuak garatzeko eta, ondoren, ehunka RAM RAM gorde eta abiarazten duen jatorrizko kode bitar batean konpilatu. milisegundoko kontua.

Dagoeneko ulertu zenuenez, Spring eta MicroProfile APIei buruzko euskarriari buruzko informazio gehiago, baita beste informazio baliagarri asko ere, aurki daiteke. Quarkus eskuliburuak.

Iturria: www.habr.com

Gehitu iruzkin berria