Quarkus çawa MicroProfile û Spring hev dike

Silav her kes, li vir posta sêyemîn di rêzenivîsa Quarkus de ye!

Quarkus çawa MicroProfile û Spring hev dike

Dema ku mîkroxizmetên Java pêşve dibin, pir caran tê bawer kirin ku Eclipse MicroProfile и Bihara biharê API-yên cuda û serbixwe ne. Ji hêla xwerû, bernamenûs meyla dikin ku API-yên ku berê bikar tînin bikar bînin, ji ber ku fêrbûna çarçoveyên nû û hêmanên dema xebitandinê gelek dem digire. Îro em ê hewl bidin ku pêşveçûna hin populer hêsan bikin MicroProfile API ji bo pêşdebiran Spring û nîşanî we bide ka meriv çawa bi hevdemî Spring API û taybetmendiyên nû yên kêrhatî bikar tîne quarkus.

Bi hûrgulî hûrgulî, em ê pêşî li çarçove û hûrguliyan binihêrin ka Quarkus çawa piştgirî dide Spring API-yên ku ji pêşdebirên Spring re nîşan bide ka meriv çawa API-ya MicroProfile di xebata xwe ya rojane de bikar tîne. Dûv re em ê API-yên MicroProfile, yên ku ji bo pêşdebirên Spring-ê dema çêkirina mîkroservisan bikêr in veşêrin.

Çima Quarkus? Ya yekem, ev kodkirina zindî ye, ango barkirina otomatîkî ya her guhertinên di MicroProfile API, Spring API û API-yên din ên Java de, ku tenê bi yek fermanê tête kirin: mvn quarkus:dev. Ya duyemîn, di nav de gotûbêj kirin di mînaka me de karûbarê Kesê (ku ji Spring, MicroProfile, û JPA API-yê bi karanîna wêneya xwemalî ya GraalVM-ê di binaryekê de berhev dike) tenê di 0.055 çirkeyan de dest pê dike û li ser xala dawiya serîlêdana RESTful bi qasî 90 MB RAM (RSS) digire. Wekî din, berhevkirina wê bixwe tenê bi yek fermanê tête kirin: pakêta mvn -Pnative.

Em ê di derbarê MicroProfile de hûrgulî neçin, ji xeynî ku em ji pêşdebirên Spring re bibin alîkar ku fêm bikin ka ew çawa dikarin API-ên Spring bi API-yên MicroProfile li Quarkus-ê bikar bînin.

Konteynirên û Kubernetes

Ji bo ku em vê gotarê sade bimînin, em ê tenê li vir aliyên piştevaniya asta bilind veşêrin. Kubernetes, ji ber ku girîng e ku fêm bikin. Quarkus ji bo Kubernetes wekî stackek Java-yê tête cîh kirin, ew ji bo kêmkirina xerckirina bîranînê û dema destpêkirina serîlêdan û karûbarên Java-yê hatî çêkirin, û, wekî encamek, tîrêjiya wan li ser mêvandar zêde bike û lêçûnên giştî kêm bike.

Quarkus jî hilberîna otomatîkê piştgirî dike Çavkanî û pêşniyarên Kubernetes rêber ji bo bicîhkirina li ser platformên Kubernetes û Red Hat OpenShift. Wekî din, Quarkus bixweber pelên Dockerfile.jvm (pakêta JVM) û Dockerfile.native (pambalaja binary xwemalî) ku ji bo afirandina konteynir hewce ne diafirîne.

Di dawiyê de, bi balkişandina li ser Kubernetes wekî hawîrdora bicîhkirina armancê, Quarkus di rewşên ku fonksiyonên wekhev di asta platforma Kubernetes bixwe de têne bicîh kirin de çarçoveyên Java-yê bikar nayîne. Tablo 1 nexşeyek pêwendiya fonksiyonel a di navbera Kubernetes û çarçoveyên Java yên tîpîk ên ku ji hêla pêşdebirên Spring ve têne bikar anîn peyda dike.

