Ki jan Quarkus konbine MicroProfile ak Spring

Bonjou tout moun, men twazyèm pòs nan seri Quarkus la!

Ki jan Quarkus konbine MicroProfile ak Spring

Lè w ap devlope mikwosèvis Java, yo souvan kwè sa Eclipse mikrofil и Spring bòt se API separe ak endepandan. Pa default, pwogramasyon yo gen tandans sèvi ak API yo deja itilize yo, depi aprann nouvo kad ak konpozan ègzekutabl pran anpil tan. Jodi a nou pral eseye senplifye devlopman nan kèk popilè MicroProfile API pou devlopè Spring epi montre w kouman pou w itilize API Spring ak nouvo karakteristik itil ansanm Karkus.

Nan yon ti kras plis detay, nou pral premye gade nan sijè ki abòde lan ak detay sou fason Quarkus sipòte Spring API yo montre devlopè Spring yo kijan pou yo itilize API MicroProfile nan travay chak jou yo. Lè sa a, nou pral kouvri API MicroProfile yo, ki itil pou devlopè Spring lè yo kreye mikwosèvis.

Poukisa Quarkus? Premyèman, sa a se kodaj ap viv, se sa ki, rechaje otomatik nenpòt chanjman ki fèt nan API MicroProfile, Spring API ak lòt API Java, ki fèt ak yon sèl kòmand: mvn quarkus:dev. Dezyèmman, diskite nan nan egzanp nou an sèvis la Moun (ki konpile soti nan Spring, MicroProfile, ak JPA APIs nan yon binè lè l sèvi avèk imaj natif natal GraalVM) kòmanse nan jis 0.055 segonn epi li pran apeprè 90 MB nan RAM (RSS) sou pwen final aplikasyon RESTful la. Anplis, konpilasyon li an tèt li fèt ak yon sèl kòmand: mvn package -Pnative.

Nou p ap antre nan detay sou MicroProfile, lòt pase pou ede devlopè Spring yo konprann kijan yo ka itilize API Spring ak API MicroProfile nan Quarkus.

Kontenè ak Kubernetes

Pou kenbe atik sa a senp, nou pral sèlman kouvri aspè wo nivo sipò isit la. Kubernetes, paske li enpòtan pou konprann. Quarkus pozisyone kòm yon pile Java pou Kubernetes, li fèt pou minimize konsomasyon memwa ak tan demaraj aplikasyon ak sèvis Java, epi, kòm yon rezilta, ogmante dansite yo sou lame a epi redwi depans jeneral yo.

Quarkus tou sipòte jenerasyon oto Resous Kubernetes ak òf lidèchip pou deplwaman sou platfòm Kubernetes ak Red Hat OpenShift. Anplis de sa, Quarkus otomatikman jenere Dockerfile.jvm (anbalaj JVM) ak Dockerfile.native (anbalaj binè natif natal) ki nesesè pou kreye resipyan.

Finalman, lè li konsantre sou Kubernetes kòm anviwònman deplwaman sib, Quarkus pa sèvi ak kad Java nan ka kote fonksyonalite menm jan an aplike nan nivo platfòm Kubernetes li menm. Tablo 1 bay yon kat jeyografik korespondans fonksyonèl ant Kubernetes ak kad Java tipik yo itilize pa devlopè Spring yo.

Tablo 1. Kat korespondans fonksyonèl ant kad Java ak Kubernetes.

Fonksyonèl
Bòt prentan tradisyonèl yo
Kubernetes

Dekouvèt sèvis
Eureka
dns

nou konte ofri sèvis
Spring Cloud Config
Config Maps/Sekrè

Balans chaj
Riban (bò kliyan)
Sèvis, Kontwolè Replikasyon (bò sèvè)

Konpile ak kouri kòd ki soti nan egzanp lan

Nan atik sa a nou refere a egzanp pwojè, kote Spring ak MicroProfile API yo e menm menm klas Java yo itilize ansanm. Kòd ki nan egzanp sa a ka konpile epi kouri soti nan liy lòd la, gade nan dosye README.md pou plis detay.

Spring Framework APIs

Piki Depandans

Quarkus sipòte yon seri de Kontèks ak Enjeksyon Depandans (CDI) APIs ak Spring Dependency Injection (Spring DI) APIs. Si w ap travay ak MicroProfile, Java EE ak Jakarta EE, Lè sa a, ou deja trè abitye ak CDI. Nan lòt men an, devlopè Spring ka itilize Quarkus Extension pou Spring DI API pou reyalize konpatibilite ak Spring DI. Egzanp sou itilizasyon Spring DI API yo bay yo nan Tablo 2.

