Paano pinagsasama ng Quarkus ang MicroProfile at Spring

Kumusta sa lahat, narito ang ikatlong post sa serye ng Quarkus!

Paano pinagsasama ng Quarkus ang MicroProfile at Spring

Kapag bumubuo ng mga microservice ng Java, madalas itong pinaniniwalaan Eclipse MicroProfile ΠΈ Spring boot ay hiwalay at independiyenteng mga API. Bilang default, kadalasang ginagamit ng mga programmer ang mga API na nakasanayan na nila, dahil nangangailangan ng maraming oras ang pag-aaral ng mga bagong framework at runtime component. Ngayon ay susubukan naming gawing simple ang pag-unlad ng ilang sikat MicroProfile API para sa mga developer ng Spring at ipakita sa iyo kung paano gamitin nang sabay-sabay ang Spring API at mga bagong kapaki-pakinabang na feature quarkus.

Sa kaunting detalye, titingnan muna natin ang saklaw at mga detalye kung paano sinusuportahan ng Quarkus ang mga Spring API upang ipakita sa mga developer ng Spring kung paano gamitin ang MicroProfile API sa kanilang pang-araw-araw na gawain. Pagkatapos ay tatalakayin namin ang mga MicroProfile API, na kapaki-pakinabang para sa mga developer ng Spring kapag gumagawa ng mga microservice.

Bakit Quarkus? Una, ito ay live na coding, ibig sabihin, awtomatikong pag-reload ng anumang mga pagbabago sa MicroProfile API, Spring API at iba pang mga Java API, na ginagawa sa isang command lang: mvn quarkus:dev. Pangalawa, isinasaalang-alang sa sa ating halimbawa ang serbisyo ng Tao (na nag-compile mula sa Spring, MicroProfile, at JPA APIs sa isang binary gamit ang native na GraalVM image) ay magsisimula sa loob lamang ng 0.055 segundo at tumatagal ng humigit-kumulang 90 MB ng RAM (RSS) sa RESTful application endpoint. Bukod dito, ang compilation nito mismo ay ginagawa gamit ang isang command: mvn package -Pnative.

Hindi na kami magdedetalye tungkol sa MicroProfile, maliban sa tulungan ang mga developer ng Spring na maunawaan kung paano nila magagamit ang mga Spring API na may mga MicroProfile API sa Quarkus.

Mga lalagyan at Kubernete

Upang panatilihing simple ang artikulong ito, sasaklawin lang namin ang mga mataas na antas ng aspeto ng suporta dito. Kubernetes, dahil mahalagang maunawaan. Ang Quarkus ay nakaposisyon bilang isang Java stack para sa Kubernetes, ito ay idinisenyo upang mabawasan ang pagkonsumo ng memorya at oras ng pagsisimula ng mga aplikasyon at serbisyo ng Java, at, bilang resulta, pataasin ang kanilang density sa host at bawasan ang kabuuang gastos.

Quarkus din sumusuporta sa auto generation Mga mapagkukunan at alok ng Kubernetes mga gabay para sa pag-deploy sa mga platform ng Kubernetes at Red Hat OpenShift. Bilang karagdagan, awtomatikong bumubuo ang Quarkus ng Dockerfile.jvm (JVM packaging) at Dockerfile.native (native binary packaging) na mga file na kailangan para gumawa ng mga container.

Sa wakas, sa pamamagitan ng pagtutok sa Kubernetes bilang target na deployment environment, hindi gumagamit ang Quarkus ng mga Java framework sa mga kaso kung saan ipinatupad ang katulad na functionality sa antas ng Kubernetes platform mismo. Ang Talahanayan 1 ay nagbibigay ng mapa ng functional na sulat sa pagitan ng Kubernetes at mga karaniwang Java framework na ginagamit ng mga developer ng Spring.

Talahanayan 1. Mapa ng functional correspondence sa pagitan ng Java frameworks at Kubernetes.

