Pehea ʻo Quarkus e hui pū ai i ka MicroProfile a me ka puna

Aloha kākou, eia ke kolu o ka pou ma ka moʻo Quarkus!

Pehea ʻo Quarkus e hui pū ai i ka MicroProfile a me ka puna

Ke hoʻomohala nei i nā microservices Java, manaʻo pinepine ʻia kēlā Eclipse MicroProfile и ʻ bootpala puna he mau API kūʻokoʻa a kūʻokoʻa. Ma ka maʻamau, hoʻohana nā polokalamu polokalamu i nā API a lākou i maʻa mua ai, ʻoiai ke aʻo ʻana i nā frameworks hou a me nā ʻāpana runtime e lōʻihi ka manawa. I kēia lā e ho'āʻo mākou e hoʻomaʻamaʻa i ka hoʻomohala ʻana o kekahi mea kaulana MicroProfile API no nā mea hoʻomohala Spring a hōʻike iā ʻoe pehea e hoʻohana ai i ka Spring API a me nā hiʻohiʻona hou ʻO Quarkus.

Ma kahi kikoʻī hou aku, e nānā mua mākou i ka laulā a me nā kikoʻī o ke kākoʻo ʻana o Quarkus i nā API Spring e hōʻike i nā mea hoʻomohala Spring pehea e hoʻohana ai i ka MicroProfile API i kā lākou hana i kēlā me kēia lā. A laila e uhi mākou i nā API MicroProfile, he mea pono no nā mea hoʻomohala Spring i ka wā e hana ai i nā microservices.

No ke aha ʻo Quarkus? ʻO ka mea mua, he coding ola kēia, ʻo ia hoʻi, ka hoʻouka hou ʻana i nā loli i ka MicroProfile API, Spring API a me nā API Java ʻē aʻe, i hana ʻia me hoʻokahi kauoha: mvn quarkus:dev. ʻO ka lua, kūkākūkā ʻia ma i kā mākou laʻana ʻO ka lawelawe kanaka (e hōʻuluʻulu ana mai Spring, MicroProfile, a me JPA API i kahi binary me ka hoʻohana ʻana i ke kiʻi GraalVM maoli) hoʻomaka i loko o 0.055 kekona wale nō a lawe ma kahi o 90 MB o RAM (RSS) ma ka palena noi RESTful. Eia kekahi, hoʻokō ʻia kāna hōʻuluʻulu ʻana me hoʻokahi kauoha: mvn package -Pnative.

ʻAʻole mākou e hele i nā kikoʻī e pili ana i MicroProfile, ʻokoʻa ke kōkua i nā mea hoʻomohala Spring e hoʻomaopopo pehea e hiki ai iā lākou ke hoʻohana i nā API Spring me nā API MicroProfile ma Quarkus.

ʻO nā pahu a me nā Kubernetes

No ka maʻalahi o kēia ʻatikala, e uhi wale mākou i nā ʻāpana kiʻekiʻe o ke kākoʻo ma aneʻi. Kubernetes, no ka mea, he mea nui e hoomaopopo. Ua hoʻonoho ʻia ʻo Quarkus ma ke ʻano he Java stack no Kubernetes, ua hoʻolālā ʻia e hōʻemi i ka hoʻohana ʻana i ka hoʻomanaʻo a me ka manawa hoʻomaka o nā noi a me nā lawelawe Java, a ma muli o ka hopena, hoʻonui i ko lākou ʻano ma luna o ka host a hoʻemi i nā kumukūʻai holoʻokoʻa.

ʻO Quarkus kekahi kākoʻo i ka hana kaʻa Nā kumu waiwai a me nā hāʻawi Kubernetes alakai no ka waiho ʻana ma nā kahua ʻo Kubernetes a me Red Hat OpenShift. Eia hou, hoʻopuka ʻo Quarkus i nā faila Dockerfile.jvm (JVM packaging) a me Dockerfile.native (native binary packaging) i pono e hana i nā ipu.

ʻO ka mea hope loa, ma ka nānā ʻana i nā Kubernetes ma ke ʻano he wahi hoʻolālā hoʻolālā, ʻaʻole hoʻohana ʻo Quarkus i nā frameworks Java i nā hihia i hoʻokō ʻia nā hana like ma ka pae o ka platform Kubernetes ponoʻī. Hāʻawi ka Papa 1 i ka palapala ʻāina o ka leka hana ma waena o Kubernetes a me nā ʻōnaehana Java maʻamau i hoʻohana ʻia e nā mea hoʻomohala Spring.

Papa 1. Palapala 'āina o ka pilina hana ma waena o Java frameworks a me Kubernetes.

