Giunsa paghiusa ni Quarkus ang MicroProfile ug Spring

Kumusta sa tanan, ania ang ikatulo nga post sa serye sa Quarkus!

Giunsa paghiusa ni Quarkus ang MicroProfile ug Spring

Kung nagpalambo sa mga microservice sa Java, kanunay nga gituohan nga Eclipse MicroProfile ΠΈ Spring boot lahi ug independente nga mga API. Sa kasagaran, ang mga programmer lagmit nga mogamit sa mga API nga ilang gigamit na, tungod kay ang pagkat-on sa bag-ong mga balangkas ug mga sangkap sa runtime nagkinahanglan og daghang panahon. Karon kita mosulay sa pagpayano sa kalamboan sa pipila ka mga popular MicroProfile API alang sa mga developer sa Spring ug ipakita kanimo kung giunsa ang dungan nga paggamit sa Spring API ug mga bag-ong mapuslanon nga bahin quarkus.

Sa gamay nga detalye, atong tan-awon una ang sakup ug mga detalye kung giunsa pagsuporta sa Quarkus ang mga Spring API aron ipakita sa mga developer sa Spring kung giunsa paggamit ang MicroProfile API sa ilang adlaw-adlaw nga trabaho. Dayon atong tabonan ang MicroProfile APIs, nga mapuslanon alang sa Spring developers sa paghimo og microservices.

Ngano Quarkus? Una, kini mao ang live coding, sa ato pa, awtomatik nga pag-reload sa bisan unsang mga pagbag-o sa MicroProfile API, Spring API ug uban pang mga Java API, nga gihimo sa usa lang ka sugo: mvn quarkus:dev. Ikaduha, gihisgutan sa sa atong ehemplo ang serbisyo sa Tawo (nga nag-compile gikan sa Spring, MicroProfile, ug JPA APIs ngadto sa binary gamit ang lumad nga GraalVM image) magsugod sa 0.055 ka segundo lang ug mokabat ug 90 MB sa RAM (RSS) sa RESTful application endpoint. Dugang pa, ang paghugpong niini mismo gihimo sa usa lang ka sugo: mvn package -Pnative.

Dili na kami magdetalye bahin sa MicroProfile, gawas sa pagtabang sa mga developer sa Spring nga masabtan kung giunsa nila paggamit ang mga Spring API nga adunay mga MicroProfile API sa Quarkus.

Mga sudlanan ug Kubernetes

Aron mapasimple kining artikuloha, tabonan lang nato ang taas nga lebel nga aspeto sa suporta dinhi. Kubernetes, tungod kay importante nga masabtan. Gipahimutang ang Quarkus isip Java stack para sa Kubernetes, kini gidisenyo aron mapamenos ang konsumo sa memorya ug oras sa pagsugod sa mga aplikasyon ug serbisyo sa Java, ug, isip resulta, madugangan ang ilang densidad sa host ug makunhuran ang kinatibuk-ang gasto.

Quarkus usab nagsuporta sa auto generation Mga kapanguhaan ug mga tanyag sa Kubernetes pagpangulo alang sa pag-deploy sa Kubernetes ug Red Hat OpenShift nga mga plataporma. Dugang pa, ang Quarkus awtomatik nga nagmugna sa Dockerfile.jvm (JVM packaging) ug Dockerfile.native (native binary packaging) nga mga file nga gikinahanglan sa paghimo og mga sudlanan.

Sa katapusan, pinaagi sa pag-focus sa Kubernetes isip target nga deployment environment, ang Quarkus wala mogamit sa Java frameworks sa mga kaso diin ang susamang functionality gipatuman sa lebel sa Kubernetes platform mismo. Ang talaan 1 naghatag ug mapa sa functional nga mga sulat tali sa Kubernetes ug kasagarang Java frameworks nga gigamit sa Spring developers.

Talaan 1. Mapa sa functional correspondence tali sa Java frameworks ug Kubernetes.

Nahiangay
Tradisyonal nga Spring Boot
Kubernetes

