I-Quarkus ihlanganisa kanjani i-MicroProfile ne-Spring

Sanibonani nonke, nali iposi lesithathu ochungechungeni lwe-Quarkus!

I-Quarkus ihlanganisa kanjani i-MicroProfile ne-Spring

Lapho uthuthukisa ama-microservices e-Java, kuvame ukukholelwa ukuthi I-Eclipse MicroProfile ΠΈ Ibhuthi yasentwasahlobo ama-API ahlukene futhi azimele. Ngokuzenzakalelayo, abahleli bezinhlelo bavame ukusebenzisa ama-API asebewajwayele, njengoba ukufunda izinhlaka ezintsha kanye nezingxenye zesikhathi sokusebenza kuthatha isikhathi esiningi. Namuhla sizozama ukwenza lula ukuthuthukiswa kwabanye abathandwayo I-MicroProfile API yonjiniyela basentwasahlobo futhi sikubonise indlela yokusebenzisa ngesikhathi esisodwa i-Spring API nezici ezintsha eziwusizo Ama-Quarkus.

Ngemininingwane eyengeziwe, sizoqala sibheke ububanzi nemininingwane yokuthi i-Quarkus iwasekela kanjani ama-Spring API ukuze abonise abathuthukisi baseNtwasahlobo ukuthi bangayisebenzisa kanjani i-MicroProfile API emsebenzini wabo wansuku zonke. Bese sizofaka i-MicroProfile APIs, ewusizo konjiniyela baseNtwasahlobo lapho benza ama-microservices.

Kungani i-Quarkus? Okokuqala, lokhu ukubhala ikhodi bukhoma, okungukuthi, ukulayisha kabusha okuzenzakalelayo kwanoma yiziphi izinguquko ku-MicroProfile API, i-Spring API namanye ama-Java API, okwenziwa ngomyalo owodwa nje: mvn quarkus:dev. Okwesibili, kuxoxwe ku esibonelweni sethu isevisi yomuntu (ehlanganisa i-Spring, MicroProfile, kanye ne-JPA APIs ibe kanambambili isebenzisa isithombe somdabu se-GraalVM) iqala kumasekhondi angu-0.055 nje futhi ithatha cishe u-90 MB we-RAM (RSS) endaweni yokugcina ye-RESTful yohlelo lokusebenza. Ngaphezu kwalokho, ukuhlanganiswa kwayo kwenziwa ngomyalo owodwa nje: iphakheji ye-mvn -Pnative.

Ngeke singene emininingwaneni mayelana ne-MicroProfile, ngaphandle kokusiza onjiniyela baseNtwasahlobo baqonde ukuthi bangasebenzisa kanjani ama-Spring API nge-MicroProfile APIs ku-Quarkus.

Iziqukathi kanye Kubernetes

Ukuze ugcine lesi sihloko silula, sizofaka kuphela izici ezisezingeni eliphezulu zosekelo lapha. Kubernetes, ngoba kubalulekile ukuqonda. I-Quarkus ibekwe njengesitaki se-Java se-Kubernetes, yakhelwe ukunciphisa ukusetshenziswa kwememori kanye nesikhathi sokuqalisa sezinhlelo zokusebenza nezinsizakalo ze-Java, futhi, ngenxa yalokho, yandise ukuminyana kwazo kumsingathi futhi yehlise izindleko zizonke.

Quarks futhi isekela ukukhiqizwa okuzenzakalelayo Izinsiza ze-Kubernetes nokunikezwayo ubuholi ukuze isetshenziswe kuzingxenyekazi ze-Kubernetes kanye ne-Red Hat OpenShift. Ngaphezu kwalokho, i-Quarkus ikhiqiza ngokuzenzakalelayo amafayela e-Dockerfile.jvm (JVM) kanye ne-Dockerfile.native (amaphakheji kanambambili omdabu) adingekayo ukuze kwakhiwe iziqukathi.

Okokugcina, ngokugxila ku-Kubernetes njengendawo yokuthunyelwa okuhlosiwe, i-Quarkus ayisebenzisi izinhlaka ze-Java ezimeni lapho ukusebenza okufanayo kusetshenziswa khona ezingeni le-Kubernetes platform ngokwayo. Ithebula 1 linikeza imephu yokuxhumana okusebenzayo phakathi kwe-Kubernetes nezinhlaka ezijwayelekile ze-Java ezisetshenziswa abathuthukisi baseNtwasahlobo.

