Bawo ni Quarkus ṣe dapọ MicroProfile ati Orisun omi

Kaabo gbogbo eniyan, eyi ni ifiweranṣẹ kẹta ni jara Quarkus!

Bawo ni Quarkus ṣe dapọ MicroProfile ati Orisun omi

Nigbati o ba ndagbasoke awọn iṣẹ microservice Java, igbagbogbo gbagbọ pe Oṣupa MicroProfile и Bata orisun omi jẹ lọtọ ati ominira APIs. Nipa aiyipada, awọn pirogirama ṣọ lati lo awọn API ti wọn ti lo tẹlẹ, niwọn igba ti kikọ ẹkọ awọn ilana tuntun ati awọn paati asiko ṣiṣe gba akoko pupọ. Loni a yoo gbiyanju lati simplify awọn idagbasoke ti diẹ ninu awọn gbajumo API MicroProfile fun awọn olupilẹṣẹ orisun omi ati fihan ọ bi o ṣe le lo API Orisun omi nigbakanna ati awọn ẹya tuntun ti o wulo quarkus.

Ni alaye diẹ sii, a yoo kọkọ wo iwọn ati awọn alaye ti bii Quarkus ṣe ṣe atilẹyin Awọn API orisun omi lati ṣafihan awọn olupilẹṣẹ orisun omi bi wọn ṣe le lo MicroProfile API ni iṣẹ ojoojumọ wọn. Lẹhinna a yoo bo awọn API MicroProfile, eyiti o wulo fun awọn olupilẹṣẹ orisun omi nigba ṣiṣẹda awọn iṣẹ microservices.

Kini idi ti Quarkus? Ni akọkọ, eyi ni ifaminsi laaye, iyẹn ni, atunko laifọwọyi ti eyikeyi awọn ayipada ninu MicroProfile API, Orisun API ati awọn API Java miiran, eyiti o ṣe pẹlu aṣẹ kan: mvn quarkus: dev. Ẹlẹẹkeji, kà ni ninu apẹẹrẹ wa iṣẹ Eniyan (eyiti o ṣajọ lati Orisun omi, MicroProfile, ati JPA APIs sinu alakomeji nipa lilo aworan abinibi GraalVM) bẹrẹ ni awọn aaya 0.055 nikan ati gba to 90 MB ti Ramu (RSS) lori aaye ipari ohun elo RESTful. Pẹlupẹlu, akopọ rẹ funrararẹ ni a ṣe pẹlu aṣẹ kan: mvn package -Pnative.

A ko ni lọ sinu awọn alaye nipa MicroProfile, yatọ si lati ṣe iranlọwọ fun awọn olupilẹṣẹ Orisun omi ni oye bi wọn ṣe le lo awọn API orisun omi pẹlu MicroProfile APIs ni Quarkus.

Awọn apoti ati Kubernetes

Lati jẹ ki nkan yii rọrun, a yoo bo awọn aaye ipele giga ti atilẹyin nikan nibi. Kubernetes, nitori o ṣe pataki lati ni oye. Quarkus wa ni ipo bi akopọ Java fun Kubernetes, o jẹ apẹrẹ lati dinku agbara iranti ati akoko ibẹrẹ ti awọn ohun elo ati awọn iṣẹ Java, ati, bi abajade, mu iwuwo wọn pọ si lori agbalejo ati dinku awọn idiyele gbogbogbo.

Quarkus tun atilẹyin auto iran Kubernetes oro ati ipese awọn itọsọna fun imuṣiṣẹ lori Kubernetes ati Red Hat OpenShift awọn iru ẹrọ. Ni afikun, Quarkus n ṣe agbejade laifọwọyi Dockerfile.jvm (package JVM) ati Dockerfile.native (apoti alakomeji abinibi) awọn faili ti o nilo lati ṣẹda awọn apoti.

Lakotan, nipa idojukọ Kubernetes bi agbegbe imuṣiṣẹ ibi-afẹde, Quarkus ko lo awọn ilana Java ni awọn ọran nibiti a ti ṣe iru iṣẹ ṣiṣe ni ipele ti Syeed Kubernetes funrararẹ. Tabili 1 n pese maapu kan ti ifọrọranṣẹ iṣẹ laarin Kubernetes ati awọn ilana Java aṣoju ti awọn olupilẹṣẹ orisun omi lo.

Tabili 1. Maapu ti ifọrọranṣẹ iṣẹ laarin awọn ilana Java ati Kubernetes.

Iṣẹ-ṣiṣe
Ibile Orisun omi Boot
Kubernetes