Pagdiskobre sa serbisyo
Eureka
DNS

kontorno
Spring Cloud Config
I-configure ang mga Mapa/Mga Sekreto

Pagbalanse sa pagkarga
Ribbon (kliyente nga bahin)
Serbisyo, Replikasyon Controller (server side)

Pag-compile ug pagpadagan sa code gikan sa pananglitan

Niini nga artikulo atong gitumong pananglitan nga proyekto, diin ang Spring ug MicroProfile API ug bisan ang parehas nga klase sa Java gigamit nga magkauban. Ang code niini nga panig-ingnan mahimong i-compile ug modagan gikan sa command line, tan-awa ang README.md file alang sa mga detalye.

Spring Framework APIs

Pagdugang sa Pagdugang

Quarkus nagsuporta sa usa ka lain-laing mga Mga Konteksto ug Dependency Injection (CDI) API ug Spring Dependency Injection (Spring DI) API. Kung nagtrabaho ka sa MicroProfile, Java EE ug Jakarta EE, unya pamilyar na kaayo ka sa CDI. Sa laing bahin, ang mga developer sa Spring mahimong mogamit sa Quarkus Extension para sa Spring DI API aron makab-ot ang pagkaangay sa Spring DI. Ang mga pananglitan sa paggamit sa gisuportahan nga Spring DI APIs gihatag sa Table 2.

Π’ proyekto gikan sa among ehemplo Gigamit ang CDI ug Spring Dependency Injection. Para sa dugang nga impormasyon ug mga pananglitan niini nga hilisgutan, tan-awa ang Quarkus guide nga gitawag Giya sa Spring DI.

Talaan 2. Mga pananglitan sa paggamit sa gisuportahan nga Spring DI APIs.

Gisuportahan nga Spring DI Features
mga panig-ingnan

Constructor Injection

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

Field Injection
Autowired
bili

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Configuration

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

nga pag-alagad

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

   public String getPrefix() {
      return message;
   }
}

Web framework

Ang mga tiggamit sa MicroProfile ganahan nga ang Quarkus nagsuporta sa JAX-RS, MicroProfile Rest Client, JSON-P, ug JSON-B isip nag-unang modelo sa web programming. Ang mga developer sa tingpamulak malipay sa bag-o nga suporta ni Quarkus alang sa Spring Web API, ilabi na sa mga interface sa REST. Sama sa Spring DI, ang nag-unang tumong sa suporta sa Spring Web API mao ang paghimo sa Spring developers sa paggamit sa Spring Web APIs inubanan sa MicroProfile APIs. Ang mga panig-ingnan kung giunsa paggamit ang gisuportahan nga Spring Web API gihatag sa Talaan 3, ug dugang nga kasayuran ug mga pananglitan niini nga hilisgutan makita sa panudlo sa Quarkus nga gitawag Spring Web Guide.

Talaan 3. Mga pananglitan sa paggamit sa gisuportahan nga Spring Web APIs.

Gisuportahan ang Spring Web Features
mga panig-ingnan

@RestController
@RequestMapping

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

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

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

Spring DataJPA

Ang mga tiggamit sa MicroProfile mapasalamaton usab nga ang Quarkus nagsuporta sa JPA gamit ang Hibernate ORM. Adunay usab maayong balita alang sa mga developer sa Spring: Gisuportahan sa Quarkus ang sagad nga mga anotasyon ug tipo sa Spring Data JPA. Ang mga pananglitan sa paggamit sa gisuportahan nga Spring Data JPA APIs gihatag sa Table 4.
Π’ proyekto gikan sa among ehemplo Ang Spring Data JPA API gigamit ug dugang impormasyon ang anaa sa Quarkus tutorial nga gitawag Giya sa Spring Data JPA.

Talaan 4. Mga pananglitan sa paggamit sa gisuportahan nga Spring Data JPA APIs.

Gisuportahan nga Spring Data JPA Features
mga panig-ingnan

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Mga Fragment sa Repositori

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