Tablo 1. Nexşeya pêwendiya fonksiyonel a di navbera çarçoveyên Java û Kubernetes de.

Çalakiyê
Traditional Spring Boot
Kubernetes

Vedîtina xizmetê
Eureka
DNS

configuration
Bihara Cloud Config
Veavakirina Nexşeyên / Veşartî

Loading balansa
Ribbon (aliyê xerîdar)
Karûbar, Kontrolkerê Repplication (aliyê serverê)

Berhevkirin û xebitandina kodê ji nimûneyê

Di vê gotarê de em behsa projeya nimûne, ku API-yên Spring û MicroProfile û tewra heman çîna Java bi hev re têne bikar anîn. Koda di vê nimûneyê de dikare ji rêzika fermanê were berhev kirin û bimeşîne, ji bo hûrguliyan li pelê README.md binêre.

API-yên Çarçoveya Biharê

Injection Dependency

Quarkus rêzek piştgirî dike API-yên Têkilî û Girêdanê (CDI). û API-yên Biharê Dependency Injection (Spring DI). Heke hûn bi MicroProfile re dixebitin, Java EE û Jakarta EE, wê hingê hûn jixwe bi CDI re pir nas in. Ji hêla din ve, pêşdebirên Spring dikarin ji bo Spring DI API-ê Quarkus Extension bikar bînin da ku bi Spring DI-ê re hevahengiyê bi dest bixin. Mînakên karanîna Spring DI API-yên piştgirî di Tablo 2 de têne dayîn.

В proje ji mînaka me Hem CDI û hem jî Derziya Girêdana Biharê bikar tîne. Ji bo bêtir agahdarî û nimûneyên li ser vê mijarê, li rêberê Quarkusê ya bi navê binêrin Bihar DI Guide.

Tablo 2. Nimûneyên karanîna Spring DI API-yên piştgirîkirî.

Taybetmendiyên Spring DI piştgirî kirin
wergerandî

Constructor Injection

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

Field Injection
Autowired
Giranî

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Fasûlî
@ Veavakirina

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

Perçe

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

Xizmetkar

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

   public String getPrefix() {
      return message;
   }
}

çarçoveya Webê

Bikarhênerên MicroProfile dê hez bikin ku Quarkus wekî modela bernameya webê ya bingehîn JAX-RS, MicroProfile Rest Client, JSON-P, û JSON-B piştgirî dike. Pêşdebirên biharê dê ji piştgirîya dawî ya Quarkus ji bo Spring Web API, bi taybetî pêwendiyên REST, kêfxweş bibin. Mîna Spring DI, armanca sereke ya piştevaniya Spring Web API ev e ku pêşdebirên Spring bikar bînin ku API-ên Spring Web-ê bi hev re bi API-yên MicroProfile re bikar bînin. Nimûneyên çawaniya karanîna API-yên Web Spring Spring-ê yên piştgirî di Tablo 3 de têne peyda kirin, û bêtir agahdarî û nimûneyên li ser vê mijarê dikarin di dersa Quarkusê ya bi navê Bihar Web Guide.

Tablo 3. Nimûneyên bikaranîna API-ên Webê yên Spring Spring.

Taybetmendiyên Webê yên Biharê piştgirî kirin
wergerandî

@RestController
@RequestMapping

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

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

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

Daneyên Spring JPA

Bikarhênerên MicroProfile jî dê teqdîr bikin ku Quarkus JPA-yê bi karanîna ORM-a Hibernate piştgirî dike. Di heman demê de ji bo pêşdebirên Spring Spring jî nûçeyên baş hene: Quarkus annotasyon û celebên Daneyên Spring JPA yên hevpar piştgirî dike. Mînakên karanîna API-yên JPA Daneyên Spring-ê yên piştgirî di Tablo 4 de têne dayîn.
В proje ji mînaka me API-yên JPA Daneyên Spring têne bikar anîn û bêtir agahdarî di dersa Quarkus de heye ku jê re tê gotin Bihar Data JPA Rêbernameya.

