Kuinka Quarkus yhdistää MicroProfilen ja Springin

Hei kaikille, tässä on Quarkus-sarjan kolmas postaus!

Kuinka Quarkus yhdistää MicroProfilen ja Springin

Java-mikropalveluita kehitettäessä usein uskotaan niin Eclipse MicroProfile и Jousikenkä ovat erilliset ja riippumattomat API:t. Oletuksena ohjelmoijat käyttävät yleensä API-liittymiä, joihin he ovat jo tottuneet, koska uusien puitteiden ja ajonaikaisten komponenttien oppiminen vie paljon aikaa. Tänään yritämme yksinkertaistaa joidenkin suosittujen kehitystä MicroProfile API kevään kehittäjille ja näyttää, kuinka voit käyttää samanaikaisesti Spring APIa ja uusia hyödyllisiä ominaisuuksia quarkus.

Hieman yksityiskohtaisemmin tarkastelemme ensin laajuutta ja yksityiskohtia siitä, kuinka Quarkus tukee Spring API:ita, jotta voimme näyttää Spring-kehittäjille, kuinka MicroProfile API:ta käytetään päivittäisessä työssään. Sitten käsittelemme MicroProfile-sovellusliittymiä, jotka ovat hyödyllisiä Spring-kehittäjille luodessaan mikropalveluita.

Miksi Quarkus? Ensinnäkin tämä on live-koodausta, eli MicroProfile API:n, Spring API:n ja muiden Java API:iden muutosten automaattista uudelleenlatausta, joka suoritetaan vain yhdellä komennolla: mvn quarkus:dev. Toiseksi, keskusteltiin esimerkissämme Person-palvelu (joka kääntää Spring-, MicroProfile- ja JPA-sovellusliittymistä binaariksi käyttämällä alkuperäistä GraalVM-kuvaa) käynnistyy vain 0.055 sekunnissa ja vie noin 90 Mt RAM-muistia (RSS) RESTful-sovelluksen päätepisteessä. Lisäksi itse sen käännös suoritetaan vain yhdellä komennolla: mvn package -Pnative.

Emme mene yksityiskohtiin MicroProfilesta, paitsi auttaaksemme Spring-kehittäjiä ymmärtämään, kuinka he voivat käyttää Spring-sovellusliittymiä MicroProfile-sovellusliittymien kanssa Quarkuksessa.

Kontit ja Kubernetes

Jotta tämä artikkeli olisi yksinkertainen, käsittelemme tässä vain tuen korkean tason näkökohdat. Kubernetes, koska se on tärkeää ymmärtää. Quarkus on sijoitettu Kubernetesin Java-pinoksi, ja se on suunniteltu minimoimaan Java-sovellusten ja -palveluiden muistin kulutus ja käynnistysaika, mikä lisää niiden tiheyttä isännässä ja alentaa kokonaiskustannuksia.

Quarkus myös tukee automaattista generointia Kubernetesin resurssit ja tarjoukset oppaita käyttöön Kubernetes- ja Red Hat OpenShift-alustoilla. Lisäksi Quarkus luo automaattisesti säilöjen luomiseen tarvittavat Dockerfile.jvm- (JVM-pakkaus)- ja Dockerfile.native-tiedostot (natiivi binääripakkaus).

Lopuksi, keskittymällä Kubernetesiin kohdekäyttöönottoympäristönä, Quarkus ei käytä Java-kehyksiä tapauksissa, joissa samanlainen toiminnallisuus on toteutettu itse Kubernetes-alustan tasolla. Taulukossa 1 on kartta toiminnallisesta vastaavuudesta Kubernetesin ja tyypillisten Spring-kehittäjien käyttämien Java-kehysten välillä.

Taulukko 1. Kartta toiminnallisesta vastaavuudesta Java-kehysten ja Kubernetesin välillä.

toiminnallinen
Perinteinen kevätkenkä
Kubernetes

Palvelun löytäminen
Eureka
DNS

Konfigurointi
Spring Cloud Config
Määritä kartat/salaisuudet

Kuormituksen tasapainoittaminen
Nauha (asiakaspuoli)
Palvelu, replikointiohjain (palvelinpuoli)

Koodin kääntäminen ja suorittaminen esimerkistä

Tässä artikkelissa viittaamme esimerkkiprojekti, jossa Spring- ja MicroProfile-sovellusliittymiä ja jopa samaa Java-luokkaa käytetään yhdessä. Tämän esimerkin koodi voidaan kääntää ja ajaa komentoriviltä. Katso lisätietoja README.md-tiedostosta.

Spring Framework API:t

Riippuvuusinjektio

Quarkus tukee useita Contexts and Dependency Injection (CDI) API:t ja Spring Dependency Injection (Spring DI) -sovellusliittymät. Jos työskentelet MicroProfilen kanssa, Java EE ja Jakarta EE, tunnet CDI:n jo hyvin. Toisaalta Spring-kehittäjät voivat käyttää Quarkus Extension for Spring DI -sovellusliittymää saavuttaakseen yhteensopivuuden Spring DI:n kanssa. Taulukossa 2 on esimerkkejä tuettujen Spring DI -sovellusliittymien käytöstä.

В projekti esimerkistämme Käyttää sekä CDI- että Spring Dependency Injectionia. Lisätietoja ja esimerkkejä tästä aiheesta löytyy Quarkus-oppaasta nimeltä Kevät DI opas.

Taulukko 2. Esimerkkejä tuettujen Spring DI -sovellusliittymien käytöstä.

Tuetut Spring DI -ominaisuudet
Примеры

Rakentajan ruiskutus

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

Kenttäinjektio
Automaattinen langallinen
Arvo

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Papu
@Kokoonpano

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

komponentti

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

Palvelu

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

   public String getPrefix() {
      return message;
   }
}

Web-kehys

MicroProfile-käyttäjät pitävät siitä, että Quarkus tukee JAX-RS:ää, MicroProfile Rest Clientiä, JSON-P:tä ja JSON-B:tä ensisijaisena web-ohjelmointimallina. Kevään kehittäjät ovat tyytyväisiä Quarkuksen viimeaikaiseen tukeen Spring Web API:lle, erityisesti REST-rajapinnoille. Spring DI:n tapaan Spring Web API -tuen päätavoite on antaa Spring-kehittäjille mahdollisuus käyttää Spring Web API:ita yhdessä MicroProfile API:iden kanssa. Esimerkkejä tuettujen Spring Web API:iden käytöstä on taulukossa 3, ja lisätietoja ja esimerkkejä tästä aiheesta löytyy Quarkus-opetusohjelmasta nimeltä Kevään verkkoopas.

Taulukko 3. Esimerkkejä tuettujen Spring Web API:iden käytöstä.

Tuetut kevään verkkoominaisuudet
Примеры

@RestController
@RequestMapping

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

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

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

Kevään tietojen yhteinen edustajakokous

MicroProfile-käyttäjät arvostavat myös sitä, että Quarkus tukee JPA:ta käyttämällä Hibernate ORM:ää. Myös Spring-kehittäjille on hyviä uutisia: Quarkus tukee yleisiä Spring Data JPA -merkintöjä ja tyyppejä. Taulukossa 4 on esimerkkejä tuettujen Spring Data JPA -sovellusliittymien käytöstä.
В projekti esimerkistämme Spring Data JPA API:ita käytetään ja lisätietoja on saatavilla Quarkus-opetusohjelmassa nimeltä Spring Data JPA:n opas.

Taulukko 4. Esimerkkejä tuettujen Spring Data JPA -sovellusliittymien käytöstä.

Tuetut Spring Data JPA -ominaisuudet
Примеры

CrudRepository

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

säilytyspaikka
JpaArkisto
PagingAndSorting Repository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Arkiston fragmentit

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

Johdetut kyselymenetelmät

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Käyttäjän määrittämät kyselyt

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:t

Vikasietoisuus

Vikasietorakenteet ovat erittäin tärkeitä peräkkäisten vikojen estämisessä ja luotettavien mikropalveluarkkitehtuurien luomisessa. Kevätkehittäjät ovat käyttäneet katkaisijoita vikasietoisuuteen useiden vuosien ajan. Hystrix. Hystrixiä ei kuitenkaan ole päivitetty pitkään aikaan, mutta MicroProfilen vikasietoisuus kehittyy nyt aktiivisesti ja takana on useiden vuosien tuotantokäyttö. Siksi Quarkuksen palveluiden luotettavuuden parantamiseksi on suositeltavaa käyttää MicroProfile Fault Tolerance API:ita, joista on esimerkkejä taulukossa 5. Lisätietoja tästä on Quarkuksen käsikirjassa. Viansietoopas.

Taulukko 5. Esimerkkejä tuettujen MicroProfile Fault Tolerance API:iden käytöstä.

Mikroprofiilin vikasietoominaisuudet
Kuvaus
Примеры

@Asynkroninen

Logiikan suorittaminen erillisessä säikeessä

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

@Bulkhead

Samanaikaisten pyyntöjen määrän rajoittaminen

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

@CircuitBreaker

Älykäs vikojen käsittely ja vioista toipuminen

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

@Perääntyä

Vaihtoehtoisen logiikan kutsuminen epäonnistumisen sattuessa

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

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

Yritä uudelleen

Yritä uudelleen, jos pyyntö epäonnistuu

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

Timeout

Vianhallinnan aikakatkaisu

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

Tarkastuspalvelut (palvelun kunto)

Kubernetes-alustat seuraavat konttien kuntoa erikoispalveluiden avulla. Jotta taustalla oleva alusta voi valvoa palveluita, Spring-kehittäjät käyttävät yleensä mukautettua HealthIndicatoria ja Spring Boot Actuator -laitetta. Quarkuksessa tämä voidaan tehdä MicroProfile Health -ohjelmalla, joka oletuksena suorittaa elävyyden tarkistuksen, mutta voidaan määrittää tarkastamaan samanaikaisesti elävyys ja valmius. Esimerkkejä tuettujen MicroProfile Health API -sovellusliittymien käytöstä on taulukossa 6, ja lisätietoja on Quarkus-oppaassa. Terveysopas.

Taulukko 6: Esimerkkejä tuettujen MicroProfile Health API -sovellusliittymien käytöstä.

MicroProfile Health -ominaisuudet
Kuvaus
Примеры

@Elävyys

Alusta käynnistää uudelleen epäonnistuneet konttisovellukset
Endpoint:
isäntä: 8080/terveys/live

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

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

@Valmius

Alusta ei lähetä liikennettä konttisovelluksiin, jos se ei ole valmis
Endpoint:
isäntä: 8080/terveys/valmis

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

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

Mittarit

Sovellukset tarjoavat mittareita joko toiminnallisiin tarkoituksiin (suorituskykytason SLA-sopimusten seuranta) tai ei-toiminnallisiin tarkoituksiin (liiketoiminnan palvelutasosopimukset). Jousikehittäjät tarjoavat mittareita Spring Boot Actuatorin ja Micrometerin avulla. Quarkus puolestaan ​​käyttää MicroProfile-metriikkaa tarjotakseen perusmittareita (JVM ja käyttöjärjestelmä), toimittajamittareita (Quarkus) ja sovellusmittareita. MicroProfile Metrics edellyttää, että toteutus tukee JSON- ja OpenMetrics (Prometheus) -tulostusmuotoja. Esimerkkejä MicroProfile Metrics API:n käytöstä on taulukossa 7.

В projekti esimerkistämme MicroProfile Metrics -mittareita käytetään sovellusmittareiden tarjoamiseen. Katso lisätietoja Quarkuksen käsikirjasta Mittareiden opas.

Taulukko 7. Esimerkkejä MicroProfile Metrics -sovellusliittymien käytöstä.

MicroProfile Metrics -ominaisuudet
Kuvaus
Примеры

@laskettu

Tarkoittaa laskuria, joka laskee, kuinka monta kertaa huomautettua objektia on kutsuttu

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

@ConcurrentGauge

Tarkoittaa mittaria, joka laskee samanaikaisten kutsujen määrän huomautuksella varustettuun objektiin

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

@Arvioida

Tarkoittaa mittarianturia, joka mittaa kommentoidun kohteen arvon

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

@ Mitattu

Tarkoittaa mittarianturia, joka tarkkailee kommentoidun kohteen soittotaajuutta

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

metrinen

Huomautus, joka sisältää tietoja metatiedoista, kun vastaanotetaan pyyntö mittarin syöttämiseksi tai tuottamiseksi

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

ajastettu

Ilmaisee ajastinta, joka seuraa kommentoidun objektin kestoa

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

Mittarien päätepisteet

Sovellusmittarit localhost:8080/metrics/sovellus
Perusmittarit localhost:8080/metriikka/kanta
Toimittajan mittarit localhost:8080/mittarit/toimittaja
Kaikki mittarit localhost:8080/metrit

MicroProfile Rest Client

Mikropalvelut tarjoavat usein RESTful-päätepisteitä, jotka vaativat vastaavia asiakassovellusliittymiä toimiakseen. RESTful-päätepisteiden käyttämiseksi Spring-kehittäjät käyttävät yleensä RestTemplatea. Quarkus tarjoaa MicroProfile Rest Client -sovellusliittymiä tämän ongelman ratkaisemiseksi, joiden käyttöesimerkkejä on taulukossa 8.

В projekti esimerkistämme RESTful-päätepisteiden käyttö tapahtuu MicroProfile Rest Client -sovelluksella. Lisätietoja ja esimerkkejä tästä aiheesta löytyy Quarkus-käsikirjasta Rest asiakasopas.

Taulukko 8. Esimerkkejä MicroProfile Rest Client -sovellusliittymien käytöstä.

MicroProfile Rest Client -ominaisuudet
Kuvaus
Примеры

@RegisterRestClient

Rekisteröi kirjoitetun Java-rajapinnan REST-asiakkaaksi

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

@RestClient

Merkitsee kirjoitetun REST-asiakasliittymän ilmentymän toteutuksen

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

rukous

Kutsuu REST-päätepistettä

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

mp-rest/url

Määrittää REST-päätepisteen

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

Tulokset

Tässä ensisijaisesti Spring-kehittäjille suunnatussa blogissa tarkastelimme nopeasti, kuinka Spring-sovellusliittymiä käytetään Quarkuksen MicroProfile-sovellusliittymien kanssa Java-mikropalveluiden kehittämiseen ja niiden kääntämiseen alkuperäiseksi binäärikoodiksi, joka säästää satoja megatavuja RAM-muistia ja käynnistyy millisekuntien kysymys.

Kuten jo ymmärsit, lisätietoja Spring- ja MicroProfile-sovellusliittymien tuesta sekä paljon muuta hyödyllistä tietoa löytyy osoitteesta Quarkuksen käsikirjat.

Lähde: will.com

Lisää kommentti