Momwe Quarkus imaphatikizira MicroProfile ndi Spring

Moni nonse, nayi positi yachitatu pamndandanda wa Quarkus!

Momwe Quarkus imaphatikizira MicroProfile ndi Spring

Mukapanga ma microservices a Java, nthawi zambiri amakhulupirira kuti Eclipse MicroProfile ΠΈ Nsapato za Spring ndi ma API apadera komanso odziyimira pawokha. Mwachikhazikitso, opanga mapulogalamu amakonda kugwiritsa ntchito ma API omwe amawagwiritsa ntchito kale, popeza kuphunzira zikhazikitso zatsopano ndi zigawo za nthawi yothamanga kumatenga nthawi yambiri. Lero tiyesa kupeputsa chitukuko cha ena otchuka MicroProfile API ya opanga ma Spring ndikukuwonetsani momwe mungagwiritsire ntchito nthawi imodzi API ya Spring ndi zatsopano zothandiza quarkus.

Mwatsatanetsatane pang'ono, tiwona kaye kukula ndi tsatanetsatane wa momwe Quarkus imathandizira ma Spring APIs kuwonetsa opanga ma Spring momwe angagwiritsire ntchito MicroProfile API pantchito yawo yatsiku ndi tsiku. Kenako tidzaphimba ma MicroProfile API, omwe ndi othandiza kwa opanga ma Spring popanga ma microservices.

Chifukwa chiyani Quarks? Choyamba, uku ndiko kukopera kwamoyo, ndiko kuti, kutsitsanso zosintha zilizonse mu MicroProfile API, Spring API ndi ma API ena a Java, omwe amachitidwa ndi lamulo limodzi lokha: mvn quarkus:dev. Kachiwiri, kukambitsirana mu mu chitsanzo chathu ntchito ya Munthu (yomwe imapangidwa kuchokera ku Spring, MicroProfile, ndi JPA APIs kukhala binary pogwiritsa ntchito chithunzi chakwawo cha GraalVM) imayamba m'masekondi 0.055 ndipo imatenga pafupifupi 90 MB ya RAM (RSS) pamapeto a pulogalamu ya RESTful. Kuphatikiza apo, kuphatikiza kwake kumachitidwa ndi lamulo limodzi lokha: phukusi la mvn -Pnative.

Sitingafotokoze mwatsatanetsatane za MicroProfile, kupatulapo kuthandiza opanga ma Spring kumvetsetsa momwe angagwiritsire ntchito ma Spring API okhala ndi MicroProfile APIs mu Quarkus.

Containers ndi Kubernetes

Kuti nkhaniyi ikhale yosavuta, tingofotokoza za chithandizo chapamwamba apa. Kubernetes, chifukwa ndikofunika kumvetsa. Quarkus ili ngati stack ya Java ya Kubernetes, idapangidwa kuti ichepetse kugwiritsa ntchito kukumbukira komanso nthawi yoyambira ya mapulogalamu ndi ntchito za Java, ndipo, chifukwa chake, kukulitsa kachulukidwe kawo pa wolandila ndikuchepetsa ndalama zonse.

Quarks komanso imathandizira kupanga auto Kubernetes zothandizira ndi zopereka utsogoleri kuti atumizidwe pa Kubernetes ndi Red Hat OpenShift nsanja. Kuphatikiza apo, Quarkus imapanga zokha mafayilo a Dockerfile.jvm (JVM) ndi Dockerfile.native (native binary packaging) omwe amafunikira kuti apange zotengera.

Pomaliza, poyang'ana Kubernetes monga malo omwe akugwiritsidwa ntchito, Quarkus sagwiritsa ntchito machitidwe a Java pazochitika zomwe ntchito zofanana zikugwiritsidwa ntchito pamlingo wa Kubernetes pawokha. Gulu 1 limapereka mapu a makalata ogwira ntchito pakati pa Kubernetes ndi machitidwe a Java omwe amagwiritsidwa ntchito ndi opanga Spring.