Hanaʻia
Kāleʻa Puna Kuʻuna
Kubernetes

ʻIke lawelawe
Eureka
pākuʻina kau

hoʻonohonohoʻia
Puna Cloud Config
Hoʻopili i nā palapala ʻāina/huna

Load kaulike
Lipine (ʻaoʻao mea kūʻai aku)
ʻO ka lawelawe, ka mea hoʻoponopono hou (ʻaoʻao kikowaena)

Hoʻopili a holo i ke code mai ka laʻana

Ma keia 'atikala mākou e pili ana papahana laʻana, kahi i hoʻohana pū ʻia ai nā API Spring a me MicroProfile a me ka papa Java like. Hiki ke hōʻuluʻulu a holo ka code ma kēia hiʻohiʻona mai ka laina kauoha, e ʻike i ka faila README.md no nā kikoʻī.

Nā API no ka punawai

Pākuʻi dependence

Kākoʻo ʻo Quarkus i ka laulā o Nā Kūlana a me ka Dependency Injection (CDI) API a me nā API no ka hoʻopaʻa ʻana i ka punawai (Spring DI). Inā ʻoe e hana pū me MicroProfile, Java EE a me Jakarta EE, a laila ua kamaʻāina loa ʻoe iā CDI. Ma ka ʻaoʻao ʻē aʻe, hiki i nā mea hoʻomohala Spring ke hoʻohana i ka Quarkus Extension no Spring DI API e hoʻokō i ka hoʻohālikelike me Spring DI. Hāʻawi ʻia nā laʻana o ka hoʻohana ʻana i nā Spring DI API i kākoʻo ʻia ma ka Papa 2.

В papahana mai kā mākou laʻana Hoʻohana i ka CDI a me ka Spring Dependency Injection. No ka ʻike hou aku a me nā laʻana e pili ana i kēia kumuhana, e ʻike i ke alakaʻi Quarkus i kāhea ʻia Puna DI alakai.

Papa 2. Nā laʻana o ka hoʻohana ʻana i nā API Spring DI i kākoʻo ʻia.

Kākoʻo ʻia nā hiʻohiʻona puna DI
examples

ʻO ka mea hana hoʻoheheʻe

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

ʻImi kahua
Uea auto
Value

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Hoʻonohonoho

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

ke keʻena

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

Service

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

   public String getPrefix() {
      return message;
   }
}

Pūnaehana pūnaewele

E makemake nā mea hoʻohana MicroProfile e kākoʻo ʻo Quarkus iā JAX-RS, MicroProfile Rest Client, JSON-P, a me JSON-B ma ke ʻano he kumu hoʻohālike hoʻolālā pūnaewele. E hauʻoli nā mea hoʻomohala puna i ke kākoʻo hou o Quarkus no ka Spring Web API, ʻo ia hoʻi nā pilina REST. E like me Spring DI, ʻo ka pahuhopu nui o ke kākoʻo Spring Web API ʻo ia ka mea e hiki ai i nā mea hoʻomohala Spring ke hoʻohana i nā API Pūnaewele Puna i hui pū me nā API MicroProfile. Hāʻawi ʻia nā hiʻohiʻona o ka hoʻohana ʻana i nā Spring Web API i kākoʻo ʻia ma ka Papa 3, a ʻike ʻia nā ʻike hou aʻe a me nā hiʻohiʻona e pili ana i kēia kumuhana ma ke kumu aʻo Quarkus i kapa ʻia. Alakaʻi punawelewele puna.

Papa 3. Nā laʻana o ka hoʻohana ʻana i nā API Pūnaewele Puna i kākoʻo ʻia.

Kākoʻo ʻia nā hiʻohiʻona pūnaewele puna
examples

@RestController
@NoiMapa

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@NoiParam
@NoiHeader
@MatrixVariable
@PathVariable
@CookieValue
@NoiKe kino
@PaneStatus
@ExceptionHandler
@RestControllerAdvice (ʻāpana)

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

ʻIkepili Puna JPA

E mahalo pū nā mea hoʻohana MicroProfile e kākoʻo ʻo Quarkus iā JPA me ka hoʻohana ʻana i ka Hibernate ORM. Aia kekahi nūhou maikaʻi no nā mea hoʻomohala Spring: Kākoʻo ʻo Quarkus i nā hōʻike a me nā ʻano ʻano Spring Data JPA. Hāʻawi ʻia nā laʻana o ka hoʻohana ʻana i nā API JPA ʻIke Puna i kākoʻo ʻia ma ka Papa 4.
В papahana mai kā mākou laʻana Hoʻohana ʻia nā API JPA Spring Data a loaʻa nā ʻike hou aʻe ma ke kumu aʻo Quarkus i kapa ʻia ʻIkepili puna JPA alakaʻi.