Awari iṣẹ
Eureka
DNS

iṣeto ni
Orisun Cloud Config
Tunto Maps/Aṣiri

Fifi iwọntunwọnsi
Ribbon (ẹgbẹ onibara)
Iṣẹ, Atunṣe Atunṣe (ẹgbẹ olupin)

Iṣakojọpọ ati ṣiṣiṣẹ koodu lati apẹẹrẹ

Ninu nkan yii a tọka si apẹẹrẹ ise agbese, nibiti Orisun omi ati MicroProfile APIs ati paapaa kilasi Java kanna ni a lo papọ. Awọn koodu ti o wa ninu apẹẹrẹ yii le ṣe akopọ ati ṣiṣe lati laini aṣẹ, wo faili README.md fun awọn alaye.

Orisun Framework APIs

Abẹrẹ igbẹkẹle

Quarkus ṣe atilẹyin sakani ti Awọn ọrọ-ọrọ ati Abẹrẹ Igbẹkẹle (CDI) APIs ati Abẹrẹ Igbẹkẹle orisun omi (orisun omi DI) APIs. Ti o ba n ṣiṣẹ pẹlu MicroProfile, Java EE ati Jakarta EE, lẹhinna o ti mọ tẹlẹ pẹlu CDI. Ni apa keji, awọn olupilẹṣẹ orisun omi le lo Ifaagun Quarkus fun Orisun omi DI API lati ṣaṣeyọri ibamu pẹlu Orisun omi DI. Awọn apẹẹrẹ ti lilo awọn orisun omi DI API ti o ni atilẹyin ni a fun ni Tabili 2.

В ise agbese lati wa apẹẹrẹ Nlo mejeeji CDI ati Abẹrẹ Igbẹkẹle orisun omi. Fun alaye diẹ sii ati awọn apẹẹrẹ lori koko yii, wo itọsọna Quarkus ti a pe Orisun omi DI Itọsọna.

Table 2. Awọn apẹẹrẹ ti lilo orisun omi DI API ti o ni atilẹyin.

Atilẹyin Orisun omi DI Awọn ẹya ara ẹrọ
Awọn apẹẹrẹ

Abẹrẹ olupilẹṣẹ

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

Abẹrẹ aaye
Ti firanṣẹ laifọwọyi
iye

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Ewa
Iṣeto ni

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

paati

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

Ilana ayelujara

Awọn olumulo MicroProfile yoo nifẹ pe Quarkus ṣe atilẹyin JAX-RS, Onibara Isinmi MicroProfile, JSON-P, ati JSON-B gẹgẹbi awoṣe siseto wẹẹbu akọkọ. Awọn olupilẹṣẹ orisun omi yoo ni idunnu pẹlu atilẹyin aipẹ Quarkus fun API Oju opo wẹẹbu Orisun omi, ni pataki awọn atọkun REST. Iru si Orisun omi DI, ibi-afẹde akọkọ ti atilẹyin Oju opo wẹẹbu Orisun Orisun ni lati jẹ ki awọn olupilẹṣẹ Orisun omi lo awọn API Wẹẹbu Orisun ni apapọ pẹlu MicroProfile APIs. Awọn apẹẹrẹ ti bii o ṣe le lo awọn oju opo wẹẹbu orisun omi ti o ni atilẹyin ti pese ni Tabili 3, ati pe alaye diẹ sii ati awọn apẹẹrẹ lori koko yii ni a le rii ninu ikẹkọ Quarkus ti a pe Orisun Ayelujara Itọsọna.

Table 3. Awọn apẹẹrẹ ti lilo awọn atilẹyin orisun omi Wẹẹbù APIs.

Atilẹyin Orisun omi Awọn ẹya ara ẹrọ
Awọn apẹẹrẹ

@RestController
@RequestMapping

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

@Gba maapu
@PostMapping
@PutMapping
@ParẹMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@Ipo idahun
@ExceptionHandler
@RestControllerAdvice (apakan)

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

Orisun data JPA

Awọn olumulo MicroProfile yoo tun ni riri pe Quarkus ṣe atilẹyin JPA nipa lilo Hibernate ORM. Awọn iroyin ti o dara tun wa fun awọn olupilẹṣẹ Orisun omi: Quarkus ṣe atilẹyin awọn alaye orisun orisun omi JPA ti o wọpọ ati awọn iru. Awọn apẹẹrẹ ti lilo awọn atilẹyin orisun omi Data JPA API ni a fun ni Tabili 4.
В ise agbese lati wa apẹẹrẹ Awọn data orisun omi JPA API ti wa ni lilo ati pe alaye diẹ sii wa ninu ikẹkọ Quarkus ti a pe Orisun omi Data JPA Itọsọna.