Table 1. Mapu a makalata ogwira ntchito pakati pa Java frameworks ndi Kubernetes.

Yogwira
Traditional Spring Boot
Kubernetes

Kupeza ntchito
Eureka
DNS

kasinthidwe
Spring Cloud Config
Konzani Mamapu/Zinsinsi

Katundu woyeserera
Riboni (mbali ya kasitomala)
Service, Replication Controller (mbali ya seva)

Kulemba ndi kuyendetsa ma code kuchokera ku chitsanzo

M’nkhani ino tikunena za mwachitsanzo polojekiti, kumene Spring ndi MicroProfile APIs komanso ngakhale kalasi ya Java yomweyi imagwiritsidwa ntchito palimodzi. Khodi yomwe ili mu chitsanzo ichi ikhoza kupangidwa ndikuyenda kuchokera pamzere wolamula, onani fayilo ya README.md kuti mudziwe zambiri.

Spring Framework APIs

Jekeseni Wodalira

Quarks imathandizira osiyanasiyana Contexts and Dependency Injection (CDI) APIs ndi Spring Dependency Injection (Spring DI) API. Ngati mukugwira ntchito ndi MicroProfile, Java EE ndi Jakarta EE, ndiye kuti mumadziwa kale CDI. Kumbali ina, opanga ma Spring atha kugwiritsa ntchito Quarkus Extension ya Spring DI API kuti akwaniritse zogwirizana ndi Spring DI. Zitsanzo zogwiritsa ntchito ma API a Spring DI aperekedwa mu Gulu 2.

Π’ polojekiti kuchokera ku chitsanzo chathu Amagwiritsa ntchito CDI ndi Spring Dependency Injection. Kuti mumve zambiri komanso zitsanzo pamutuwu, onani kalozera wa Quarkus wotchedwa Spring DI Guide.

Table 2. Zitsanzo zogwiritsira ntchito ma Spring DI APIs.

Zothandizira za Spring DI
zitsanzo

Jekeseni Wopanga

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

Kubaya M'munda
Zoyendetsedwa ndi mawaya
mtengo

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

nyemba
@Configuration

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

chigawo chimodzi

@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 chimango

Ogwiritsa ntchito a MicroProfile angakonde kuti Quarkus imathandizira JAX-RS, MicroProfile Rest Client, JSON-P, ndi JSON-B ngati njira yoyamba yopangira mapulogalamu a pa intaneti. Opanga masika adzakondwera ndi chithandizo chaposachedwa cha Quarkus pa Spring Web API, makamaka malo a REST. Mofanana ndi Spring DI, cholinga chachikulu cha chithandizo cha Spring Web API ndikulola opanga ma Spring kuti agwiritse ntchito ma Spring Web APIs molumikizana ndi MicroProfile APIs. Zitsanzo za momwe mungagwiritsire ntchito ma API a Spring Web aperekedwa mu Table 3, ndipo zambiri ndi zitsanzo pamutuwu zitha kupezeka mu phunziro la Quarkus lotchedwa. Spring Web Guide.

Table 3. Zitsanzo zogwiritsira ntchito ma API a Spring Web.

Zothandizira za Spring Web
zitsanzo

@RestController
@RequestMapping

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

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

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

Spring DataJPA

Ogwiritsa ntchito a MicroProfile adzayamikiranso kuti Quarkus imathandizira JPA pogwiritsa ntchito Hibernate ORM. Palinso nkhani yabwino kwa opanga ma Spring: Quarkus imathandizira zolemba ndi mitundu wamba ya Spring Data JPA. Zitsanzo zogwiritsa ntchito ma API a Spring Data JPA aperekedwa mu Gulu 4.
Π’ polojekiti kuchokera ku chitsanzo chathu Spring Data JPA APIs amagwiritsidwa ntchito ndipo zambiri zimapezeka mu phunziro la Quarkus lotchedwa Spring Data JPA Guide.