Ithebula 1. Imephu yokuxhumana okusebenzayo phakathi kwezinhlaka ze-Java kanye ne-Kubernetes.

Ukusebenza
I-Traditional Spring Boot
Kubernetes

Ukutholwa kwesevisi
Eureka
DNS

Ukucushwa
I-Spring Cloud Config
Lungiselela Amamephu/Izimfihlo

Ukulayisha ngokulinganisa
Iribhoni (uhlangothi lweklayenti)
Isevisi, Isilawuli sokuphindaphinda (uhlangothi lweseva)

Ukuhlanganisa nokusebenzisa ikhodi kusuka kusibonelo

Kulesi sihloko sibhekisela kuso isibonelo iphrojekthi, lapho i-Spring ne-MicroProfile APIs ngisho nesigaba esifanayo se-Java sisetshenziswa ndawonye. Ikhodi kulesi sibonelo ingahlanganiswa futhi iqalise emugqeni womyalo, bheka ifayela le-README.md ukuze uthole imininingwane.

Spring Framework APIs

Umjovo Wokuncika

I-Quarkus isekela ububanzi be Contexts and Dependency Injection (CDI) APIs kanye nama-API we-Spring Dependency Injection (Spring DI). Uma usebenza ne-MicroProfile, I-Java EE ne-Jakarta EE, bese usujwayelene kakhulu ne-CDI. Ngakolunye uhlangothi, abathuthukisi baseNtwasahlobo bangasebenzisa i-Quarkus Extension ye-Spring DI API ukuze bathole ukusebenzisana ne-Spring DI. Izibonelo zokusebenzisa ama-Spring DI API asekelwayo zinikezwe kuThebula lesi-2.

Π’ iphrojekthi esibonelweni sethu Isebenzisa kokubili i-CDI kanye ne-Spring Dependency Injection. Ulwazi olwengeziwe nezibonelo ngalesi sihloko zingatholakala kumhlahlandlela weQuarkus obizwa ngokuthi Spring DI Umhlahlandlela.

Ithebula 2. Izibonelo zokusebenzisa ama-Spring DI API asekelwe.

Izici ze-Spring DI ezisekelwe
Izibonelo

Umjovo Wokwakha

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

Umjovo Wensimu
Intambo ezenzakalelayo
Value

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Ukucushwa

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

Uphiko

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

Izikhungo

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

   public String getPrefix() {
      return message;
   }
}

Uhlaka lwewebhu

Abasebenzisi be-MicroProfile bazothanda ukuthi i-Quarkus isekela i-JAX-RS, i-MicroProfile Rest Client, i-JSON-P, ne-JSON-B njengemodeli eyinhloko yohlelo lwewebhu. Abathuthukisi basentwasahlobo bazojabula ngokusekela kwakamuva kuka-Quarkus kwe-Spring Web API, ikakhulukazi i-REST interface. Ngokufanayo ne-Spring DI, umgomo oyinhloko wosekelo lwe-Spring Web API ukunika amandla abathuthukisi beNtwasahlobo ukuthi basebenzise ama-API Wewebhu Yasentwasahlobo ngokuhlangana nama-MicroProfile API. Izibonelo zendlela yokusebenzisa i-Spring Web APIs esekelwe inikezwe kuThebula 3, futhi ulwazi olwengeziwe nezibonelo ngalesi sihloko zingatholakala esifundweni se-Quarkus esibizwa ngokuthi. Spring Web Guide.

Ithebula 3. Izibonelo zokusebenzisa ama-Spring Web API asekelwe.

Izici Zewebhu Zentwasahlobo ezisekelwe
Izibonelo

@RestController
@RequestMapping

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

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

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

I-Spring Data JPA

Abasebenzisi be-MicroProfile bazophinde bajabulele ukuthi i-Quarkus isekela i-JPA isebenzisa i-Hibernate ORM. Kukhona futhi izindaba ezinhle zonjiniyela baseNtwasahlobo: I-Quarkus isekela izichasiselo nezinhlobo ze-Spring Data JPA. Izibonelo zokusebenzisa ama-API we-Spring Data JPA API zinikezwe kuThebula 4.
Π’ iphrojekthi esibonelweni sethu Ama-API we-Spring Data JPA asetshenziswa futhi ulwazi olwengeziwe luyatholakala esifundweni se-Quarkus esibizwa I-Spring Data JPA Guide.