Table 4. Awọn apẹẹrẹ ti lilo atilẹyin orisun omi Data JPA APIs.

Atilẹyin Orisun omi Data JPA Awọn ẹya ara ẹrọ
Awọn apẹẹrẹ

Ibi ipamọ Crud

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

Atunjade
JpaRepository
Ibi ipamọ PagingAndSorting

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Ajẹkù ibi ipamọ

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

Awọn ọna ibeere ti ari

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Awọn ibeere ti olumulo-telẹ

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

Awọn API MicroProfile

Ifarada aṣiṣe

Awọn igbelewọn ifarada aṣiṣe jẹ pataki pupọ fun idilọwọ awọn ikuna cascading ati ṣiṣẹda awọn faaji microservice ti o gbẹkẹle. Awọn olupilẹṣẹ orisun omi ti nlo awọn olufọpa Circuit fun ifarada ẹbi fun ọpọlọpọ ọdun. Hystrix. Sibẹsibẹ, Hystrix ko ti ni imudojuiwọn fun igba pipẹ, ṣugbọn Ifarada Ẹbi MicroProfile ti wa ni idagbasoke lọwọlọwọ ati pe o ni awọn ọdun pupọ ti lilo iṣelọpọ lẹhin rẹ. Nitorina, lati mu igbẹkẹle awọn iṣẹ ni Quarkus, o niyanju lati lo MicroProfile Fault Tolerance APIs, awọn apẹẹrẹ ti a lo ninu Table 5. Fun alaye diẹ sii lori eyi, wo Quarkus Afowoyi Aṣiṣe Ifarada Itọsọna.

Table 5. Awọn apẹẹrẹ ti lilo atilẹyin MicroProfile Fault Fault APIs.

Awọn ẹya Ifarada Fault MicroProfile
Apejuwe
Awọn apẹẹrẹ

@Asynchronous

Ṣiṣe awọn ilana kannaa ni okun lọtọ

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

@Bulkhead

Idiwọn nọmba awọn ibeere nigbakanna

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

@Opin Iyika monamona

Imudani ikuna Smart ati imularada lati awọn ikuna

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

@Fallback

Pipe yiyan kannaa ni irú ti ikuna

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

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

Tun gbiyanju bi

Tun gbiyanju lori ikuna ibeere

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

Duro na

Aago iṣakoso ikuna

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

Ṣiṣayẹwo awọn iṣẹ (Ilera Iṣẹ)

Awọn iru ẹrọ Kubernetes ṣe abojuto ilera ti awọn apoti nipa lilo awọn iṣẹ pataki. Lati gba aaye ipilẹ laaye lati ṣe atẹle awọn iṣẹ, awọn olupilẹṣẹ orisun omi nigbagbogbo lo aṣafihan HealthIndicator ati Orisun Boot Actuator. Ni Quarkus, eyi le ṣee ṣe nipa lilo MicroProfile Health, eyiti nipasẹ aiyipada ṣe ayẹwo igbesi aye, ṣugbọn o le tunto lati ṣayẹwo igbesi aye ati imurasilẹ ni nigbakannaa. Awọn apẹẹrẹ ti bii o ṣe le lo MicroProfile Health API ti o ni atilẹyin ni a pese ni Tabili 6, ati pe a pese alaye ni afikun ninu iwe afọwọkọ Quarkus Itọsọna Ilera.

Tabili 6: Awọn apẹẹrẹ lilo ti Awọn API Ilera MicroProfile ti atilẹyin.

MicroProfile Health awọn ẹya ara ẹrọ
Apejuwe
Awọn apẹẹrẹ

@Aye

Syeed atunbere kuna awọn ohun elo apoti
Opin Ipari:
ogun: 8080 / ilera / gbe

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

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

@ imurasilẹ

Syeed kii yoo firanṣẹ ijabọ si awọn ohun elo ti a fi sinu apoti ti ko ba ṣetan
Opin Ipari:
ogun: 8080 / ilera / setan

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

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

Awọn iwọn