Papa 4. Nā laʻana o ka hoʻohana ʻana i nā API JPA ʻIkepili puna i kākoʻo ʻia.

Kākoʻo ʻia nā hiʻohiʻona ʻike puna JPA
examples

CrudRepository

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

Ka Hale Paʻi
JpaRepository
ʻO ka Hale Hōʻikeʻike Aʻo

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Nā ʻāpana waihona

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

Nā ʻano nīnau i loaʻa

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Nā nīnau i wehewehe ʻia e ka mea hoʻohana

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

Nā API MicroProfile

Hoʻomanawanui hewa

He mea koʻikoʻi nā hana hoʻomanawanui hewa no ka pale ʻana i nā hemahema cascading a me ka hana ʻana i nā hale hana microservice hilinaʻi. Ua hoʻohana nā mea hoʻomohala puna i nā mea hoʻokaʻawale kaapuni no ka hoʻomanawanui hewa no nā makahiki he nui. Hystrix. Eia naʻe, ʻaʻole i hōʻano hou ʻia ʻo Hystrix no ka manawa lōʻihi, akā ke ulu ikaika nei ka MicroProfile's Fault Tolerance a he mau makahiki o ka hoʻohana ʻana ma hope o ia. No laila, no ka hoʻomaikaʻi ʻana i ka hilinaʻi o nā lawelawe ma Quarkus, ua ʻōlelo ʻia e hoʻohana i ka MicroProfile Fault Tolerance API, nā hiʻohiʻona o ia mea i hoʻohana ʻia ma ka Papa 5. No ka ʻike hou aku e pili ana i kēia, e ʻike i ka manual Quarkus Ke alakaʻi hoʻomanawanui hewa.

Papa 5. Nā hiʻohiʻona o ka hoʻohana ʻana i nā API Hoʻomanawanui hewa MicroProfile i kākoʻo ʻia.

Nā hiʻohiʻona hoʻomanawanui hewa MicroProfile
hōʻikeʻano
examples

@Asynchronous

Ka hoʻokō ʻana i ka loiloi ma kahi pae ʻokoʻa

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

@Pulkhead

E kaupalena i ka helu o nā noi like

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

@CircuitBreaker

ʻO ka hoʻoponopono maikaʻi ʻole a me ka hoʻihoʻi ʻana mai nā hemahema

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

@Fallback

Ke kāhea ʻana i nā loina ʻē aʻe inā ʻaʻole hiki

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

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

E ho'āʻo

E ho'āʻo hou i ka hāʻule ʻana o ke noi

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

Manawa hoʻomaha

Ka pau ʻana o ka mana hoʻopono

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

Nā lawelawe nānā (Service Health)

Nānā nā kahua ʻo Kubernetes i ke olakino o nā ipu me ka hoʻohana ʻana i nā lawelawe kūikawā. No ka ʻae ʻana i ka paepae lalo e nānā i nā lawelawe, hoʻohana maʻamau nā mea hoʻomohala Spring i kahi HealthIndicator maʻamau a me Spring Boot Actuator. Ma Quarkus, hiki ke hana i kēia me ka MicroProfile Health, ka mea maʻamau e hana i ka nānā ola, akā hiki ke hoʻonohonoho ʻia e nānā i ka ola a me ka mākaukau. Hāʻawi ʻia nā hiʻohiʻona o ka hoʻohana ʻana i nā MicroProfile Health API i kākoʻo ʻia ma ka Papa 6, a hāʻawi ʻia nā ʻike hou aʻe ma ka manual Quarkus Alakai Ola.

Papa 6: Nā hiʻohiʻona hoʻohana o nā API Health MicroProfile i kākoʻo ʻia.

Nā hiʻohiʻona olakino MicroProfile
hōʻikeʻano
examples

@ola

ʻAʻole hiki ke hoʻomaka hou ka paepae i nā noi pahu pahu
Hopena:
mea hoʻokipa: 8080 / olakino / ola

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

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

@Makaukau

ʻAʻole e hoʻouna ka paepae i nā kaʻa i nā noi containerized inā ʻaʻole mākaukau
Hopena:
mea hoʻokipa: 8080 / olakino / mākaukau

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

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

Nā ana