В pwojè nan egzanp nou an Itilize tou de CDI ak Spring Dependency Injection. Pou plis enfòmasyon ak egzanp sou sijè sa a, gade gid Quarkus yo rele Prentan DI Gid.

Tablo 2. Egzanp yo itilize Spring DI API yo.

Sipòte Spring DI Karakteristik
egzanp

Konstriksyon piki

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

Piki jaden
Autowired
Valè

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Konfigurasyon

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

Lapòs

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

   public String getPrefix() {
      return message;
   }
}

Web kad

Itilizatè MicroProfile pral renmen ke Quarkus sipòte JAX-RS, MicroProfile Rest Client, JSON-P, ak JSON-B kòm modèl prensipal pwogramasyon entènèt. Devlopè Spring yo pral kontan ak dènye sipò Quarkus pou Spring Web API, an patikilye koòdone REST. Menm jan ak Spring DI, objektif prensipal sipò Spring Web API se pou pèmèt devlopè Spring yo sèvi ak Spring Web API ansanm ak API MicroProfile. Egzanp sou fason pou itilize Spring Web API yo bay yo nan Tablo 3, epi yo ka jwenn plis enfòmasyon ak egzanp sou sijè sa a nan leson patikilye Quarkus ki rele. Gid Entènèt Prentan.

Tablo 3. Egzanp yo itilize Spring Web API yo.

Sipòte karakteristik entènèt Spring
egzanp

@RestController
@RequestMapping

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

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

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

Spring DataJPA

Itilizatè MicroProfile yo pral apresye tou ke Quarkus sipòte JPA lè l sèvi avèk Hibernate ORM la. Genyen tou yon bon nouvèl pou devlopè Spring: Quarkus sipòte komen Spring Data JPA anotasyon ak kalite. Egzanp yo sèvi ak API Spring Data JPA yo bay nan Tablo 4.
В pwojè nan egzanp nou an Spring Data JPA API yo itilize epi gen plis enfòmasyon ki disponib nan leson patikilye Quarkus yo rele Prentan done JPA Gid.

Tablo 4. Egzanp yo sèvi ak Spring Data JPA API yo.

Sipòte Spring Data JPA Features
egzanp

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragman depo

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

Metòd rechèch ki sòti

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Rekèt yo defini itilizatè yo

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

Fòt tolerans

Konstriksyon tolerans fay yo trè enpòtan pou anpeche echèk kaskad ak kreye achitekti mikwosèvis serye. Devlopè prentan yo te itilize disjoncteurs pou tolerans fòt pou anpil ane. Hystrix. Sepandan, Hystrix pa te mete ajou pou yon tan long, men Tolerans Fòt MicroProfile a kounye a ap devlope aktivman e li gen plizyè ane nan itilizasyon pwodiksyon dèyè li. Se poutèt sa, pou amelyore fyab nan sèvis nan Quarkus, li rekòmande pou itilize MicroProfile Fault Tolerance API yo, egzanp yo itilize nan Tablo 5. Pou plis enfòmasyon sou sa, gade manyèl Quarkus. Gid tolerans fay.

Tablo 5. Egzanp sou itilizasyon API MicroProfile Fault Tolerance ki sipòte yo.

MicroProfile Fault Tolerance Features
Deskripsyon
egzanp

@Asynchrone

Egzekite lojik nan yon fil separe

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

@Bulkhead

Limite kantite demann similtane

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

@CircuitBreaker

Manyen echèk entelijan ak rekiperasyon nan echèk

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

@Fallback

Rele lojik altènatif nan ka ta gen echèk

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

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

Repete

Reesye sou demann echèk

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

Timeout

Delè kontwòl echèk

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

Tcheke sèvis (Service Health)

Platfòm Kubernetes kontwole sante veso yo lè l sèvi avèk sèvis espesyal. Pou pèmèt platfòm ki kache a kontwole sèvis yo, devlopè Spring yo anjeneral itilize yon HealthIndicator koutim ak Spring Boot Actuator. Nan Quarkus, sa ka fèt lè l sèvi avèk MicroProfile Health, ki pa default fè yon chèk liveness, men yo ka konfigirasyon an menm tan tcheke liveness ak preparasyon pou. Men kèk egzanp sou fason pou itilize API MicroProfile Health ki sipòte yo nan Tablo 6, epi yo bay plis enfòmasyon nan manyèl Quarkus. Gid Sante.

