Jinsi Quarkus inachanganya MicroProfile na Spring

Jambo kila mtu, hapa kuna chapisho la tatu katika mfululizo wa Quarkus!

Jinsi Quarkus inachanganya MicroProfile na Spring

Wakati wa kuendeleza huduma ndogo za Java, mara nyingi huaminika hivyo Eclipse MicroProfile ΠΈ Kiatu cha chemchemi ni API tofauti na huru. Kwa chaguo-msingi, watengenezaji programu huwa wanatumia API ambazo tayari wamezizoea, kwani kujifunza mifumo mipya na vipengele vya wakati wa utekelezaji huchukua muda mwingi. Leo tutajaribu kurahisisha maendeleo ya baadhi maarufu MicroProfile API kwa watengenezaji wa Spring na kukuonyesha jinsi ya kutumia kwa wakati mmoja API ya Spring na vipengele vipya muhimu quarcus.

Kwa undani zaidi, kwanza tutaangalia upeo na maelezo ya jinsi Quarkus inavyotumia API za Spring ili kuonyesha wasanidi wa Spring jinsi ya kutumia API ya MicroProfile katika kazi zao za kila siku. Kisha, tutaanzisha API za MicroProfile, ambazo ni muhimu kwa watengenezaji wa Spring wakati wa kuunda huduma ndogo.

Kwa nini Quarkus? Kwanza, hii ni kuweka coding moja kwa moja, ambayo ni, upakiaji otomatiki wa mabadiliko yoyote katika API ya MicroProfile, API ya Spring na API zingine za Java, ambayo hufanywa kwa amri moja tu: mvn quarkus:dev. Pili, kuzingatiwa katika katika mfano wetu huduma ya Mtu (ambayo hujumuisha kutoka API za Spring, MicroProfile, na JPA hadi kwenye mfumo wa jozi kwa kutumia picha asili ya GraalVM) huanza kwa sekunde 0.055 tu na kuchukua takriban MB 90 za RAM (RSS) kwenye sehemu ya mwisho ya programu RESTful. Kwa kuongezea, mkusanyiko wake yenyewe unafanywa kwa amri moja tu: kifurushi cha mvn -Pnative.

Hatutaeleza kwa undani kuhusu MicroProfile, zaidi ya kuwasaidia wasanidi wa Spring kuelewa jinsi wanavyoweza kutumia API za Spring na API za MicroProfile katika Quarkus.

Vyombo na Kubernetes

Ili kufanya makala haya kuwa rahisi, tutashughulikia vipengele vya usaidizi wa hali ya juu hapa. Mabernet, kwa sababu ni muhimu kuelewa. Quarkus imewekwa kama safu ya Java kwa Kubernetes, imeundwa kupunguza utumiaji wa kumbukumbu na wakati wa kuanza kwa programu na huduma za Java, na, kwa sababu hiyo, kuongeza msongamano wao kwa seva pangishi na kupunguza gharama za jumla.

Quarcus pia inasaidia kutengeneza otomatiki Rasilimali na matoleo ya Kubernetes viongozi kwa ajili ya kupelekwa kwenye mifumo ya Kubernetes na Red Hat OpenShift. Kwa kuongezea, Quarkus hutengeneza kiotomatiki faili za Dockerfile.jvm (ufungaji wa JVM) na faili za Dockerfile.native (ufungaji asili wa mfumo wa jozi) zinazohitajika kuunda vyombo.

Hatimaye, kwa kuzingatia Kubernetes kama mazingira lengwa ya utumiaji, Quarkus haitumii mifumo ya Java katika hali ambapo utendakazi sawa unatekelezwa katika kiwango cha jukwaa la Kubernetes lenyewe. Jedwali la 1 linatoa ramani ya mawasiliano ya kiutendaji kati ya Kubernetes na mifumo ya kawaida ya Java inayotumiwa na wasanidi wa Spring.