Hāʻawi nā noi i nā ana no nā kumu hana (e nānā i nā SLA hana) a i ʻole nā ​​​​mea hana ʻole (nā SLA ʻoihana). Hāʻawi nā mea hoʻomohala puna i nā metric me ka hoʻohana ʻana i ka Spring Boot Actuator a me ka Micrometer. Ma ka huli ʻana, hoʻohana ʻo Quarkus i nā MicroProfile Metrics e hāʻawi i nā metric baseline (JVM a me ka ʻōnaehana hana), nā mea kūʻai aku (Quarkus), a me nā metric noi. Pono ʻo MicroProfile Metrics e kākoʻo ka hoʻokō ʻana i nā puka puka JSON a me OpenMetrics (Prometheus). Hāʻawi ʻia nā laʻana o ka hoʻohana ʻana i ka MicroProfile Metrics API ma ka Papa 7.

В papahana mai kā mākou laʻana Hoʻohana ʻia nā MicroProfile Metrics e hāʻawi i nā ana noi. No ka ʻike hou aku, e ʻike i ka manual Quarkus Alakaʻi ana ʻana.

Papa 7. Nā laʻana o ka hoʻohana ʻana i nā MicroProfile Metrics API.

Nā hiʻohiʻona MicroProfile Metrics
hōʻikeʻano
examples

@Heluia

Hōʻike i kahi counter counter e helu ana i ka helu o nā manawa i kāhea ʻia ai kahi mea i hōʻike ʻia

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

@ConcurrentGauge

Hōʻike i kahi ana e helu ana i ka helu o nā kelepona like ʻole i kahi mea i hōʻike ʻia

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

@Ana

Hōʻike i kahi mea ʻike ana e ana i ka waiwai o kahi mea i hōʻike ʻia

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

@Metered

Hōʻike i kahi mea ʻike mika e nānā ana i ka alapine kelepona o kahi mea i hōʻike ʻia

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

Kāleka

He hōʻike i loaʻa ka ʻike e pili ana i ka metadata ke loaʻa kahi noi e komo a hana i kahi metric

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

Kahi manawa

Hōʻike i kahi manawa e hahai ana i ka lōʻihi o kahi mea i hōʻike ʻia

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

Nā Kiʻi Hoʻopau

Nā ana noi localhost:8080/meka/noi
Anana kumu localhost: 8080/metrics/base
Mea kūʻai aku localhost:8080/metrics/mea kūʻai aku
Nā ana a pau localhost:8080/meka

Mea kūʻai hoʻomaha MicroProfile

Hāʻawi pinepine nā Microservices i nā wahi hopena RESTful e koi ana i nā API mea kūʻai aku e hana pū me. No ka hoʻohana ʻana i nā wahi hopena RESTful, hoʻohana maʻamau nā mea hoʻomohala Spring i RestTemplate. Hāʻawi ʻo Quarkus i nā API Client Rest MicroProfile e hoʻoponopono i kēia pilikia, nā hiʻohiʻona o ka hoʻohana ʻana i hāʻawi ʻia ma ka Papa 8.

В papahana mai kā mākou laʻana ka hoʻohana ʻana i nā wahi hopena RESTful e hoʻohana ana i ka MicroProfile Rest Client. Hiki ke loaʻa nā ʻike hou aʻe a me nā laʻana no kēia kumuhana ma ka manual Quarkus Hoʻomaha Client Guide.

Papa 8. Nā hiʻohiʻona o ka hoʻohana ʻana i nā API Client Rest MicroProfile.

Nā hiʻohiʻona o nā mea kūʻai aku hoʻomaha MicroProfile
hōʻikeʻano
examples

@RegisterRestClient

Hoʻopaʻa inoa i kahi kikowaena Java i kākau ʻia ma ke ʻano he mea kūʻai aku REST

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

@RestClient

Hōʻailona i ka hoʻokō ʻana i kahi laʻana o kahi kikowaena mea kūʻai aku REST

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

Kū'ē

Kāhea i kahi hoʻopau REST

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

mp-hoomaha/url

Hōʻike i ke kiko hope REST

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

Nā hopena

Ma kēia blog, i kuhikuhi nui ʻia i nā mea hoʻomohala Spring, ua nānā wikiwiki mākou i ka hoʻohana ʻana i nā API Spring me nā MicroProfile API ma Quarkus e hoʻomohala i nā microservices Java a laila hōʻuluʻulu iā lākou i loko o nā code binary maoli e mālama ai i nā haneli megabytes o RAM a hoʻomaka i loko. he mau milliseconds.

E like me kāu i hoʻomaopopo mua ai, hiki ke loaʻa ka ʻike hou aku e pili ana i ke kākoʻo no ka Spring and MicroProfile API, a me ka nui o nā ʻike pono ʻē aʻe. Quarkus manuals.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka