Maitiro eQuarkus anosanganisa MicroProfile uye Chitubu

Mhoroi mose, heino chinyorwa chechitatu muQuarkus nhevedzano!

Maitiro eQuarkus anosanganisa MicroProfile uye Chitubu

Paunenge uchigadzira Java microservices, inowanzo tenda izvozvo Eclipse MicroProfile ΠΈ Bhoti yechirimo akasiyana uye akazvimirira APIs. Nekumisikidza, vanogadzira mapurogiramu vanowanzo shandisa maAPI avanenge vatojaira, sezvo kudzidza maitiro matsva uye zvikamu zvekumhanya zvinotora nguva yakawanda. Nhasi tichaedza kurerutsa kukura kwevamwe vanozivikanwa MicroProfile API yeChitubu vanogadzira uye kukuratidza maitiro ekushandisa panguva imwe chete iyo Spring API uye itsva inobatsira maficha quarkus.

Mune zvimwe zvishoma, isu tichatanga tatarisa chiyero uye ruzivo rwekuti Quarkus inotsigira sei Spring APIs kuratidza vanogadzira Chitubu mashandisiro eiyo MicroProfile API mubasa ravo rezuva nezuva. Zvadaro tichavhara iyo MicroProfile APIs, iyo inobatsira kune vanogadzira Spring kana vachigadzira microservices.

Sei Quarks? Chekutanga, uku ndiko kukodha mhenyu, ndiko kuti, kurodha otomatiki kwechero shanduko muMicroProfile API, Spring API uye mamwe maJava APIs, ayo anoitwa nemurairo mumwe chete: mvn quarkus:dev. Chechipiri, inofungidzirwa mukati mumuenzaniso wedu iyo Person sevhisi (iyo inounganidza kubva kuChitubu, MicroProfile, uye JPA APIs kuita bhinari uchishandisa iyo yekuzvarwa GraalVM mufananidzo) inotanga mumasekonzi 0.055 chete uye inotora ingangoita makumi mapfumbamwe MB ye RAM (RSS) pane RESTful application endpoint. Uyezve, kuunganidzwa kwayo pachayo kunoitwa nemurairo mumwe chete: mvn package -Pnative.

Hatisi kuzopinda mune zvakadzama nezve MicroProfile, kunze kwekubatsira vanogadzira Spring kuti vanzwisise mashandisiro avangaita Spring APIs neMicroProfile APIs muQuarkus.

Containers uye Kubernetes

Kuchengeta chinyorwa ichi chiri nyore, isu tinongovhara iyo yepamusoro-nhanho maficha erutsigiro pano. Kubernetes, nokuti zvinokosha kunzwisisa. Quarkus yakamisikidzwa seJava stack yeKubernetes, yakagadzirirwa kudzikisa ndangariro yekushandisa uye nguva yekutanga yeJava maapplication nemasevhisi, uye, semhedzisiro, kuwedzera density yavo pane iyo host uye kuderedza mutengo wakazara.

Quarcus zvakare inotsigira auto kugadzirwa Kubernetes zviwanikwa uye zvinopihwa utungamiri yekutumirwa paKubernetes uye Red Hat OpenShift mapuratifomu. Pamusoro pezvo, Quarkus inogadzira otomatiki maDockerfile.jvm (JVM packaging) uye Dockerfile.native (native binary packaging) mafaira anodiwa kugadzira midziyo.

Chekupedzisira, nekutarisa Kubernetes senzvimbo yekuendesa inotangwa, Quarkus haishandise Java masisitimu mumamiriro ezvinhu apo kushanda kwakafanana kunoitwa padanho reKubernetes papuratifomu pachayo. Tafura 1 inopa mepu yekunyorerana kunoshanda pakati peKubernetes uye yakajairwa Java masimusi anoshandiswa nevanogadzira Spring.

Tafura 1. Mepu yekunyorerana kunoshanda pakati peJava maitiro uye Kubernetes.

Inoshanda
Traditional Spring Boot
Kubernetes

Kuwanikwa kwesevhisi
Eureka
DNS

Configuration
Spring Cloud Config
Gadzirisa Mepu/Zvakavanzika

Kutakura zviyero
Ribhoni (divi revatengi)
Sevhisi, Replication Controller (server side)

Kunyora uye kushandisa kodhi kubva pamuenzaniso

Munyaya ino tinotaura nezvazvo muenzaniso purojekiti, uko Chitubu uye MicroProfile APIs uye kunyange iyo yakafanana kirasi yeJava inoshandiswa pamwe chete. Kodhi iri mumuenzaniso uyu inogona kuunganidzwa uye kumhanya kubva pamutsetse wekuraira, ona README.md faira kuti uwane ruzivo.

Spring Framework APIs

Kuvimbika jekiseni