Jedwali 1. Ramani ya mawasiliano ya kazi kati ya mifumo ya Java na Kubernetes.

Kazi
Boot ya Jadi ya Spring
Mabernet

Ugunduzi wa huduma
Eureka
DNS

Configuration
Usanidi wa Wingu la Spring
Sanidi Ramani/Siri

Mzigo wa kupakia
Utepe (upande wa mteja)
Huduma, Kidhibiti cha Kurudiarudia (upande wa seva)

Kukusanya na kuendesha msimbo kutoka kwa mfano

Katika makala hii tunarejelea mradi wa mfano, ambapo API za Spring na MicroProfile na hata darasa moja la Java hutumiwa pamoja. Nambari katika mfano huu inaweza kukusanywa na kukimbia kutoka kwa safu ya amri, angalia faili ya README.md kwa maelezo.

API za Mfumo wa Spring

Sindano ya Kutegemea

Quarkus inasaidia anuwai ya API za Muktadha na Utegemezi wa Sindano (CDI). na API za Spring Dependency Injection (Spring DI). Ikiwa unafanya kazi na MicroProfile, Java EE na Jakarta EE, basi tayari unaifahamu sana CDI. Kwa upande mwingine, watengenezaji wa Spring wanaweza kutumia Kiendelezi cha Quarkus kwa API ya Spring DI ili kufikia uoanifu na Spring DI. Mifano ya kutumia API za Spring DI zinazotumika imetolewa katika Jedwali la 2.

Π’ mradi kutoka kwa mfano wetu Hutumia CDI na Sindano ya Kutegemea Spring. Kwa habari zaidi na mifano juu ya mada hii, angalia mwongozo wa Quarkus unaoitwa Mwongozo wa DI wa Spring.

Jedwali la 2. Mifano ya kutumia API za Spring DI zinazotumika.

Vipengele vinavyotumika vya Spring DI
mifano

Sindano ya Wajenzi

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

Sindano ya shamba
Ina waya otomatiki
Thamani

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Maharage
@Usanidi

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

Sehemu

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

huduma

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

   public String getPrefix() {
      return message;
   }
}

Mfumo wa wavuti

Watumiaji wa MicroProfile watapenda kwamba Quarkus inasaidia JAX-RS, MicroProfile Rest Client, JSON-P, na JSON-B kama kielelezo cha msingi cha programu ya wavuti. Wasanidi wa chemchemi watafurahishwa na usaidizi wa hivi majuzi wa Quarkus kwa API ya Wavuti ya Spring, haswa violesura vya REST. Sawa na Spring DI, lengo kuu la usaidizi wa API ya Spring Web ni kuwawezesha wasanidi wa Spring kutumia API za Spring Web kwa kushirikiana na API za MicroProfile. Mifano ya jinsi ya kutumia API za Spring Web zinazotumika imetolewa katika Jedwali la 3, na maelezo zaidi na mifano kuhusu mada hii inaweza kupatikana katika mafunzo ya Quarkus yanayoitwa. Mwongozo wa Wavuti wa Spring.

Jedwali la 3. Mifano ya kutumia API za Wavuti za Spring zinazotumika.

Vipengele vya Wavuti vya Spring vinavyotumika
mifano

@RestController
@RequestMapping

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

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

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

Data ya Spring JPA

Watumiaji wa MicroProfile pia watathamini kwamba Quarkus inasaidia JPA kwa kutumia Hibernate ORM. Pia kuna habari njema kwa wasanidi wa Spring: Quarkus hutumia maelezo na aina za kawaida za Data ya Spring ya JPA. Mifano ya kutumia API za JPA Data ya Spring inayotumika imetolewa katika Jedwali la 4.
Π’ mradi kutoka kwa mfano wetu Spring Data JPA APIs hutumiwa na maelezo zaidi yanapatikana katika mafunzo ya Quarkus yanayoitwa Mwongozo wa JPA wa data ya Spring.

