I-Quarkus idibanisa njani i-MicroProfile kunye neNtwasahlobo

Molweni nonke, nantsi isithuba sesithathu kuthotho lweQuarkus!

I-Quarkus idibanisa njani i-MicroProfile kunye neNtwasahlobo

Xa uphuhlisa ii-microservices zeJava, kuhlala kukholelwa ukuba I-Eclipse MicroProfile ΠΈ Ukuqala kwentwasahlobo zii-APIs ezizimeleyo nezizimeleyo. Ngokungagqibekanga, abadwelisi benkqubo bathanda ukusebenzisa ii-APIs abasele beziqhelile, kuba ukufunda izikhokelo ezitsha kunye namacandelo exesha lokubaleka kuthatha ixesha elininzi. Namhlanje siza kuzama ukwenza lula uphuhliso lwezinye ezidumileyo MicroProfile API kubaphuhlisi Spring kwaye ndikubonise indlela yokusebenzisa ngaxeshanye iSpring API kunye neempawu ezintsha eziluncedo IQuarkus.

Kwinkcukacha ezithe vetshe, siza kuqala sijonge umda kunye neenkcukacha zendlela iQuarkus exhasa ngayo iSpring APIs ukubonisa abaphuhlisi baseNtwasahlobo indlela yokusebenzisa iMicroProfile API kumsebenzi wabo wemihla ngemihla. Emva koko siza kugubungela i-MicroProfile APIs, eziluncedo kubaphuhlisi baseNtwasahlobo xa besenza ii-microservices.

Kutheni iQuarkus? Okokuqala, le yikhowudi ephilayo, oko kukuthi, ukulayishwa kwakhona ngokuzenzekelayo naluphi na utshintsho kwi-MicroProfile API, i-Spring API kunye nezinye i-Java APIs, eyenziwa ngomyalelo omnye kuphela: mvn quarkus:dev. Okwesibini, kuqwalaselwa kwi kumzekelo wethu inkonzo yoMntu (eqokelela ukusuka kwiNtwasahlobo, iMicroProfile, kunye neJPA APIs ukuya kokubini usebenzisa umfanekiso weGraalVM wendabuko) iqala kwimizuzwana eyi-0.055 kwaye ithatha malunga ne-90 MB ye-RAM (RSS) kwisiphelo sesicelo esi-RESTful. Ngaphezu koko, ukuhlanganiswa kwayo kwenziwa ngomyalelo omnye kuphela: iphakheji ye-mvn -Pnative.

Asiyi kungena kwiinkcukacha malunga ne-MicroProfile, ngaphandle kokunceda abaphuhlisi be-Spring baqonde indlela abanokusebenzisa ngayo i-Spring APIs kunye ne-MicroProfile APIs kwi-Quarkus.

Izikhongozeli kunye neKubernetes

Ukugcina eli nqaku lilula, siza kugubungela kuphela imiba ekwinqanaba eliphezulu lenkxaso apha. Kubernetes, kuba kubalulekile ukuqonda. I-Quarkus ibekwe njenge-Java stack ye-Kubernetes, yenzelwe ukunciphisa ukusetyenziswa kwememori kunye nexesha lokuqalisa usetyenziso lwe-Java kunye neenkonzo, kwaye, ngenxa yoko, ukwandisa ubuninzi babo kwi-host host kunye nokunciphisa iindleko zizonke.

I-Quarcus nayo ixhasa ukwenziwa kwe-auto Imithombo ye-Kubernetes kunye nezibonelelo ubunkokeli ukusasazwa kwi-Kubernetes kunye ne-Red Hat OpenShift amaqonga. Ukongeza, i-Quarkus ivelisa ngokuzenzekelayo i-Dockerfile.jvm (i-JVM yokupakisha) kunye ne-Dockerfile.native (i-packaging yendalo yokubini) ezifunekayo ukwenza izikhongozeli.

Ekugqibeleni, ngokugxila kwi-Kubernetes njengendawo ekujoliswe kuyo, i-Quarkus ayisebenzisi izikhokelo zeJava kwiimeko apho ukusebenza okufanayo kuphunyezwa kwinqanaba le-platform ye-Kubernetes ngokwayo. Itheyibhile 1 ibonelela ngemephu yembalelwano esebenzayo phakathi kweKubernetes kunye nesakhelo esiqhelekileyo seJava esisetyenziswe ngabaphuhlisi baseNtwasahlobo.

Itheyibhile 1. Imephu yembalelwano esebenzayo phakathi kwesakhelo seJava kunye neKubernetes.

Iyasebenza
Isihlangu seNtwasahlobo seNdabuko
Kubernetes

Ukufunyanwa kwenkonzo
Eureka
DNS

uqwalaselo
iSpring Cloud Config
Qwalasela iimephu/iiMfihlo

Ukulayisha ukulayisha
Iribhoni (icala lomxumi)
Inkonzo, isiLawuli sokuphindaphinda (icala leseva)

Ukuqulunqa nokusebenzisa ikhowudi kumzekelo

Kweli nqaku sibhekisela kuyo iprojekthi yomzekelo, apho i-Spring kunye ne-MicroProfile APIs kunye neklasi efanayo yeJava isetyenziswa kunye. Ikhowudi kulo mzekelo inokuqulunqwa kwaye iqhutywe kumgca womyalelo, bona ifayile ye-README.md ngeenkcukacha.

Spring Framework APIs

Inaliti yokuxhomekeka

I-Quarkus ixhasa uluhlu lwe Imixholo kunye ne-Dependency Injection (CDI) APIs kunye neSpring Dependency Injection (Spring DI) APIs. Ukuba usebenza ngeMicroProfile, Java EE kunye Jakarta EE, ngoko sele uqhelene kakhulu ne-CDI. Kwelinye icala, abaphuhlisi baseNtwasahlobo banokusebenzisa i-Quarkus Extension ye-Spring DI API ukufezekisa ukuhambelana ne-Spring DI. Imizekelo yokusebenzisa iSpring DI APIs ezixhaswayo zinikwe kwiThebhile yesi-2.

Π’ iprojekthi kumzekelo wethu Isebenzisa zombini iCDI kunye neSpring Dependency Injection. Ngolwazi oluthe kratya kunye nemizekelo yesi sihloko, bona isikhokelo seQuarku esibizwa Spring DI Guide.

Uluhlu 2. Imizekelo yokusebenzisa iSpring DI APIs ezixhaswayo.

Inkxaso yeNtwasahlobo DI Iimpawu
U mzekelo

Isitofu soMakhi

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

Isitofu sangaphandle
Isebenza ngokuzenzekela
ixabiso

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Uqwalaselo

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

ilungu

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

inkonzo

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

   public String getPrefix() {
      return message;
   }
}

Isakhelo sewebhu

Abasebenzisi be-MicroProfile baya kuthanda ukuba i-Quarkus ixhasa i-JAX-RS, i-MicroProfile Rest Client, i-JSON-P, kunye ne-JSON-B njengemodeli ephambili yeprogram yewebhu. Abaphuhlisi baseNtwasahlobo baya konwatyiswa yinkxaso yakutshanje yeQuarkus ye-Spring Web API, ngokukodwa ujongano lwe-REST. Ngokufana ne-Spring DI, eyona njongo iphambili yenkxaso ye-Spring Web API kukwenza abaphuhlisi be-Spring basebenzise i-Spring Web APIs ngokubambisana ne-MicroProfile APIs. Imizekelo yendlela yokusebenzisa iSpring Web APIs exhaswayo inikwe kwiThebhile 3, kunye nolwazi oluninzi kunye nemizekelo yesi sihloko inokufumaneka kwisifundo seQuarkus esibizwa ngokuba Spring Web Guide.

Itheyibhile 3. Imizekelo yokusebenzisa iSpring Web APIs exhaswayo.

Iimpawu zeWebhu ezixhaswayo
U mzekelo

@RestController
@RequestMapping

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

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

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

Idatha yaseNtwasahlobo yeJPA

Abasebenzisi beMicroProfile baya kuxabisa kwakhona ukuba iQuarkus ixhasa iJPA isebenzisa iHibernate ORM. Kukwakho neendaba ezimnandi kubaphuhlisi baseNtwasahlobo: I-Quarkus ixhasa i-Spring Data JPA amanqakwana kunye neentlobo. Imizekelo yokusebenzisa iSpring Data JPA APIs inikwe kwiThebhile 4.
Π’ iprojekthi kumzekelo wethu I-Spring Data JPA APIs isetyenziswa kwaye ulwazi oluninzi luyafumaneka kwi-Quarkus tutorial ebizwa Spring Data JPA Guide.

Itheyibhile 4. Imizekelo yokusebenzisa iSpring Data JPA APIs.

INkxaso yeDatha yaseNtwasahlobo yeJPA Iimpawu
U mzekelo

I-CrudRepository

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

Repository
JpaRepository
IPagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Iziqwenga zokugcina

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

Iindlela zokubuza imibuzo

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Imibuzo echazwe ngumsebenzisi

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 APIs

Ukunyamezela iimpazamo

Ulwakhiwo lokunyamezela impazamo lubaluleke kakhulu ekuthinteleni ukungaphumeleli kwe-cascading kunye nokudala i-architectures ethembekileyo ye-microservice. Abaphuhlisi be-Spring basebenzise i-circuit-breakers ukunyamezela impazamo iminyaka emininzi. I-Hystrix. Nangona kunjalo, i-Hystrix ayizange ihlaziywe ixesha elide, kodwa i-MicroProfile's Fault Tolerance ngoku iphuhlisa ngokusebenzayo kwaye ineminyaka emininzi yokusetyenziswa kwemveliso emva kwayo. Ngoko ke, ukuphucula ukuthembeka kweenkonzo kwi-Quarkus, kucetyiswa ukuba usebenzise i-APIs ye-MicroProfile Fault Tolerance APIs, imizekelo esetyenziswa kwiThebhile 5. Ukuze ufumane inkcazelo engakumbi kule nto, jonga i-Quarkus manual. Isikhokelo sokunyamezela impazamo.

Itheyibhile 5. Imizekelo yokusebenzisa i-APIs ye-MicroProfile Fault Tolerance exhaswayo.

Iimpawu zoNyamezelo lweFault MicroProfile
inkcazelo
U mzekelo

@Asynchronous

Ukwenza ingqiqo kumsonto owahlukileyo

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

@Bulkhead

Ukunciphisa inani lezicelo ngaxeshanye

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

@Umephuli wojikelezo

Ukuphathwa kokungaphumeleli kwe-Smart kunye nokubuyisela kwiintsilelo

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

@Ubuyela kundalashe

Ukufowuna enye ingqiqo kwimeko yokusilela

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

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

Zama

Phinda uzame ukusilela kwesicelo

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

Kuphele ixesha

Ukungaphumeleli ukulawula ixesha lokuvala

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

Iinkonzo zokujonga (iNkonzo yezeMpilo)

Amaqonga e-Kubernetes abeka iliso kwimpilo yezikhongozeli ezisebenzisa iinkonzo ezizodwa. Ukuvumela iqonga elisisiseko ukuba libeke iliso kwiinkonzo, abaphuhlisi baseNtwasahlobo basebenzisa i-HealthIndicator yesiko kunye ne-Spring Boot Actuator. Kwi-Quarkus, oku kunokwenziwa ngokusebenzisa iMpilo ye-MicroProfile, ethi ngokungagqibekanga yenza isheke lokuphila, kodwa inokuthi iqwalaselwe ukuba ngaxeshanye ijonge ukuphila kunye nokulungela. Imizekelo yendlela yokusebenzisa i-APIs yeMpilo ye-MicroProfile exhaswayo inikwe kwiThebhile 6, kwaye ulwazi olongezelelweyo lunikezelwa kwi-Quarkus manual. Isikhokelo seMpilo.

Itheyibhile 6: Imizekelo yokusetyenziswa kwee-APIs zeMpilo ye-MicroProfile exhaswayo.

Iimpawu zeMpilo yeMicroProfile
inkcazelo
U mzekelo

@Ukuphila

Iqonga liziqalela izicelo aziphumelelanga
Isiphelo:
umkhosi:8080/health/live

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

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

@Ukulungela

Iqonga aliyi kuthumela itrafikhi kwizicelo ezifakwe kwikhonteyina ukuba ayilungile
Isiphelo:
umkhosi:8080/health/ready

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

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

Iimetriki