Quarks inotsigira huwandu hwe Contexts uye Dependency Injection (CDI) APIs uye Spring Dependency Injection (Spring DI) APIs. Kana uri kushanda ne MicroProfile, Java EE uye Jakarta EE, saka unenge watojairana neCDI. Kune rimwe divi, Vagadziri veChitubu vanogona kushandisa iyo Quarkus Kuwedzeredza kweChirimo DI API kuti iwane kuenderana neChirimo DI. Mienzaniso yekushandisa inotsigirwa Spring DI APIs inopihwa muTafura 2.

Π’ purojekiti kubva kumuenzaniso wedu Inoshandisa ese CDI uye Spring Dependency Injection. Ruzivo rwakawanda uye mienzaniso pane iyi nyaya inogona kuwanikwa mugwaro reQuarkus rinonzi Spring DI Guide.

Tafura 2. Mienzaniso yekushandisa inotsigirwa Spring DI APIs.

Inotsigirwa Spring DI Zvimiro
mienzaniso

Constructor Jekiseni

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

Munda Jekiseni
Autowired
ukoshi

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

bhinzi
@Configuration

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

chikamu

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

sevhisi

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

   public String getPrefix() {
      return message;
   }
}

Web framework

Vashandisi veMicroProfile vachada kuti Quarkus inotsigira JAX-RS, MicroProfile Rest Client, JSON-P, uye JSON-B seyekutanga webhu dhizaini modhi. Vagadziri veSpring vachafadzwa neQuarkus 'ichangoburwa rutsigiro rweSpring Web API, kunyanya REST interfaces. Zvakafanana neChirimo DI, chinangwa chikuru cheSpring Web API rutsigiro ndechekugonesa vanogadzira Spring kushandisa Spring Web APIs pamwe chete neMicroProfile APIs. Mienzaniso yemashandisiro eiyo inotsigirwa yeSpring Web APIs inopihwa muTafura 3, uye rumwe ruzivo nemienzaniso pane iyi nyaya inogona kuwanikwa muQuarkus tutorial inonzi. Spring Web Guide.

Tafura 3. Mienzaniso yekushandisa inotsigirwa Spring Web APIs.

Inotsigirwa Spring Web Features
mienzaniso

@RestController
@RequestMapping

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

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

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

Spring DataJPA

Vashandisi veMicroProfile vanozofarirawo kuti Quarkus inotsigira JPA vachishandisa Hibernate ORM. Kune zvakare nhau dzakanaka dzevagadziri veChitubu: Quarkus inotsigira zvakajairika Spring Data JPA zvirevo uye marudzi. Mienzaniso yekushandisa inotsigirwa Spring Data JPA APIs inopihwa muTebhu 4.
Π’ purojekiti kubva kumuenzaniso wedu Spring Data JPA APIs anoshandiswa uye rumwe ruzivo rwunowanikwa muQuarkus tutorial inonzi Spring Data JPA Guide.

Tafura 4. Mienzaniso yekushandisa inotsigirwa Spring Data JPA APIs.

Inotsigirwa Spring Data JPA Zvimiro
mienzaniso

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repository Fragments

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

Nzira dzekubvunza dzakatorwa

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Mibvunzo yakatsanangurwa nemushandisi

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

Kushivirira mhosva

Kukanganisa kushivirira kuvaka kwakakosha kwazvo kudzivirira kutadza kutadza uye kugadzira yakavimbika microservice architecture. Vagadziri vechirimo vanga vachishandisa masekete-vanopwanya kushivirira kukanganisa kwemakore mazhinji. Hystrix. Nekudaro, Hystrix haina kuvandudzwa kwenguva yakareba, asi MicroProfile's Fault Tolerance ikozvino iri kushingaira kukura uye ine makore akati wandei ekushandiswa kwekugadzira kumashure kwayo. Nokudaro, kuti uvandudze kuvimbika kwemabasa muQuarkus, zvinokurudzirwa kushandisa MicroProfile Fault Tolerance APIs, mienzaniso iyo inoshandiswa muTebhu 5. Kuti uwane mamwe mashoko pamusoro peizvi, ona bhuku reQuarkus. Fault Tolerance Guide.

Tafura 5. Mienzaniso yekushandisa inotsigirwa MicroProfile Fault Tolerance APIs.

MicroProfile Fault Tolerance Features
tsananguro
mienzaniso

@Asynchronous

Kuita pfungwa mune imwe shinda

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

@Bulkhead

Deredza nhamba yezvikumbiro panguva imwe chete

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

@CircuitBreaker

Smart kutadza kubata uye kupora kubva mukukundikana

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

@Fallback

Kudaidza imwe pfungwa kana yatadza

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

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

Retry

Edzazve pakukumbira kukundikana

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

Nguva yapera

Kutadza kudzora nguva

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

Kutarisa masevhisi (Hutano hweSevhisi)

Kubernetes mapuratifomu anotarisisa hutano hwemidziyo uchishandisa akakosha masevhisi. Kubvumidza iri pasi pepuratifomu yekutarisa masevhisi, Vagadziri veChirimo vanowanzo shandisa tsika HealthIndicator uye Spring Boot Actuator. MuQuarkus, izvi zvinogona kuitwa uchishandisa MicroProfile Health, iyo nekusarudzika inoita cheki yehupenyu, asi inogona kugadzirwa kuti panguva imwe chete itarise kurarama uye kugadzirira. Mienzaniso yemashandisirwo eiyo MicroProfile Health APIs inotsigirwa inopihwa muTable 6, uye rumwe ruzivo rwunopihwa muQuarkus manual. Nhungamiro yehutano.

Tafura 6: Mienzaniso yekushandisa inotsigirwa MicroProfile Health APIs.

MicroProfile Health features
tsananguro
mienzaniso

@Liveness

Iyo platform inotangazve yakundikana zvikumbiro zvemukati
Endpoint:
muenzi:8080/health/live

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

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

@Kugadzirira

Iyo puratifomu haitumire traffic kune yakamisikidzwa zvikumbiro kana isati yagadzirira
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();  
}

Metrics

Zvishandiso zvinopa metrics ezvimwe zvinangwa zvekushanda (kutarisa mashandiro eSLA) kana zvisiri zvekushanda (bhizinesi SLAs). Vagadziri vechirimo vanopa metric vachishandisa Spring Boot Actuator uye Micrometer. Nekudaro, Quarkus inoshandisa MicroProfile Metrics kupa baseline metrics (JVM uye inoshanda sisitimu), mutengesi metrics (Quarkus), uye application metrics. MicroProfile Metrics inoda kuti kuita kunotsigira JSON uye OpenMetrics (Prometheus) mafomati ekubuda. Mienzaniso yekushandisa iyo MicroProfile Metrics API inopihwa muTafura 7.

Π’ purojekiti kubva kumuenzaniso wedu MicroProfile Metrics inoshandiswa kupa mametric ekushandisa. Kuti uwane rumwe ruzivo, ona bhuku reQuarkus Metrics Guide.

Tafura 7. Mienzaniso yekushandisa MicroProfile Metrics APIs.

MicroProfile Metrics Zvimiro
tsananguro
mienzaniso

@Counted

Zvinoreva kaunda inoverenga nhamba yenguva yakadanwa chinhu chine chirevo

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

@ConcurrentGauge

Rinonongedza geji inoverenga nhamba dzekufona panguva imwe chete kuchinhu chine chirevo

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

@Gauge

Zvinoreva geji sensor inoyera kukosha kwechinhu chakatsanangurwa

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

@Metered

Zvinoreva meter sensor inotarisisa frequency yekufona kwechinhu chakatsanangurwa

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

Metric

Chirevo chine ruzivo nezve metadata kana chikumbiro chagamuchirwa chekupinda kana kugadzira metric

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

Nguva

Inoratidza chibatiso chenguva chinoteedzera nguva yechinhu chakanyorwa

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

Metrics Endpoints

Maitiro ekushandisa localhost:8080/metrics/application
Basic metrics localhost:8080/metrics/base
Vendor metrics localhost:8080/metrics/mutengesi
Metrics ese localhost:8080/metrics

MicroProfile Zorora Mutengi

Microservices dzinowanzopa RESTful magumo ayo anoda anowirirana mutengi APIs kushanda nawo. Kushandisa RESTful endpoints, Vagadziri veSpring vanowanzo shandisa RestTemplate. Quarkus inopa MicroProfile Rest Client APIs kugadzirisa dambudziko iri, mienzaniso yekushandisa iyo yakapihwa muTafura 8.

Π’ purojekiti kubva kumuenzaniso wedu kushandiswa kweRESTful endpoints kunoitwa uchishandisa MicroProfile Rest Client. Ruzivo rwakawanda uye mienzaniso pane iyi nyaya inogona kuwanikwa mubhuku reQuarkus Zorora Client Guide.

Tafura 8. Mienzaniso yekushandisa MicroProfile Rest Client APIs.

MicroProfile Rest Client Features
tsananguro
mienzaniso

@RegisterRestClient

Inonyoresa Java interface semutengi weREST

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

@RestClient

Inocherekedza kuitwa kwechiitiko chetaipa REST mutengi interface

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

Kukumbira

Inodaidza REST magumo

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

mp-rest/url

Inotsanangura REST magumo

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

Migumisiro

Mune ino blog, yakanangana zvakanyanya nevagadziri veChirimo, takatarisa nekukurumidza mashandisiro eSpring APIs neMicroProfile APIs muQuarkus kugadzira Java microservices tobva tazviunganidza mumabhanari kodhi inochengetedza mazana emamegabytes e RAM uye kutanga mukati. nyaya yemamilliseconds.

Sezvawatonzwisisa, rumwe ruzivo nezve rutsigiro rweChitubu uye MicroProfile APIs, pamwe nerumwe ruzivo rwakawanda runobatsira, runogona kuwanikwa mukati. Quarks zvinyorwa.

Source: www.habr.com

Voeg