Gumagana
Tradisyonal na Spring Boot
Kubernetes

Pagtuklas ng serbisyo
Eureka
DNS

Configuration
Spring Cloud Config
I-configure ang Mga Mapa/Sikreto

Mag-load balancing
Ribbon (panig ng kliyente)
Serbisyo, Replication Controller (server side)

Pag-compile at pagpapatakbo ng code mula sa halimbawa

Sa artikulong ito ay tinutukoy namin halimbawa ng proyekto, kung saan ang Spring at MicroProfile API at maging ang parehong klase ng Java ay ginagamit nang magkasama. Ang code sa halimbawang ito ay maaaring i-compile at patakbuhin mula sa command line, tingnan ang README.md file para sa mga detalye.

Mga Spring Framework API

Depensyon ng Iniksyon

Sinusuportahan ng Quarkus ang isang hanay ng Mga Context at Dependency Injection (CDI) API at mga Spring Dependency Injection (Spring DI) API. Kung nagtatrabaho ka sa MicroProfile, Java EE at Jakarta EE, pagkatapos ay pamilyar na pamilyar ka sa CDI. Sa kabilang banda, maaaring gamitin ng mga developer ng Spring ang Quarkus Extension para sa Spring DI API upang makamit ang pagiging tugma sa Spring DI. Ang mga halimbawa ng paggamit ng mga sinusuportahang Spring DI API ay ibinibigay sa Talahanayan 2.

Π’ proyekto mula sa aming halimbawa Gumagamit ng parehong CDI at Spring Dependency Injection. Para sa karagdagang impormasyon at mga halimbawa sa paksang ito, tingnan ang tinatawag na gabay ng Quarkus Gabay sa Spring DI.

Talahanayan 2. Mga halimbawa ng paggamit ng mga sinusuportahang Spring DI API.

Mga Sinusuportahang Feature ng Spring DI
Mga halimbawa

Constructor Injection

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

Field Injection
Autowired
halaga

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Sitaw
@Configuration

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

bahagi

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

serbisyo

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

   public String getPrefix() {
      return message;
   }
}

Framework sa web

Magugustuhan ng mga user ng MicroProfile na sinusuportahan ng Quarkus ang JAX-RS, MicroProfile Rest Client, JSON-P, at JSON-B bilang pangunahing modelo ng web programming. Ang mga developer ng tagsibol ay nalulugod sa kamakailang suporta ng Quarkus para sa Spring Web API, sa partikular na mga interface ng REST. Katulad ng Spring DI, ang pangunahing layunin ng suporta sa Spring Web API ay paganahin ang mga developer ng Spring na gumamit ng mga Spring Web API kasabay ng mga MicroProfile API. Ang mga halimbawa ng kung paano gamitin ang mga sinusuportahang Spring Web API ay ibinibigay sa Talahanayan 3, at higit pang impormasyon at mga halimbawa sa paksang ito ay makikita sa Quarkus tutorial na tinatawag na Spring Web Guide.

Talahanayan 3. Mga halimbawa ng paggamit ng mga sinusuportahang Spring Web API.

Mga sinusuportahang Spring Web Features
Mga halimbawa

@RestController
@RequestMapping

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

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

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

Spring DataJPA

Mapapahalagahan din ng mga user ng MicroProfile na sinusuportahan ng Quarkus ang JPA gamit ang Hibernate ORM. Mayroon ding magandang balita para sa mga developer ng Spring: Sinusuportahan ng Quarkus ang mga karaniwang anotasyon at uri ng Spring Data JPA. Ang mga halimbawa ng paggamit ng mga sinusuportahang Spring Data JPA API ay ibinibigay sa Talahanayan 4.
Π’ proyekto mula sa aming halimbawa Ang Spring Data JPA API ay ginagamit at higit pang impormasyon ang available sa Quarkus tutorial na tinatawag Gabay sa JPA ng Spring Data.

Talahanayan 4. Mga halimbawa ng paggamit ng mga sinusuportahang Spring Data JPA API.