Tablo 4. Nimûneyên karanîna API-yên Daneyên Spring JPA yên piştgirîkirî.

Taybetmendiyên JPA Daneyên Biharê piştgirî kirin
wergerandî

CrudRepository

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

Daxistin
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Parçeyên Depoyê

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

Rêbazên lêpirsînê yên derkirî

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Pirsên bikarhêner diyarkirî

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

Toleransa xeletiyê

Avahiyên tolerasyona xeletiyê ji bo pêşîgirtina têkçûnên kaskadî û afirandina mîmariyên mîkroxizmeta pêbawer pir girîng in. Pêşdebirên biharê bi gelek salan ve ji bo tolerasyona xeletiyê şikestinan bikar tînin. Hystrix. Lêbelê, Hystrix ji bo demek dirêj ve nehatiye nûve kirin, lê Toleransa xeletiya MicroProfile naha bi rengek çalak pêş dikeve û li pişt wê çend sal karanîna hilberînê heye. Ji ber vê yekê, ji bo baştirkirina pêbaweriya karûbaran li Quarkus, tê pêşniyar kirin ku hûn API-yên Toleransê Xeletiya MicroProfile bikar bînin, mînakên ku di Tablo 5 de têne bikar anîn. Ji bo bêtir agahdarî li ser vê yekê, li manuala Quarkusê binêre Guide Tolerance Fault.

Tablo 5. Nimûneyên karanîna API-yên Toleransê yên Xeletiya MicroProfile piştgirî kirin.

Taybetmendiyên Tolerasyona Xeletiya MicroProfile
description
wergerandî

@Asynchronous

Bicîhkirina mantiqê di mijarek cuda de

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

@Bulkhead

Hejmara daxwazên hevdemî sînor bikin

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

@CircuitBreaker

Desthilatdariya têkçûna Smart û başkirina ji têkçûnan

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

@Fallback

Di rewşa têkçûnê de gazîkirina mantiqa alternatîf

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

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

Biceribîne

Li ser têkçûna daxwazê ​​ji nû ve biceribîne

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

Başim

Dema kontrolkirina têkçûnê

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

Karûbarên kontrolkirinê (Service Tenduristî)

Platformên Kubernetes tenduristiya konteyneran bi karanîna karûbarên taybetî dişopînin. Ji bo ku rê bidin platforma bingehîn ku karûbaran bişopîne, pêşdebirên Spring bi gelemperî HealthIndicatorek xwerû û Spring Boot Actuator bikar tînin. Di Quarkus de, ev dikare bi karanîna Tenduristiya MicroProfile ve were kirin, ku ji hêla xwerû ve kontrolek zindîtiyê dike, lê dikare were mîheng kirin ku bi hevdemî zindîbûn û amadebûnê kontrol bike. Nimûneyên ku meriv çawa API-yên Tenduristî yên MicroProfile yên piştgirî têne bikar anîn di Tablo 6-ê de têne peyda kirin, û agahdariya zêde di manuala Quarkus de têne peyda kirin. Rêberê Tenduristiyê.

Tablo 6: Mînakên karanîna API-yên Tenduristiya MicroProfile yên piştgirîkirî.

Taybetmendiyên Tenduristiya MicroProfile
description
wergerandî

@Liveness

Platform serîlêdanên konteynirkirî yên têkçûyî ji nû ve dest pê dike
Xala dawî:
mêvandar: 8080 / tenduristî / zindî

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

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

@Amadekarî

Ger platform ne amade be dê seyrûseferê ji serîlêdanên konteyneran re neşîne
Xala dawî:
mêvandar: 8080 / tenduristî / amade

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

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

Metrics

Serlêdan metrîkan ji bo mebestên xebitandinê (ji bo şopandina SLA-yên performansê) an ji bo armancên ne-xebatî (SLA-yên karsaziyê) peyda dikin. Pêşdebirên biharê bi karanîna Spring Boot Actuator û Micrometer metrîkan peyda dikin. Di encamê de, Quarkus Metrîkên MicroProfile bikar tîne da ku metrîkên bingehîn (JVM û pergala xebitandinê), metrîkên firoşkar (Quarkus), û metrîkên serîlêdanê peyda bike. MicroProfile Metrics hewce dike ku pêkanîn formatên derketinê JSON û OpenMetrics (Prometheus) piştgirî bike. Nimûneyên karanîna MicroProfile Metrics API di Tabloya 7 de têne dayîn.

В proje ji mînaka me MicroProfile Metrics ji bo peydakirina metrîkên serîlêdanê têne bikar anîn. Ji bo bêtir agahdarî, li manuala Quarkus binêre Rêbernameya Metrics.

Tablo 7. Nimûneyên karanîna API-yên MîcroProfile Metrics.

Taybetmendiyên Metrîkên MicroProfile
description
wergerandî

@Hejmar kirin

Dijmarek jimarker destnîşan dike ku çend carên ku tişta şirovekirî hatiye gazîkirin dihejmêre

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

@ConcurrentGauge

Pîvanek nîşan dide ku hejmara bangên hevdemî ji bo tiştek şirovekirî dihejmêre

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

@Pîvok

Sensorek pîvanê destnîşan dike ku nirxa tiştek şirovekirî dipîve

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

@Metered

Sensorek metreyê destnîşan dike ku frekansa bangê ya tişta şirovekirî dişopîne

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

Metric

Annotationek ku di derheqê metadata de agahdarî vedihewîne dema ku daxwazek ji bo têketin an hilberîna metrîkê tête wergirtin

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

Demdirêj

Demjimêrek ku dirêjahiya tiştek şîrovekirî dişopîne destnîşan dike

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

Metrics Endpoints

Metrîkên serîlêdanê localhost:8080/metrics/sepan
Metrîkên bingehîn localhost:8080/metrîka/bingeh
Metrîkên vendor localhost:8080/metrîka/firoşkar
Hemû metrics localhost:8080/metrics

MicroProfile Rest Client

Microservices bi gelemperî xalên dawiya RESTful peyda dikin ku hewce dike ku API-yên xerîdar ên têkildar bi wan re bixebitin. Ji bo ku xalên dawiya RESTful bikar bînin, pêşdebirên Spring bi gelemperî RestTemplate bikar tînin. Quarkus ji bo çareserkirina vê pirsgirêkê API-yên MicroProfile Rest Client pêşkêşî dike, mînakên karanîna wan di Tablo 8 de têne dayîn.

В proje ji mînaka me bikaranîna xalên dawiya RESTful bi karanîna MicroProfile Rest Client tê kirin. Zêdetir agahdarî û nimûneyên li ser vê mijarê di manuala Quarkus de têne dîtin Rest Guide Client.

Tablo 8. Mînakên bikaranîna MicroProfile Rest Client APIs.

Taybetmendiyên MicroProfile Rest Client
description
wergerandî

@RegisterRestClient

Têkiliyek Java-ya tîpkirî wekî xerîdarek REST tomar dike

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

@RestClient

Pêkanîna mînakek pêwendiya xerîdar a REST-ê ya tîpkirî nîşan dide

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

Vexwendin

Gazî xala dawiya REST dike

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

mp-rest/url

Xala dawiya REST diyar dike

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

Encam

Di vê blogê de, ku di serî de ji pêşdebirên Springê re tê armanc kirin, me bi lez nihêrî ka meriv çawa API-yên Spring bi API-yên MicroProfile re li Quarkus-ê bikar tîne da ku mîkroxizmetên Java-yê pêşve bibe û dûv re wan di koda binary ya xwemalî de berhev bike ku bi sedan megabyte RAM-ê xilas dike û di nav de dest pê dike. meseleya milîsaniyeyan.

Wekî ku we berê jî fêm kir, bêtir agahdarî di derbarê piştgirî ji bo Spring and MicroProfile APIs, û hem jî gelek agahdariyên din ên kêrhatî, dikarin li manuals Quarkus.

Source: www.habr.com

Add a comment