Nakuha nga mga pamaagi sa pagpangutana

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Mga pangutana nga gitakda sa user

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

Mga MicroProfile API

Ang pagtugot sa sayup

Ang mga pagtukod sa pagtugot sa sayup hinungdanon kaayo alang sa pagpugong sa mga kapakyasan sa cascading ug paghimo sa kasaligan nga mga arkitektura sa microservice. Ang mga tig-develop sa tingpamulak naggamit sa mga circuit breaker alang sa pagtugot sa sayup sa daghang mga tuig. Hystrix. Bisan pa, ang Hystrix wala pa ma-update sa dugay nga panahon, apan ang MicroProfile's Fault Tolerance karon aktibo nga nag-uswag ug adunay daghang tuig nga paggamit sa produksiyon sa luyo niini. Busa, aron mapalambo ang pagkakasaligan sa mga serbisyo sa Quarkus, girekomendar nga gamiton ang MicroProfile Fault Tolerance APIs, ang mga pananglitan niini gigamit sa Table 5. Alang sa dugang nga impormasyon niini, tan-awa ang manwal sa Quarkus Giya sa Pagtugot sa Kasaypanan.

Talaan 5. Mga pananglitan sa paggamit sa gisuportahan nga MicroProfile Fault Tolerance APIs.

MicroProfile Fault Tolerance Features
paghulagway
mga panig-ingnan

@Asynchronous

Pagpatuman sa lohika sa usa ka lahi nga hilo

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

@Bulkhead

Limitahi ang gidaghanon sa dungan nga mga hangyo

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

@CircuitBreaker

Smart kapakyasan pagdumala ug pagbawi gikan sa mga kapakyasan

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

@Fallback

Pagtawag sa alternatibong lohika kung adunay kapakyasan

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

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

retry

Sulayi pag-usab kung napakyas ang paghangyo

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

Timeout

Ang kapakyasan sa pagkontrol sa timeout

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

Mga serbisyo sa pagsusi (Serbisyo sa Panglawas)

Ang mga platform sa Kubernetes nagmonitor sa kahimsog sa mga sudlanan gamit ang mga espesyal nga serbisyo. Aron tugotan ang nagpahiping plataporma sa pag-monitor sa mga serbisyo, ang mga developer sa Spring kasagarang mogamit sa usa ka custom nga HealthIndicator ug Spring Boot Actuator. Sa Quarkus, mahimo kini gamit ang MicroProfile Health, nga pinaagi sa default naghimo sa usa ka liveness check, apan mahimo nga ma-configure aron dungan nga susihon ang kabuhong ug kaandam. Ang mga pananglitan kung giunsa paggamit ang gisuportahan nga MicroProfile Health API gihatag sa Talaan 6, ug ang dugang nga kasayuran gihatag sa manwal sa Quarkus Giya sa Panglawas.

Talaan 6: Mga pananglitan sa paggamit sa gisuportahan nga mga MicroProfile Health API.

Mga bahin sa Panglawas sa MicroProfile
paghulagway
mga panig-ingnan

@Pagkinabuhi

Ang pag-reboot sa plataporma napakyas sa mga containerized nga aplikasyon
Katapusan nga punto:
host: 8080 / panglawas / buhi

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

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

@Andam

Ang plataporma dili magpadala sa trapiko sa mga containerized nga aplikasyon kung dili pa kini andam
Katapusan nga punto:
host: 8080 / panglawas / andam

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

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

Mga sukatan

Naghatag ang mga aplikasyon og metrics para sa operational purposes (aron mamonitor ang performance SLAs) o non-operational purposes (business SLAs). Naghatag ang mga developer sa tingpamulak og mga sukatan gamit ang Spring Boot Actuator ug Micrometer. Sa baylo, gigamit ni Quarkus ang MicroProfile Metrics para maghatag ug baseline metrics (JVM ug operating system), vendor metrics (Quarkus), ug application metrics. Ang MicroProfile Metrics nagkinahanglan nga ang pagpatuman nagsuporta sa JSON ug OpenMetrics (Prometheus) nga mga format sa output. Ang mga pananglitan sa paggamit sa MicroProfile Metrics API gihatag sa Table 7.