Mga Sinusuportahang Feature ng Spring Data JPA
Mga halimbawa

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 ng Imbakan

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

Nagmula sa mga pamamaraan ng query

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Mga query na tinukoy ng 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

Pagpapahintulot sa kasalanan

Napakahalaga ng mga fault tolerance construct para maiwasan ang mga cascading failure at paglikha ng maaasahang mga arkitektura ng microservice. Ang mga developer ng tagsibol ay gumagamit ng mga circuit-breaker para sa fault tolerance sa loob ng maraming taon. Hystrix. Gayunpaman, ang Hystrix ay hindi na-update sa loob ng mahabang panahon, ngunit ang Fault Tolerance ng MicroProfile ay aktibong umuunlad at may ilang taon ng paggamit sa produksyon sa likod nito. Samakatuwid, upang mapabuti ang pagiging maaasahan ng mga serbisyo sa Quarkus, inirerekomendang gamitin ang MicroProfile Fault Tolerance API, ang mga halimbawa nito ay ginagamit sa Talahanayan 5. Para sa higit pang impormasyon tungkol dito, tingnan ang manwal ng Quarkus Gabay sa Fault Tolerance.

Talahanayan 5. Mga halimbawa ng paggamit ng mga sinusuportahang MicroProfile Fault Tolerance API.

Mga Feature ng MicroProfile Fault Tolerance
ОписаниС
Mga halimbawa

@Asynchronous

Pagpapatupad ng lohika sa isang hiwalay na thread

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

@Bulkhead

Limitahan ang bilang ng mga sabay-sabay na kahilingan

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

@CircuitBreaker

Smart failure handling at pagbawi mula sa mga pagkabigo

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

@Umurong

Pagtawag ng alternatibong lohika kung sakaling mabigo

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

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

Subukang muli

Subukan muli kapag nabigo ang kahilingan

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

Timeout

Pag-timeout ng mabigong kontrol

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

Pagsusuri ng mga serbisyo (Service Health)

Sinusubaybayan ng mga platform ng Kubernetes ang kalusugan ng mga container gamit ang mga espesyal na serbisyo. Upang payagan ang pinagbabatayan na platform na subaybayan ang mga serbisyo, karaniwang gumagamit ang mga developer ng Spring ng isang custom na HealthIndicator at Spring Boot Actuator. Sa Quarkus, maaari itong gawin gamit ang MicroProfile Health, na bilang default ay nagsasagawa ng liveness check, ngunit maaaring i-configure upang sabay na suriin ang liveness at kahandaan. Ang mga halimbawa ng kung paano gamitin ang mga sinusuportahang MicroProfile Health API ay ibinibigay sa Talahanayan 6, at ang karagdagang impormasyon ay ibinibigay sa manwal ng Quarkus Patnubay sa Kalusugan.

Talahanayan 6: Mga halimbawa ng paggamit ng mga sinusuportahang MicroProfile Health API.

Mga tampok ng MicroProfile Health
ОписаниС
Mga halimbawa

@Liveness

Nabigo ang pag-reboot ng platform sa mga containerized na application
Endpoint:
host:8080/kalusugan/live

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

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

@Kahandaan

Ang platform ay hindi magpapadala ng trapiko sa mga containerized na application kung hindi pa ito handa
Endpoint:
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();  
}

Mga sukatan

Nagbibigay ang mga application ng mga sukatan para sa alinman sa mga layunin ng pagpapatakbo (upang subaybayan ang mga SLA ng pagganap) o mga layuning hindi pagpapatakbo (mga SLA ng negosyo). Nagbibigay ang mga developer ng spring ng mga sukatan gamit ang Spring Boot Actuator at Micrometer. Sa turn, gumagamit ang Quarkus ng MicroProfile Metrics para magbigay ng mga baseline metrics (JVM at operating system), vendor metrics (Quarkus), at application metrics. Kinakailangan ng MicroProfile Metrics na sinusuportahan ng pagpapatupad ang mga format ng output ng JSON at OpenMetrics (Prometheus). Ang mga halimbawa ng paggamit ng MicroProfile Metrics API ay ibinibigay sa Talahanayan 7.