Awọn ohun elo pese awọn metiriki fun boya awọn idi iṣiṣẹ (lati ṣe atẹle awọn iṣẹ SLAs) tabi awọn idi ti kii ṣe iṣẹ (SLAs iṣowo). Awọn olupilẹṣẹ orisun omi n pese awọn metiriki lilo orisun omi Boot Actuator ati Micrometer. Ni ọna, Quarkus nlo MicroProfile Metrics lati pese awọn metiriki ipilẹ (JVM ati ẹrọ ṣiṣe), awọn metiriki ataja (Quarkus), ati awọn metiriki ohun elo. MicroProfile Metrics nbeere wipe imuse ṣe atilẹyin JSON ati OpenMetrics (Prometheus) awọn ọna kika igbejade. Awọn apẹẹrẹ ti lilo MicroProfile Metrics API ni a fun ni Tabili 7.

В ise agbese lati wa apẹẹrẹ Awọn Metiriki MicroProfile ni a lo lati pese awọn metiriki ohun elo. Fun alaye diẹ sii, wo iwe afọwọkọ Quarkus Awọn iwọn Itọsọna.

Tabili 7. Awọn apẹẹrẹ ti lilo MicroProfile Metrics APIs.

MicroProfile Metrics Awọn ẹya ara ẹrọ
Apejuwe
Awọn apẹẹrẹ

@Ti a kà

Ntọka si counter counter ti o ka iye awọn akoko ti a ti pe ohun ti a ṣe alaye

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

@ConcurrentGauge

Ntọkasi wiwọn kan ti o ka nọmba awọn ipe nigbakanna si nkan ti a ṣe asọye

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

@Awon

Ntọkasi sensọ iwọn ti o wọn iye nkan ti a ṣe asọye

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

@Metered

Ṣe afihan sensọ mita kan ti o ṣe abojuto igbohunsafẹfẹ ipe ti nkan ti a ṣe asọye

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

ọkọọkan

Alaye ti o ni alaye ninu metadata nigba ti o ba gba ibeere kan lati tẹ tabi gbejade metiriki kan

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

Ti akoko

Tọkasi aago kan ti o tọpa iye akoko ohun ti a ṣe asọye

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

Metiriki Endpoints

Awọn metiriki ohun elo localhost: 8080 / metiriki / ohun elo
Awọn metiriki ipilẹ localhost: 8080 / metiriki / mimọ
Metiriki ataja localhost: 8080 / metiriki / ataja
Gbogbo awọn metiriki localhost:8080/metiriki

Onibara Isinmi MicroProfile

Awọn iṣẹ Microservice nigbagbogbo pese awọn aaye ipari RESTful ti o nilo awọn API alabara ti o baamu lati ṣiṣẹ pẹlu. Lati lo awọn aaye ipari RESTful, awọn olupilẹṣẹ orisun omi nigbagbogbo lo RestTemplate. Quarkus nfunni Awọn API Onibara Isinmi MicroProfile lati yanju iṣoro yii, awọn apẹẹrẹ lilo eyiti a fun ni Tabili 8.

В ise agbese lati wa apẹẹrẹ awọn lilo ti RESTful endpoints ti wa ni ṣe nipa lilo MicroProfile Isinmi Client. Alaye diẹ sii ati awọn apẹẹrẹ lori koko yii ni a le rii ninu iwe afọwọkọ Quarkus Itọsọna Client isinmi.

Table 8. Awọn apẹẹrẹ ti lilo MicroProfile Isinmi Client APIs.

MicroProfile Isinmi Client Awọn ẹya ara ẹrọ
Apejuwe
Awọn apẹẹrẹ

@RegisterRestClient

Ṣe iforukọsilẹ ni wiwo Java ti o tẹ bi alabara REST kan

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

@RestClient

Ṣe samisi imuse ti apẹẹrẹ ti wiwo alabara REST ti a tẹ

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

Ifawe

Npe aaye ipari REST kan

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

mp-isinmi / url

Ni pato aaye ipari REST

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

Awọn esi

Ninu bulọọgi yii, ti a pinnu ni akọkọ si awọn olupilẹṣẹ Orisun omi, a ṣe akiyesi ni iyara bi a ṣe le lo awọn API orisun omi pẹlu awọn API MicroProfile ni Quarkus lati ṣe agbekalẹ awọn iṣẹ microservices Java ati lẹhinna ṣajọ wọn sinu koodu alakomeji abinibi ti o fipamọ awọn ọgọọgọrun megabyte ti Ramu ati awọn ifilọlẹ ni ọrọ kan ti milliseconds.

Gẹgẹbi o ti loye tẹlẹ, alaye diẹ sii nipa atilẹyin fun Orisun omi ati MicroProfile APIs, ati ọpọlọpọ alaye to wulo miiran, ni a le rii ni Awọn iwe ilana Quarkus.

orisun: www.habr.com

Fi ọrọìwòye kun