Si kombinon Quarkus MicroProfile dhe Spring

Përshëndetje të gjithëve, ja postimi i tretë në serialin Quarkus!

Si kombinon Quarkus MicroProfile dhe Spring

Gjatë zhvillimit të mikroshërbimeve Java, shpesh besohet se Mikroprofili i Eklipsit и Çizme pranverore janë API të veçanta dhe të pavarura. Si parazgjedhje, programuesit priren të përdorin API-të me të cilat janë mësuar tashmë, pasi mësimi i kornizave të reja dhe komponentëve të kohës së funksionimit kërkon shumë kohë. Sot do të përpiqemi të thjeshtojmë zhvillimin e disa të njohurve MicroProfile API për zhvilluesit Spring dhe t'ju tregojë se si të përdorni njëkohësisht Spring API dhe veçori të reja të dobishme Kuarkus.

Me pak më shumë detaje, së pari do të shikojmë shtrirjen dhe detajet se si Quarkus mbështet Spring API-të për t'u treguar zhvilluesve Spring se si të përdorin API-në MicroProfile në punën e tyre të përditshme. Më pas do të mbulojmë API-të e MicroProfile, të cilat janë të dobishme për zhvilluesit e Spring kur krijojnë mikroshërbime.

Pse Quarkus? Së pari, ky është kodim i drejtpërdrejtë, domethënë rimbushje automatike e çdo ndryshimi në MicroProfile API, Spring API dhe API të tjera Java, i cili kryhet vetëm me një komandë: mvn quarkus:dev. Së dyti, konsiderohet në në shembullin tonë shërbimi Person (i cili përpilohet nga Spring, MicroProfile dhe API-të JPA në një binar duke përdorur imazhin vendas të GraalVM) fillon në vetëm 0.055 sekonda dhe merr rreth 90 MB RAM (RSS) në pikën përfundimtare të aplikacionit RESTful. Për më tepër, vetë kompilimi i tij kryhet vetëm me një komandë: paketa mvn -Pnative.

Ne nuk do të hyjmë në detaje rreth MicroProfile, përveçse të ndihmojmë zhvilluesit e Spring të kuptojnë se si mund të përdorin Spring API me MicroProfile API në Quarkus.

Kontejnerët dhe Kubernetes

Për ta mbajtur këtë artikull të thjeshtë, ne do të mbulojmë vetëm aspektet e nivelit të lartë të mbështetjes këtu. Kubernetes, sepse është e rëndësishme të kuptohet. Quarkus është pozicionuar si një pirg Java për Kubernetes, është krijuar për të minimizuar konsumin e kujtesës dhe kohën e fillimit të aplikacioneve dhe shërbimeve Java, dhe, si rezultat, të rrisë densitetin e tyre në host dhe të zvogëlojë kostot e përgjithshme.

Kuarkusi gjithashtu mbështet gjenerimin automatik Burimet dhe ofertat e Kubernetes udhëheqja për vendosje në platformat Kubernetes dhe Red Hat OpenShift. Përveç kësaj, Quarkus gjeneron automatikisht skedarët Dockerfile.jvm (paketimi JVM) dhe Dockerfile.native (paketimi binar vendas) të nevojshëm për të krijuar kontejnerë.

Së fundi, duke u fokusuar në Kubernetes si mjedisi i vendosjes së synuar, Quarkus nuk përdor kornizat Java në rastet kur funksionalitet i ngjashëm zbatohet në nivelin e vetë platformës Kubernetes. Tabela 1 ofron një hartë të korrespondencës funksionale midis Kubernetes dhe kornizave tipike Java të përdorura nga zhvilluesit Spring.

Tabela 1. Harta e korrespondencës funksionale ndërmjet kornizave Java dhe Kubernetes.

funksional
Çizme tradicionale pranverore
Kubernetes

Zbulimi i shërbimit
Eureka
DNS

Konfiguracion
Konfigurimi i resë së pranverës
Konfigurimi i Hartave/Sekreteve

Balancimi i ngarkesës
Shiriti (ana e klientit)
Shërbimi, kontrolluesi i përsëritjes (nga ana e serverit)

Përpilimi dhe ekzekutimi i kodit nga shembulli

Në këtë artikull i referohemi shembull projekti, ku API-të Spring dhe MicroProfile dhe madje e njëjta klasë Java përdoren së bashku. Kodi në këtë shembull mund të përpilohet dhe ekzekutohet nga linja e komandës, shikoni skedarin README.md për detaje.

Spring Framework API

Injeksioni i varësisë

Quarkus mbështet një sërë API-të e kontekstit dhe të injektimit të varësisë (CDI). dhe API-të e injektimit të varësisë së pranverës (Spring DI). Nëse jeni duke punuar me MicroProfile, Java EE dhe Xhakarta EE, atëherë ju jeni tashmë shumë të njohur me CDI. Nga ana tjetër, zhvilluesit Spring mund të përdorin Quarkus Extension për Spring DI API për të arritur pajtueshmërinë me Spring DI. Shembuj të përdorimit të API-ve të mbështetura Spring DI janë dhënë në Tabelën 2.

В projekt nga shembulli ynë Përdor si CDI ashtu edhe Injeksionin e Varësisë së Pranverës. Për më shumë informacion dhe shembuj mbi këtë temë, shihni udhëzuesin Quarkus të quajtur Pranvera DI Guide.

Tabela 2. Shembuj të përdorimit të API-ve të mbështetura Spring DI.

Karakteristikat e mbështetura të Spring DI
shembuj

Injeksion konstruktor

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

Injeksion në terren
Me kabllo automatike
vlerë

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bathë
@Konfigurimi

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

Komponent

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

Shërbime

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

   public String getPrefix() {
      return message;
   }
}

Korniza në internet

Përdoruesve të MicroProfile do t'ju pëlqejë që Quarkus mbështet JAX-RS, MicroProfile Rest Client, JSON-P dhe JSON-B si modelin kryesor të programimit në internet. Zhvilluesit e pranverës do të jenë të kënaqur me mbështetjen e fundit të Quarkus për Spring Web API, në veçanti ndërfaqet REST. Ngjashëm me Spring DI, qëllimi kryesor i mbështetjes së Spring Web API është t'u mundësojë zhvilluesve Spring që të përdorin Spring Web API-të në lidhje me API-të MicroProfile. Shembuj të mënyrës se si të përdoren API-të e mbështetura të Spring Web jepen në Tabelën 3, dhe më shumë informacion dhe shembuj mbi këtë temë mund të gjenden në tutorialin e Quarkus të quajtur Udhëzues në ueb pranveror.

Tabela 3. Shembuj të përdorimit të API-ve të mbështetura të Spring Web.

Veçoritë e mbështetura të uebit të pranverës
shembuj

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (i pjesshëm)

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

Pranvera e të dhënave JPA

Përdoruesit e MicroProfile do të vlerësojnë gjithashtu që Quarkus mbështet JPA duke përdorur ORM Hibernate. Ka gjithashtu një lajm të mirë për zhvilluesit e Spring: Quarkus mbështet shënimet dhe llojet e zakonshme të Spring Data JPA. Shembuj të përdorimit të API-ve të mbështetura të Spring Data JPA janë dhënë në Tabelën 4.
В projekt nga shembulli ynë Përdoren API-të e Spring Data JPA dhe më shumë informacion është i disponueshëm në tutorialin Quarkus të quajtur Udhëzuesi JPA i të dhënave të pranverës.

Tabela 4. Shembuj të përdorimit të API-ve të mbështetura të Spring Data JPA.

Karakteristikat e mbështetura të të dhënave të pranverës JPA
shembuj

CrudRepository

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

depo
JpaRepository
Depoja e PagingAndSorting

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragmentet e depove

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

Metodat e nxjerra të pyetjeve

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Pyetjet e përcaktuara nga përdoruesi

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 API

Toleranca ndaj gabimeve

Strukturat e tolerancës ndaj gabimeve janë shumë të rëndësishme për parandalimin e dështimeve në kaskadë dhe krijimin e arkitekturave të besueshme të mikroshërbimeve. Zhvilluesit e pranverës kanë përdorur ndërprerësit për tolerancën e gabimeve për shumë vite. Hystrix. Sidoqoftë, Hystrix nuk është përditësuar për një kohë të gjatë, por Toleranca e Gabimeve të MicroProfile tani po zhvillohet në mënyrë aktive dhe ka disa vite përdorim prodhimi pas saj. Prandaj, për të përmirësuar besueshmërinë e shërbimeve në Quarkus, rekomandohet përdorimi i MicroProfile Fault Tolerance API, shembuj të të cilave përdoren në Tabelën 5. Për më shumë informacion mbi këtë, shihni manualin e Quarkus Udhëzues për tolerancën e gabimeve.

Tabela 5. Shembuj të përdorimit të API-ve të mbështetura të MicroProfile Fault Tolerance.

Karakteristikat e tolerancës së gabimeve të mikroprofilit
Përshkrim
shembuj

@Asinkron

Ekzekutimi i logjikës në një thread të veçantë

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

@Bulkhead

Kufizoni numrin e kërkesave të njëkohshme

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

@CircuitBreaker

Trajtimi i zgjuar i dështimeve dhe rikuperimi nga dështimet

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

@Tërhiqem

Thirrja e logjikës alternative në rast dështimi

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

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

Rigjykoj

Riprovoni dështimin e kërkesës

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

timeout

Koha e kontrollit të dështimit

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

Kontrollimi i shërbimeve (Shëndeti i Shërbimit)