Tablo 6: Egzanp itilizasyon API MicroProfile Health ki sipòte yo.

Karakteristik MicroProfile Health
Deskripsyon
egzanp

@Viv

Redemaraj platfòm la echwe aplikasyon nan veso yo
Pwen final:
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();  
}

@Preparasyon

Platfòm lan p ap voye trafik nan aplikasyon pou kontenè si li pa pare
Pwen final:
lame:8080/sante/pare

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

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

Metrik

Aplikasyon yo bay metrik swa pou rezon operasyonèl (pou kontwole pèfòmans SLA) oswa rezon ki pa operasyonèl (SLA biznis). Devlopè Spring bay mezi lè l sèvi avèk Spring Boot Actuator ak Mikwomèt. Nan vire, Quarkus itilize MicroProfile Metrics pou bay paramèt debaz (JVM ak sistèm opere), paramèt vandè (Quarkus), ak paramèt aplikasyon. MicroProfile Metrics mande pou aplikasyon an sipòte fòma pwodiksyon JSON ak OpenMetrics (Prometheus). Egzanp yo sèvi ak MicroProfile Metrics API yo bay nan Tablo 7.

В pwojè nan egzanp nou an MicroProfile Metrics yo itilize pou bay mezi aplikasyon an. Pou plis enfòmasyon, gade manyèl Quarkus la Gid metrik.

Tablo 7. Egzanp yo sèvi ak MicroProfile Metrics API.

Karakteristik MicroProfile Metrics
Deskripsyon
egzanp

@Konte

Vle di yon kontwa ki konte kantite fwa yo te rele yon objè anote

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

@ConcurrentGauge

Li vle di yon kalib ki konte kantite apèl konkouran pou yon objè anote

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

@Kalib

Vle yon detèktè kalib ki mezire valè yon objè anote

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

@Metered

Vle di yon detèktè mèt ki kontwole frekans apèl yon objè anote

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

Metrik

Yon anotasyon ki gen enfòmasyon sou metadata lè yo resevwa yon demann pou antre oswa pwodui yon metrik

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

Kwonometre

Endike yon revèy ki swiv dire a nan yon objè anote

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

Metrik pwen final yo

Paramèt aplikasyon yo lokalost:8080/metrik/aplikasyon
Paramèt debaz yo lokalost:8080/metrik/baz
Paramèt vandè yo lokalost:8080/metrik/machann
Tout mezi lokalost:8080/metrik

MicroProfile Rest Kliyan

Mikwosèvis yo souvan bay pwen final RESTful ki mande API kliyan korespondan pou travay avèk yo. Pou itilize pwen final RESTful, devlopè Spring anjeneral itilize RestTemplate. Quarkus ofri MicroProfile Rest Client API pou rezoud pwoblèm sa a, yo bay egzanp sou itilizasyon yo nan Tablo 8.

В pwojè nan egzanp nou an se sèvi ak pwen final RESTful lè l sèvi avèk MicroProfile Rest Client. Ou ka jwenn plis enfòmasyon ak egzanp sou sijè sa a nan manyèl Quarkus la Repoze Kliyan Gid.

Tablo 8. Egzanp yo sèvi ak API MicroProfile Rest Client.

Karakteristik MicroProfile Rest Kliyan
Deskripsyon
egzanp

@RegisterRestClient

Anrejistre yon koòdone Java tape kòm yon kliyan REST

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

@RestClient

Make aplikasyon an nan yon egzanp nan yon koòdone kliyan REST tape

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

Envokasyon

Rele yon pwen final REST

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

mp-rès/url

Espesifye pwen final REST la

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

Rezilta

Nan blog sa a, ki vize prensipalman devlopè Spring, nou te pran yon gade rapid sou fason pou itilize API Spring ak API MicroProfile nan Quarkus pou devlope mikwosèvis Java epi konpile yo nan kòd binè natif natal ki sove plizyè santèn megabyte RAM epi lanse nan yon kesyon de milisgond.

Kòm ou te deja konprann, ou ka jwenn plis enfòmasyon sou sipò pou API Spring ak MicroProfile, ansanm ak anpil lòt enfòmasyon itil, nan Manyèl Quarkus.

Sous: www.habr.com

Add nouvo kòmantè