Jedwali la 4. Mifano ya kutumia API za JPA za Data ya Spring zinazotumika.

Vipengele vya JPA vya Data ya Spring vinavyotumika
mifano

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Vipande vya Hifadhi

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

Njia za kuuliza zinazotokana

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Maswali yaliyofafanuliwa na mtumiaji

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 za Wasifu Ndogo

Uvumilivu wa makosa

Uundaji wa uvumilivu wa makosa ni muhimu sana kwa kuzuia kushindwa kwa kasi na kuunda usanifu wa kuaminika wa huduma ndogo. Watengenezaji wa spring wamekuwa wakitumia vivunja mzunguko kwa uvumilivu wa makosa kwa miaka mingi. Hystrix. Hata hivyo, Hystrix haijasasishwa kwa muda mrefu, lakini Uvumilivu wa Fault wa MicroProfile sasa unaendelea kikamilifu na ina miaka kadhaa ya matumizi ya uzalishaji nyuma yake. Kwa hiyo, ili kuboresha uaminifu wa huduma katika Quarkus, inashauriwa kutumia API za Uvumilivu wa Fault MicroProfile, mifano ambayo hutumiwa katika Jedwali la 5. Kwa habari zaidi juu ya hili, angalia mwongozo wa Quarkus. Mwongozo wa Kuvumilia Makosa.

Jedwali la 5. Mifano ya kutumia API za Kuvumilia Hitilafu za MicroProfile zinazotumika.

Vipengele vya Kuvumilia Kosa la MicroProfile
Description
mifano

@Asynchronous

Utekelezaji wa mantiki katika uzi tofauti

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

@Bulkhead

Kupunguza idadi ya maombi ya wakati mmoja

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

@CircuitBreaker

Utunzaji wa kushindwa kwa busara na urejeshaji kutoka kwa kushindwa

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

@Kuanguka nyuma

Kuita mantiki mbadala katika kesi ya kushindwa

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

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

Jaribu tena

Jaribu tena kwa kushindwa kwa ombi

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

Muda umeisha

Udhibiti wa kushindwa kuisha

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

Huduma za ukaguzi (Afya ya Huduma)

Majukwaa ya Kubernetes hufuatilia afya ya vyombo kwa kutumia huduma maalum. Ili kuruhusu jukwaa la msingi kufuatilia huduma, wasanidi wa Spring kwa kawaida hutumia Kiashiria maalum cha Afya na Kiwezeshaji Boot cha Spring. Katika Quarkus, hii inaweza kufanywa kwa kutumia MicroProfile Health, ambayo kwa chaguo-msingi hufanya ukaguzi wa uhai, lakini inaweza kusanidiwa ili kuangalia wakati huo huo uhai na utayarifu. Mifano ya jinsi ya kutumia API za Afya za MicroProfile zinazotumika imetolewa katika Jedwali la 6, na maelezo ya ziada yametolewa katika mwongozo wa Quarkus. Mwongozo wa Afya.

Jedwali la 6: Mifano ya matumizi ya API za Afya za MicroProfile zinazotumika.

Vipengele vya Afya ya MicroProfile
Description
mifano

@Maisha

Mfumo huwasha upya programu zilizo na kontena zilizoshindwa
Mwisho:
mwenyeji:8080/afya/live

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

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

@Tayari

Mfumo hautatuma trafiki kwa programu zilizo na kontena ikiwa haiko tayari
Mwisho:
mwenyeji:8080/afya/tayari

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

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

Vipimo

Programu hutoa vipimo kwa madhumuni ya uendeshaji (kufuatilia SLA za utendaji) au madhumuni yasiyo ya uendeshaji (SLA za biashara). Wasanidi wa chemchemi hutoa vipimo kwa kutumia Spring Boot Actuator na Micrometer. Kwa upande wake, Quarkus hutumia Metrics ya MicroProfile kutoa vipimo vya msingi (JVM na mfumo wa uendeshaji), vipimo vya wachuuzi (Quarkus), na vipimo vya programu. Metrics ya MicroProfile inahitaji kwamba utekelezaji utumie miundo ya kutoa ya JSON na OpenMetrics (Prometheus). Mifano ya kutumia API ya Vipimo vya Wasifu Midogo imetolewa katika Jedwali la 7.