Platformat Kubernetes monitorojnë shëndetin e kontejnerëve duke përdorur shërbime speciale. Për të lejuar platformën themelore të monitorojë shërbimet, zhvilluesit e Spring zakonisht përdorin një HealthIndicator të personalizuar dhe Spring Boot Actuator. Në Quarkus, kjo mund të bëhet duke përdorur MicroProfile Health, i cili si parazgjedhje kryen një kontroll të gjallërisë, por mund të konfigurohet për të kontrolluar njëkohësisht gjallërinë dhe gatishmërinë. Shembuj se si të përdoren API-të e mbështetura MicroProfile Health jepen në Tabelën 6 dhe informacione shtesë jepen në manualin e Quarkus Udhëzues shëndetësor.

Tabela 6: Shembuj përdorimi të API-ve të mbështetura të MicroProfile Health.

Karakteristikat e shëndetit të MicroProfile
Përshkrim
shembuj

@Liveness

Platforma rinis aplikacionet e dështuara të kontejnerizuara
Pika e fundit:
host:8080/shëndet/live

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

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

@Gatishmëri

Platforma nuk do të dërgojë trafik në aplikacionet e kontejnerizuar nëse nuk është gati
Pika e fundit:
host:8080/shëndet/gati

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

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

Metrikë

Aplikacionet ofrojnë matje ose për qëllime operacionale (për të monitoruar SLA-të e performancës) ose për qëllime jo-operative (SLA-të e biznesit). Zhvilluesit e pranverës ofrojnë metrikë duke përdorur Actuator dhe Micrometer Spring Boot. Nga ana tjetër, Quarkus përdor MicroProfile Metrics për të siguruar metrikat bazë (JVM dhe sistemi operativ), metrikat e shitësve (Quarkus) dhe metrikat e aplikacionit. MicroProfile Metrics kërkon që zbatimi të mbështesë formatet e daljes JSON dhe OpenMetrics (Prometheus). Shembuj të përdorimit të MicroProfile Metrics API janë dhënë në Tabelën 7.

В projekt nga shembulli ynë Metrikat e MicroProfile përdoren për të ofruar matjet e aplikacionit. Për më shumë informacion, shihni manualin e Quarkus Udhëzues metrikë.

Tabela 7. Shembuj të përdorimit të API-ve të MicroProfile Metrics.

Karakteristikat e Metrikës së MicroProfile
Përshkrim
shembuj

@Numërohen

Tregon një numërues që numëron sa herë është thirrur një objekt i shënuar

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

@ConcurrentGauge

Tregon një matës që numëron numrin e thirrjeve të njëkohshme në një objekt të shënuar

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

@Matës

Tregon një sensor matës që mat vlerën e një objekti të shënuar

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

@Metered

Tregon një sensor njehsor që monitoron frekuencën e thirrjes së një objekti të shënuar

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

Metrik

Një shënim që përmban informacion rreth meta të dhënave kur merret një kërkesë për të futur ose prodhuar një metrikë

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

në kohën e duhur

Tregon një kohëmatës që gjurmon kohëzgjatjen e një objekti të shënuar

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

Pikat e fundit të Metrikës

Metrikat e aplikimit localhost:8080/metrika/aplikacion
Metrikat bazë localhost:8080/metrika/bazë
Metrikat e shitësit localhost:8080/metrika/shitësi
Të gjitha metrikat localhost:8080/metrika

Klienti i pushimit të MicroProfile

Mikroshërbimet shpesh ofrojnë pika përfundimtare RESTful që kërkojnë API-të përkatëse të klientit për të punuar me të. Për të përdorur pikat fundore RESTful, zhvilluesit e Spring zakonisht përdorin RestTemplate. Quarkus ofron MicroProfile Rest Client API për të zgjidhur këtë problem, shembuj të përdorimit të të cilave janë dhënë në Tabelën 8.

В projekt nga shembulli ynë përdorimi i pikave fundore RESTful bëhet duke përdorur MicroProfile Rest Client. Më shumë informacion dhe shembuj mbi këtë temë mund të gjenden në manualin Quarkus Udhëzues për klientin e pushimit.

Tabela 8. Shembuj të përdorimit të MicroProfile Rest Client API.

Karakteristikat e klientit të pushimit të mikroprofilit
Përshkrim
shembuj

@RegisterRestClient

Regjistron një ndërfaqe Java të shtypur si klient REST

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

@RestClient

Shënon zbatimin e një shembulli të një ndërfaqeje klienti të shtypur REST

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

thirrje e muzës

Thërret një pikë fundore REST

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

mp-rest/url

Përcakton pikën përfundimtare REST

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

Rezultatet e

Në këtë blog, që synon kryesisht zhvilluesit Spring, ne hodhëm një vështrim të shpejtë se si të përdorim API-të Spring me API-të MicroProfile në Quarkus për të zhvilluar mikroshërbime Java dhe më pas për t'i përpiluar ato në kodin binar vendas që kursen qindra megabajt RAM dhe nis në çështje milisekondash.

Siç e keni kuptuar tashmë, më shumë informacion rreth mbështetjes për API-të Spring dhe MicroProfile, si dhe shumë informacione të tjera të dobishme, mund të gjenden në Manualet e Quarkus.

Burimi: www.habr.com

Shto një koment