Ithebula 4. Izibonelo zokusebenzisa ama-API we-Spring Data JPA API.

Izici ezisekelwe ze-Spring Data JPA
Izibonelo

I-CrudRepository

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

Igumbi
I-JpaRepository
I-PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Izingcezu Zenqolobane

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

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

I-MicroProfile APIs

Ukubekezelela amaphutha

Izakhiwo zokubekezelela amaphutha zibaluleke kakhulu ekuvimbeleni ukuhluleka kwe-cascading nokudala izakhiwo ezinokwethenjelwa ze-microservice. Abathuthukisi basentwasahlobo bebelokhu besebenzisa ama-circuit-breaker ukubekezelela amaphutha iminyaka eminingi. I-Hystrix. Kodwa-ke, i-Hystrix ayizange ibuyekezwe isikhathi eside, kodwa I-MicroProfile's Fault Tolerance manje iyathuthuka futhi ineminyaka eminingana yokusetshenziswa kokukhiqiza ngemuva kwayo. Ngakho-ke, ukuthuthukisa ukwethembeka kwezinsizakalo ku-Quarkus, kunconywa ukusebenzisa i-MicroProfile Fault Tolerance APIs, izibonelo zazo ezisetshenziswa kuThebula 5. Ukuze uthole ulwazi olwengeziwe ngalokhu, bheka imanuwali ye-Quarkus. I-Fault Tolerance Guide.

Ithebula 5. Izibonelo zokusebenzisa i-MicroProfile Fault Tolerance APIs esekelwayo.

Izici ze-MicroProfile Fault Tolerance
Incazelo
Izibonelo

@Asynchronous

Isebenzisa i-logic kuchungechunge oluhlukile

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

@Bulkhead

Khawulela inani lezicelo kanyekanye

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

@I-circuit breaker

Ukuphatha ukwehluleka okuhlakaniphile nokubuyiselwa ekuhlulekeni

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

@Ozowela kuyo

Ukushayela enye indlela enengqondo uma yehluleka

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

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

Zama

Zama futhi ekuhlulekeni kwesicelo

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

Isikhathi sokuhamba

Ukuhluleka ukulawula isikhathi sokuvala

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

Ukuhlola amasevisi (Impilo Yesevisi)

Amapulatifomu e-Kubernetes aqapha impilo yeziqukathi zisebenzisa izinsizakalo ezikhethekile. Ukuvumela inkundla eyisisekelo ukuthi igade izinsizakalo, onjiniyela baseNtwasahlobo basebenzisa i-HealthIndicator yangokwezifiso kanye ne-Spring Boot Actuator. Ku-Quarkus, lokhu kungenziwa kusetshenziswa i-MicroProfile Health, okuthi ngokuzenzakalelayo ihlole ukuthi iyasebenza yini, kodwa ingalungiselelwa ngesikhathi esisodwa ukuhlola ukuphila nokulungela. Izibonelo zendlela yokusebenzisa i-MicroProfile Health APIs esekelwe inikezwe kuThebula 6, futhi ulwazi olwengeziwe lunikezwe kumanuwali we-Quarkus. Umhlahlandlela Wezempilo.

Ithebula 6: Izibonelo zokusetshenziswa kwama-API wezempilo we-MicroProfile asekelwe.

Izici Zezempilo ze-MicroProfile
Incazelo
Izibonelo

@Liveness

Inkundla iqalisa kabusha izinhlelo zokusebenza ezifakwe iziqukathi ezihlulekile
Iphoyinti lokugcina:
umphathi: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

Inkundla ngeke ithumele ithrafikhi kuzicelo ezifakwe emabhokisini uma ingakalungi
Iphoyinti lokugcina:
umphathi:8080/health/ready

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

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

Amamethrikhi

Izicelo zihlinzeka ngamamethrikhi ngokwezinjongo zokusebenza (ukwengamela ukusebenza kwama-SLA) noma izinjongo ezingezona ezokusebenza (ama-SLA ebhizinisi). Onjiniyela basentwasahlobo bahlinzeka ngamamethrikhi basebenzisa i-Spring Boot Actuator ne-Micrometer. Ngokulandelayo, i-Quarkus isebenzisa i-MicroProfile Metrics ukuze inikeze amamethrikhi ayisisekelo (i-JVM nesistimu yokusebenza), amamethrikhi omthengisi (i-Quarkus), namamethrikhi ohlelo lokusebenza. I-MicroProfile Metrics idinga ukuthi ukusetshenziswa kusekele amafomethi okukhiphayo e-JSON kanye ne-OpenMetrics (Prometheus). Izibonelo zokusebenzisa i-MicroProfile Metrics API zinikezwe kuThebula 7.

Π’ iphrojekthi esibonelweni sethu I-MicroProfile Metrics isetshenziselwa ukunikeza amamethrikhi ohlelo lokusebenza. Ukuze uthole ukwaziswa okwengeziwe, bheka imanuwali ye-Quarcus Umhlahlandlela Wemethrikhi.

Ithebula 7. Izibonelo zokusebenzisa i-MicroProfile Metrics APIs.

Izici ze-MicroProfile Metrics
Incazelo
Izibonelo

@Ibaliwe

Kuchaza ikhawunta yokubala ebala izikhathi lapho into enezichasiselo ibizwe ngayo

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

@ConcurrentGauge

Isho igeji ebala inani lamakholi ahambisanayo ento enezichasiselo

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

@Gage

Isho inzwa ye-gauge ekala inani lento echazwe

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

@Metered

Isho inzwa yemitha eqapha ukuvama kwezingcingo zento enezichasiselo

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

I-Metric

Isichasiselo esiqukethe ulwazi mayelana nemethadatha uma isicelo samukelwe sokufaka noma ukukhiqiza imethrikhi

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

Isikhathi

Ibonisa isibali-sikhathi esilandelela ubude besikhathi bento enezichasiselo

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

Ama-Metrics Endpoints

Amamethrikhi ohlelo lokusebenza localhost:8080/metrics/application
Amamethrikhi ayisisekelo localhost:8080/amamethrikhi/isisekelo
Amamethrikhi omthengisi localhost:8080/amamethrikhi/umthengisi
Wonke amamethrikhi localhost:8080/amamethrikhi

I-MicroProfile Rest Client

Ama-Microservices ngokuvamile ahlinzeka ngamaphoyinti okuphela angu-RESTful adinga ama-API weklayenti ahambisanayo ukusebenza nawo. Ukuze usebenzise amaphoyinti okugcina angu-RESTful, onjiniyela base-Spring bavamise ukusebenzisa i-RestTemplate. I-Quarkus inikeza i-MicroProfile Rest Client APIs ukuxazulula le nkinga, izibonelo zokusebenzisa ezinikezwe kuThebula lesi-8.

Π’ iphrojekthi esibonelweni sethu ukusetshenziswa kwe-RESTful endpoints kwenziwa kusetshenziswa i-MicroProfile Rest Client. Ulwazi olwengeziwe nezibonelo ngalesi sihloko zingatholakala kubhukwana le-Quarkus Phumula Client Guide.

Ithebula 8. Izibonelo zokusebenzisa i-MicroProfile Rest Client APIs.

Izici Zeklayenti Zokuphumula ze-MicroProfile
Incazelo
Izibonelo

@RegisterRestClient

Ibhalisa isixhumi esibonakalayo se-Java esithayiphiwe njengeklayenti le-REST

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

@RestClient

Imaka ukuqaliswa kwesibonelo sokusetshenziswa kubonwa kweklayenti okuthayiphiwe kwe-REST

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

Ukucela

Ishayela indawo yokugcina ye-REST

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

mp-rest/url

Icacisa indawo yokugcina ye-REST

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

Imiphumela

Kule bhulogi, okuhloswe ngayo ikakhulukazi onjiniyela baseNtwasahlobo, sibheke ngokushesha ukuthi isetshenziswa kanjani i-Spring APIs nama-MicroProfile APIs e-Quarkus ukuze kuthuthukiswe ama-microservices e-Java bese siwahlanganisa abe ikhodi kanambambili yomdabu elondoloza amakhulukhulu amamegabhayithi e-RAM futhi iqalise ngo indaba yama-millisecond.

Njengoba usuzwile kakade, ulwazi olwengeziwe mayelana nokusekelwa kwe-Spring and MicroProfile APIs, kanye nolunye ulwazi oluningi oluwusizo, lungatholakala ku- Izincwadi zeQuarcus.

Source: www.habr.com

Engeza amazwana