Π’ proyekto mula sa aming halimbawa Ginagamit ang MicroProfile metrics para magbigay ng mga sukatan ng application. Para sa karagdagang impormasyon, tingnan ang manwal ng Quarkus Gabay sa Sukat.

Talahanayan 7. Mga halimbawa ng paggamit ng mga MicroProfile Metrics API.

Mga Tampok ng MicroProfile Sukatan
ОписаниС
Mga halimbawa

@Bilang

Nagsasaad ng counter counter na nagbibilang ng bilang ng beses na tinawag ang isang annotated na bagay

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

@ConcurrentGauge

Nagsasaad ng gauge na nagbibilang ng bilang ng mga sabay-sabay na tawag sa isang annotated na bagay

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

@Panukat

Nagsasaad ng gauge sensor na sumusukat sa halaga ng isang annotated na bagay

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

@Metered

Nagsasaad ng meter sensor na sumusubaybay sa dalas ng tawag ng isang naka-annotate na bagay

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

metric

Isang anotasyon na naglalaman ng impormasyon tungkol sa metadata kapag natanggap ang isang kahilingan na magpasok o gumawa ng sukatan

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

Nag-time

Nagsasaad ng timer na sumusubaybay sa tagal ng isang annotated na bagay

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

Mga Endpoint ng Sukat

Mga sukatan ng aplikasyon localhost:8080/metrics/application
Mga pangunahing sukatan localhost:8080/metrics/base
Mga sukatan ng vendor localhost:8080/metrics/vendor
Lahat ng sukatan localhost:8080/sukat

MicroProfile Rest Client

Ang mga microservice ay madalas na nagbibigay ng mga RESTful na endpoint na nangangailangan ng kaukulang mga API ng kliyente upang gumana. Upang gumamit ng mga RESTful na endpoint, karaniwang ginagamit ng mga developer ng Spring ang RestTemplate. Nag-aalok ang Quarkus ng mga MicroProfile Rest Client API upang malutas ang problemang ito, ang mga halimbawa ng paggamit nito ay ibinigay sa Talahanayan 8.

Π’ proyekto mula sa aming halimbawa ang paggamit ng mga RESTful na endpoint ay ginagawa gamit ang MicroProfile Rest Client. Higit pang impormasyon at mga halimbawa sa paksang ito ay matatagpuan sa manwal ng Quarkus Pahinga Client Guide.

Talahanayan 8. Mga halimbawa ng paggamit ng mga MicroProfile Rest Client API.

Mga Tampok ng MicroProfile Rest Client
ОписаниС
Mga halimbawa

@RegisterRestClient

Nagrerehistro ng naka-type na Java interface bilang isang REST client

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

@RestClient

Minamarkahan ang pagpapatupad ng isang instance ng isang na-type na REST client interface

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

Pagsamba

Tumatawag ng REST endpoint

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

mp-pahinga/url

Tinutukoy ang REST endpoint

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

Mga resulta ng

Sa blog na ito, na pangunahing nakatuon sa mga developer ng Spring, mabilis naming tiningnan kung paano gamitin ang mga Spring API kasama ang mga MicroProfile API sa Quarkus upang bumuo ng mga microservice ng Java at pagkatapos ay i-compile ang mga ito sa katutubong binary code na nakakatipid ng daan-daang megabytes ng RAM at inilulunsad sa isang bagay ng milliseconds.

Tulad ng naintindihan mo na, higit pang impormasyon tungkol sa suporta para sa Spring at MicroProfile API, pati na rin ang maraming iba pang kapaki-pakinabang na impormasyon, ay matatagpuan sa Mga manwal ng Quarkus.

Pinagmulan: www.habr.com

Magdagdag ng komento