Π’ mradi kutoka kwa mfano wetu Vipimo vya Wasifu Ndogo hutumika kutoa vipimo vya programu. Kwa habari zaidi, angalia mwongozo wa Quarkus Mwongozo wa Vipimo.

Jedwali la 7. Mifano ya kutumia API za Metrics za MicroProfile.

Vipengele vya Vipimo vya Wasifu Ndogo
Description
mifano

@Imehesabiwa

Inaashiria kaunta ambayo huhesabu idadi ya mara ambazo kitu kilichofafanuliwa kimeitwa

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

@ConcurrentGauge

Inaashiria kipimo ambacho huhesabu idadi ya simu zinazofanana kwa kitu kilichofafanuliwa

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

@Kipimo

Inaashiria kihisi cha kupima ambacho hupima thamani ya kitu kilichofafanuliwa

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

@Metered

Inaashiria kihisi cha mita kinachofuatilia marudio ya simu ya kitu kilichofafanuliwa

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

Kiwango cha eneo

Kidokezo kilicho na maelezo kuhusu metadata wakati ombi la kuingiza au kutoa kipimo kinapopokelewa

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

Wakati umekamilika

Huonyesha kipima muda kinachofuatilia muda wa kitu kilichofafanuliwa

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

Vipimo vya Mwisho vya Metrics

Vipimo vya maombi lochost:8080/metrics/application
Vipimo vya msingi lochost:8080/metrics/msingi
Vipimo vya muuzaji lochost:8080/metrics/muuzaji
Vipimo vyote lochost:8080/kipimo

MicroProfile Rest Mteja

Huduma ndogo mara nyingi hutoa vidokezo RESTful ambavyo vinahitaji API za mteja zinazolingana kufanya kazi nazo. Ili kutumia vidokezo vya RESTful, wasanidi wa Spring kwa kawaida hutumia RestTemplate. Quarkus inatoa MicroProfile Rest Client APIs kutatua tatizo hili, mifano ya matumizi ambayo imetolewa katika Jedwali 8.

Π’ mradi kutoka kwa mfano wetu matumizi ya vituo vya RESTful hufanywa kwa kutumia Mteja wa Kupumzika kwa MicroProfile. Habari zaidi na mifano juu ya mada hii inaweza kupatikana katika mwongozo wa Quarkus Mwongozo wa Mteja wa kupumzika.

Jedwali 8. Mifano ya kutumia MicroProfile Rest Client APIs.

Vipengele vya Mteja wa Kupumzika kwa MicroProfile
Description
mifano

@RegisterRestClient

Husajili kiolesura cha Java kilichochapwa kama kiteja cha REST

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

@RestClient

Huashiria utekelezaji wa mfano wa kiolesura cha mteja cha REST

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

Kuomba

Inapigia simu kituo cha REST

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

mp-rest/url

Hubainisha sehemu ya mwisho ya REST

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

Matokeo ya

Katika blogu hii, inayolenga hasa watengenezaji wa Spring, tuliangalia kwa haraka jinsi ya kutumia API za Spring na API za MicroProfile katika Quarkus ili kuunda huduma ndogo za Java na kisha kuzikusanya katika msimbo wa binary asili ambao huhifadhi mamia ya megabytes ya RAM na kuzinduliwa. suala la milliseconds.

Kama ulivyoelewa tayari, maelezo zaidi kuhusu usaidizi wa API za Spring na MicroProfile, pamoja na maelezo mengine mengi muhimu, yanaweza kupatikana katika Miongozo ya Quarcus.

Chanzo: mapenzi.com

Kuongeza maoni