Izicelo zibonelela ngeemetrics nokuba ziyasebenza (ukubeka iliso kwii-SLAs zokusebenza) okanye iinjongo ezingezizo ezokusebenza (ii-SLA zeshishini). Abaphuhlisi basentwasahlobo babonelela ngeemetrics besebenzisa iSpring Boot Actuator kunye neMicrometer. Ngaloo ndlela, i-Quarkus isebenzisa i-MicroProfile Metrics ukubonelela ngeemetriki zesiseko (i-JVM kunye nenkqubo yokusebenza), i-metrics yomthengisi (i-Quarkus), kunye ne-application metrics. I-MicroProfile Metrics ifuna ukuba ukuphunyezwa kuxhase i-JSON kunye ne-OpenMetrics (i-Prometheus) iifomathi zemveliso. Imizekelo yokusebenzisa i-MicroProfile Metrics API inikwe kwiThebhile 7.

Π’ iprojekthi kumzekelo wethu I-MicroProfile Metrics isetyenziselwa ukubonelela ngeemetriki zesicelo. Ngolwazi oluthe kratya, bona iQuarkus manual IsiKhokelo seMetrics.

Itheyibhile 7. Imizekelo yokusebenzisa i-MicroProfile Metrics APIs.

Iimpawu zeMetrikhi zeMicroProfile
inkcazelo
U mzekelo

@Ibaliwe

Ichaza ikhawuntara ebala inani lamaxesha into enenkcazo ebizwa ngayo

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

@ConcurrentGauge

Ichaza igeyiji ebala inani lokufowuna ngaxeshanye ukuya kwinto enenkcazo

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

@Isilinganisi

Ibonisa i-gauge sensor elinganisa ixabiso lento echaziweyo

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

@Imitha

Ichaza isivamvo semitha esibeka iliso ngamaxesha okufowuna kwinto echaziweyo

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

Metric

Inkcazo equlethe ulwazi malunga nemetadata xa isicelo sifunyenwe sokungena okanye ukuvelisa i-metric

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

Ixesha

Ibonisa isibali-xesha esilandelela ubude bento echaziweyo

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

Amanqaku okuphela kweeMetrics

Iimetriki zesicelo localhost:8080/metrics/application
Iimetriki ezisisiseko localhost:8080/metrics/base
Iimetriki zabathengisi localhost:8080/metrics/vendor
Zonke iimetrics localhost:8080/metrics

MicroProfile Rest Client

Ii-Microservices zihlala zibonelela ngeesiphelo ezi-RESTful ezifuna i-APIs yomxhasi ohambelanayo ukuze usebenze nayo. Ukusebenzisa i-RESTful endpoints, abaphuhlisi baseNtwasahlobo basebenzisa i-RestTemplate. I-Quarkus inikezela nge-MicroProfile Rest Client APIs ukusombulula le ngxaki, imizekelo yokusetyenziswa kwayo inikwe kwiThebhile 8.

Π’ iprojekthi kumzekelo wethu ukusetyenziswa kwe-RESTful endpoints kwenziwa ngokusebenzisa i-MicroProfile Rest Client. Olunye ulwazi kunye nemizekelo yesi sihloko inokufumaneka kwincwadi yeQuarkus Phumla iSikhokelo soMxumi.

Itheyibhile 8. Imizekelo yokusebenzisa i-MicroProfile Rest Client APIs.

IMicroProfile yokuphumla koMxumi
inkcazelo
U mzekelo

@RegisterRestClient

Ibhalisa ujongano oluchwetheziweyo lweJava njengomthengi weREST

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

@RestClient

Iphawula ukuphunyezwa komzekelo wojongano lomxumi ochwetheziweyo REST

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

Ukucela

Ifowunela isiphelo se-REST

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

mp-phumla/url

Ixela isiphelo se-REST

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

Iziphumo

Kule bhlog, ejolise ikakhulu kubaphuhlisi baseNtwasahlobo, sithathe ujongo olukhawulezileyo kwindlela yokusebenzisa i-Spring APIs kunye neMicroProfile APIs kwiQuarkus ukuphuhlisa iimicroservices zeJava kwaye emva koko uzihlanganisele kwikhowudi yokubini yemveli egcina amakhulu eemegabytes ze-RAM kwaye iqalise ngaphakathi. umcimbi we-milliseconds.

Njengoko sele uqonda, ulwazi oluninzi malunga nenkxaso ye-Spring kunye ne-MicroProfile APIs, kunye nolunye ulwazi oluninzi oluluncedo, lunokufumaneka Iincwadi zeQuarkus.

umthombo: www.habr.com

Yongeza izimvo