Gulu 4. Zitsanzo zogwiritsira ntchito ma API a Spring Data JPA.

Zothandizira za Spring Data JPA
zitsanzo

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Zidutswa Zosungirako

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

Njira zowunikira zofufuzidwa

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Mafunso ofotokozedwa ndi ogwiritsa ntchito

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

Kulekerera zolakwa

Zopanga zolekerera zolakwika ndizofunikira kwambiri popewa kulephera kwapang'onopang'ono ndikupanga zomangamanga zodalirika za microservice. Opanga masika akhala akugwiritsa ntchito ophwanya madera kuti athe kulekerera zolakwika kwa zaka zambiri. Hystrix. Komabe, Hystrix sinasinthidwe kwa nthawi yayitali, koma Kulekerera Zolakwa kwa MicroProfile tsopano ikukula mwachangu ndipo ili ndi zaka zingapo zogwiritsa ntchito kupanga kumbuyo kwake. Choncho, pofuna kupititsa patsogolo kudalirika kwa mautumiki ku Quarkus, tikulimbikitsidwa kugwiritsa ntchito MicroProfile Fault Tolerance APIs, zitsanzo zomwe zimagwiritsidwa ntchito mu Table 5. Kuti mudziwe zambiri pa izi, onani Buku la Quarkus. Fault Tolerance Guide.

Table 5. Zitsanzo zogwiritsira ntchito MicroProfile Fault Tolerance APIs.

MicroProfile Fault Tolerance Features
mafotokozedwe
zitsanzo

@Asynchronous

Kuchita logic mu ulusi wina

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

@Bulkhead

Chepetsani kuchuluka kwa zopempha nthawi imodzi

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

@CircuitBreaker

Smart kulephera kusamalira ndi kuchira ku zolephera

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

@Bwererani m'mbuyo

Kuyitana njira zina zomveka ngati zalephera

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

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

Yesanso

Yeseraninso zikalephera

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

Lekeza panjira

Kulephera kudziletsa kutha

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

Ma checking services (Service Health)

Mapulatifomu a Kubernetes amayang'anira thanzi la zotengera pogwiritsa ntchito ntchito zapadera. Kuti alole nsanja yoyambira kuyang'anira ntchito, opanga ma Spring nthawi zambiri amagwiritsa ntchito HealthIndicator ndi Spring Boot Actuator. Ku Quarkus, izi zitha kuchitika pogwiritsa ntchito MicroProfile Health, yomwe mosakhazikika imayang'ana moyo, koma ikhoza kukonzedwa kuti iwonetsere nthawi yomweyo kukhala ndi moyo komanso kukonzekera. Zitsanzo zamomwe mungagwiritsire ntchito ma MicroProfile Health APIs aperekedwa mu Table 6, ndipo zambiri zaperekedwa mu buku la Quarkus. Upangiri wa Zaumoyo.

Gulu 6: Zitsanzo zogwiritsidwa ntchito za MicroProfile Health APIs zothandizidwa.

Zinthu za MicroProfile Health
mafotokozedwe
zitsanzo

@Umoyo

Pulatifomu imayambiranso ntchito zomwe zidalephera
Pomaliza:
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();  
}

@Kukonzeka

Pulatifomu sidzatumiza magalimoto kumapulogalamu omwe ali ndi zida ngati sizinakonzekere
Pomaliza:
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();  
}

Metrics