Π’ proyekto gikan sa among ehemplo Ang MicroProfile Metrics gigamit sa paghatag ug mga sukatan sa aplikasyon. Para sa dugang nga impormasyon, tan-awa ang manwal sa Quarkus Giya sa Sukatan.

Talaan 7. Mga pananglitan sa paggamit sa mga MicroProfile Metrics API.

Mga Feature sa MicroProfile Sukatan
paghulagway
mga panig-ingnan

@Giihap

Nagpasabut sa usa ka counter counter nga nag-ihap sa gidaghanon sa mga higayon nga ang usa ka annotated nga butang gitawag

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

@ConcurrentGauge

Nagpasabot sa usa ka gauge nga nag-ihap sa gidaghanon sa mga dungan nga tawag sa usa ka annotated nga butang

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

@Gauge

Nagpasabot sa gauge sensor nga nagsukod sa bili sa usa ka annotated nga butang

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

@Metered

Nagpasabot ug metro sensor nga nagmonitor sa frequency sa tawag sa usa ka annotated nga butang

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

Metric

Usa ka anotasyon nga adunay kasayuran bahin sa metadata kung ang usa ka hangyo madawat nga mosulod o maghimo usa ka sukatan

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

Natapos ang oras

Nagpakita sa usa ka timer nga nagsubay sa gidugayon sa usa ka annotated nga butang

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

Mga Sukatan sa Katapusan nga Punto

Mga sukatan sa aplikasyon localhost:8080/metrics/aplikasyon
Panguna nga mga sukatan localhost:8080/metrics/base
Mga sukatan sa vendor localhost:8080/metrics/vendor
Tanan nga sukatan localhost:8080/metrics

Kliyente sa Pagpahulay sa MicroProfile

Ang mga microservice kasagarang naghatag ug RESTful nga mga endpoint nga nanginahanglan ug katugbang nga mga API sa kliyente aron magamit. Aron magamit ang RESTful nga mga endpoint, kasagarang gigamit sa mga developer sa Spring ang RestTemplate. Ang Quarkus nagtanyag sa MicroProfile Rest Client API aron masulbad kini nga problema, ang mga pananglitan sa paggamit niini gihatag sa Table 8.

Π’ proyekto gikan sa among ehemplo ang paggamit sa RESTful endpoints gihimo gamit ang MicroProfile Rest Client. Dugang nga impormasyon ug mga pananglitan niini nga hilisgutan makita sa manwal sa Quarkus Pahulay nga Giya sa Kliyente.

Talaan 8. Mga pananglitan sa paggamit sa MicroProfile Rest Client APIs.

Mga Feature sa Kliyente sa Pagpahulay sa MicroProfile
paghulagway
mga panig-ingnan

@RegisterRestClient

Nagrehistro sa usa ka gi-type nga Java interface isip usa ka REST nga kliyente

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

@RestClient

Nagtimaan sa pagpatuman sa usa ka pananglitan sa usa ka gi-type nga interface sa kliyente nga REST

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

Pag-ampo

Nagtawag ug REST endpoint

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

mp-pahulay/url

Gipiho ang REST endpoint

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

Mga resulta

Sa kini nga blog, nga gitumong sa panguna sa mga developer sa Spring, among gitan-aw dayon kung giunsa ang paggamit sa mga Spring API sa mga MicroProfile API sa Quarkus aron mapalambo ang mga microservice sa Java ug dayon i-compile kini sa lumad nga binary code nga makatipig gatusan ka megabytes sa RAM ug ilunsad sa. usa ka butang sa milliseconds.

Sama sa imong nasabtan na, dugang nga impormasyon bahin sa suporta alang sa Spring ug MicroProfile APIs, ingon man sa daghang uban pang mapuslanong impormasyon, makita sa Mga manwal sa Quarkus.

Source: www.habr.com

Idugang sa usa ka comment