Mapulogalamu amapereka ma metric pazifukwa zogwirira ntchito (kuyang'anira ma SLA) kapena zolinga zosagwira ntchito (ma SLA abizinesi). Opanga masika amapereka ma metrics pogwiritsa ntchito Spring Boot Actuator ndi Micrometer. Komanso, Quarkus amagwiritsa ntchito MicroProfile Metrics kuti apereke ma metric oyambira (JVM ndi makina ogwiritsira ntchito), ma metrics ogulitsa (Quarkus), ndi ma metrics ogwiritsira ntchito. MicroProfile Metrics imafuna kuti kukhazikitsa kumathandizira mawonekedwe a JSON ndi OpenMetrics (Prometheus). Zitsanzo zogwiritsira ntchito MicroProfile Metrics API zaperekedwa mu Table 7.

Π’ polojekiti kuchokera ku chitsanzo chathu Ma Metric a MicroProfile amagwiritsidwa ntchito popereka ma metric ogwiritsira ntchito. Kuti mumve zambiri, onani buku la Quarkus Metrics Guide.

Table 7. Zitsanzo zogwiritsira ntchito MicroProfile Metrics APIs.

Mawonekedwe a MicroProfile Metrics
mafotokozedwe
zitsanzo

@Kuwerengera

Imatanthawuza kauntala yomwe imawerengera nthawi yomwe chinthu chofotokozera chaitanidwa

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

@ConcurrentGauge

Imatanthawuza geji yomwe imawerengera kuchuluka kwa kuyimba nthawi imodzi kupita ku chinthu chofotokozera

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

@Gauge

Kutanthauza kachipangizo kamene kamayesa kufunikira kwa chinthu cholembedwa

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

@Metered

Imayimira sensa ya mita yomwe imayang'anira kuchuluka kwa kuyimba kwa chinthu chofotokozera

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

Miyeso

Mawu ofotokozera omwe ali ndi zambiri za metadata pempho likalandiridwa kuti mulowe kapena kupanga metric

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

Nthawi

Imawonetsa chowerengera chomwe chimatsata nthawi ya chinthu chofotokozera

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

Mapeto a Metrics

Ma metrics ogwiritsira ntchito localhost:8080/metrics/application
Basic metrics localhost: 8080 / metrics / maziko
Ma metrics ogulitsa localhost:8080/metrics/wogulitsa
Ma metrics onse localhost: 8080/metrics

MicroProfile Rest Client

Ma Microservices nthawi zambiri amapereka zomaliza za RESTful zomwe zimafuna ma API a kasitomala kuti azigwira nawo ntchito. Kuti mugwiritse ntchito zomaliza za RESTful, opanga ma Spring nthawi zambiri amagwiritsa ntchito RestTemplate. Quarkus amapereka MicroProfile Rest Client APIs kuti athetse vutoli, zitsanzo za ntchito zomwe zaperekedwa mu Table 8.

Π’ polojekiti kuchokera ku chitsanzo chathu kugwiritsidwa ntchito kwa RESTful endpoints kumachitika pogwiritsa ntchito MicroProfile Rest Client. Zambiri ndi zitsanzo pamutuwu zitha kupezeka m'buku la Quarkus Pumulani Client Guide.

Table 8. Zitsanzo zogwiritsira ntchito MicroProfile Rest Client APIs.

Makasitomala Opumula a MicroProfile
mafotokozedwe
zitsanzo

@RegisterRestClient

Imalembetsa mawonekedwe a Java otayidwa ngati kasitomala wa REST

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

@RestClient

Imawonetsa kukhazikitsidwa kwa chitsanzo cha mawonekedwe a kasitomala a REST

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

Kupempha

Imayitanira kumapeto kwa REST

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

mp-mpumulo/url

Imatchula mathero a REST

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

Zotsatira

Mu blog iyi, yomwe imayang'ana makamaka opanga ma Spring, tidayang'ana mwachangu momwe tingagwiritsire ntchito ma API a Spring ndi MicroProfile APIs ku Quarkus kupanga ma microservices a Java ndikuzipanga kukhala ma code a binary omwe amasunga mazana a megabytes a RAM ndikuyambitsa nkhani ya milliseconds.

Monga momwe mumamvera kale, zambiri zokhudzana ndi chithandizo cha Spring ndi MicroProfile APIs, komanso zambiri zothandiza, zitha kupezeka Mabuku a Quarkus.

Source: www.habr.com

Kuwonjezera ndemanga