Kako Quarkus združuje MicroProfile in Spring

Pozdravljeni vsi, tukaj je tretja objava v seriji Quarkus!

Kako Quarkus združuje MicroProfile in Spring

Pri razvoju mikrostoritev Java se pogosto verjame, da Eclipse mikroprofil и Pomladni čevelj so ločeni in neodvisni API-ji. Programerji privzeto uporabljajo API-je, ki so jih že vajeni, saj učenje novih ogrodij in komponent izvajalnega okolja vzame veliko časa. Danes bomo poskušali poenostaviti razvoj nekaterih priljubljenih MicroProfile API za razvijalce Spring in vam pokaže, kako hkrati uporabljati Spring API in nove uporabne funkcije quarkus.

Malo bolj podrobno si bomo najprej ogledali obseg in podrobnosti o tem, kako Quarkus podpira API-je Spring, da bi razvijalcem Spring pokazali, kako uporabljati API MicroProfile pri vsakodnevnem delu. Nato bomo obravnavali API-je MicroProfile, ki so uporabni za razvijalce Spring pri ustvarjanju mikrostoritev.

Zakaj Quarkus? Prvič, to je kodiranje v živo, torej samodejno ponovno nalaganje morebitnih sprememb v MicroProfile API, Spring API in drugih Java API-jih, ki se izvede z enim samim ukazom: mvn quarkus:dev. Drugič, upoštevano v v našem primeru storitev Person (ki prevede iz API-jev Spring, MicroProfile in JPA v binarno datoteko z uporabo izvirne slike GraalVM) se zažene v samo 0.055 sekunde in zavzame približno 90 MB RAM-a (RSS) na končni točki aplikacije RESTful. Poleg tega se samo prevajanje izvaja z enim samim ukazom: mvn package -Pnative.

Ne bomo se spuščali v podrobnosti o MicroProfile, razen da bi razvijalcem Spring pomagali razumeti, kako lahko uporabljajo API-je Spring z API-ji MicroProfile v Quarkusu.

Vsebniki in Kubernetes

Da bo ta članek preprost, bomo tukaj obravnavali le vidike podpore na visoki ravni. Kubernetes, ker je pomembno razumeti. Quarkus je postavljen kot sklad Java za Kubernetes, zasnovan je tako, da zmanjša porabo pomnilnika in čas zagona aplikacij in storitev Java ter posledično poveča njihovo gostoto na gostitelju in zmanjša skupne stroške.

Quarkus tudi podpira samodejno generiranje Viri in ponudbe Kubernetes vodniki za uvajanje na platformah Kubernetes in Red Hat OpenShift. Poleg tega Quarkus samodejno ustvari datoteki Dockerfile.jvm (pakiranje JVM) in Dockerfile.native (izvorno binarno pakiranje), potrebni za ustvarjanje vsebnikov.

Nazadnje, z osredotočanjem na Kubernetes kot ciljno okolje za uvajanje, Quarkus ne uporablja ogrodij Java v primerih, ko je podobna funkcionalnost implementirana na ravni same platforme Kubernetes. Tabela 1 prikazuje zemljevid funkcionalne korespondence med Kubernetesom in tipičnimi ogrodji Java, ki jih uporabljajo razvijalci Spring.

Tabela 1. Zemljevid funkcionalnega ujemanja med ogrodji Java in Kubernetes.

Funkcionalna
Tradicionalni spomladanski škorenj
Kubernetes

Odkrivanje storitve
Eureka
DNS

konfiguracija
Spring Cloud Config
Konfiguriraj zemljevide/skrivnosti

Izravnava obremenitve
Trak (stran odjemalca)
Storitev, Replikacijski krmilnik (strežniška stran)

Prevajanje in izvajanje kode iz primera

V tem članku se sklicujemo na primer projekta, kjer se API-ji Spring in MicroProfile ter celo isti razred Java uporabljajo skupaj. Kodo v tem primeru je mogoče prevesti in zagnati iz ukazne vrstice, za podrobnosti glejte datoteko README.md.

API-ji Spring Framework

Vbrizgavanje odvisnosti

Quarkus podpira vrsto API-ji za kontekste in vstavljanje odvisnosti (CDI). in API-ji Spring Dependency Injection (Spring DI). Če delate z MicroProfile, Java EE in Jakarta EE, potem že dobro poznate CDI. Po drugi strani pa lahko razvijalci Spring uporabljajo razširitev Quarkus za API Spring DI, da dosežejo združljivost s Spring DI. Primeri uporabe podprtih API-jev Spring DI so podani v tabeli 2.

В projekt iz našega primera Uporablja tako CDI kot Spring Dependency Injection. Za več informacij in primere o tej temi glejte vodnik Quarkus, imenovan Pomladni vodnik DI.

Tabela 2. Primeri uporabe podprtih API-jev Spring DI.

Podprte funkcije Spring DI
Primeri

Vbrizgavanje konstruktorja

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

Vbrizgavanje na terenu
Samodejno ožičeno
vrednost

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@ Konfiguracija

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

Sestavina

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

Spletno ogrodje

Uporabnikom MicroProfile bo všeč, da Quarkus podpira JAX-RS, MicroProfile Rest Client, JSON-P in JSON-B kot primarni model spletnega programiranja. Spring razvijalci bodo zadovoljni z nedavno podporo Quarkusa za Spring Web API, zlasti vmesnike REST. Podobno kot pri Spring DI je glavni cilj podpore za Spring Web API razvijalcem Spring omogočiti uporabo Spring Web API-jev v povezavi z API-ji MicroProfile. Primeri uporabe podprtih Spring Web API-jev so navedeni v tabeli 3, več informacij in primerov o tej temi pa lahko najdete v vadnici Quarkus, imenovani Pomladni spletni vodnik.

Tabela 3. Primeri uporabe podprtih Spring Web API-jev.

Podprte spletne funkcije Spring
Primeri

@RestController
@RequestMapping

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

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

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

Pomladni podatki JPA

Uporabniki MicroProfile bodo prav tako cenili, da Quarkus podpira JPA z uporabo Hibernate ORM. Obstaja tudi dobra novica za razvijalce Spring: Quarkus podpira običajne opombe in vrste Spring Data JPA. Primeri uporabe podprtih API-jev Spring Data JPA so podani v tabeli 4.
В projekt iz našega primera Uporabljajo se API-ji Spring Data JPA, več informacij pa je na voljo v imenovani vadnici Quarkus Spring Data JPA Guide.

Tabela 4. Primeri uporabe podprtih API-jev Spring Data JPA.

Podprte funkcije Spring Data JPA
Primeri

CrudRepository

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

Repozitorij
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragmenti skladišča

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

Izpeljane poizvedovalne metode

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Uporabniško določene poizvedbe

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

API-ji MicroProfile

Toleranca napak

Konstrukti tolerance napak so zelo pomembni za preprečevanje kaskadnih okvar in ustvarjanje zanesljivih arhitektur mikrostoritev. Razvijalci vzmeti že vrsto let uporabljajo odklopnike za odpornost na napake. Hystrix. Vendar Hystrix že dolgo ni bil posodobljen, vendar se MicroProfile's Fault Tolerance zdaj aktivno razvija in ima za sabo več let proizvodne uporabe. Zato je za izboljšanje zanesljivosti storitev v Quarkusu priporočljiva uporaba API-jev MicroProfile Fault Tolerance, katerih primeri so uporabljeni v tabeli 5. Za več informacij o tem glejte priročnik Quarkus Vodnik za toleranco napak.

Tabela 5. Primeri uporabe podprtih API-jev MicroProfile Fault Tolerance.

Funkcije tolerance napak MicroProfile
Opis
Primeri

@Asinhrono

Izvajanje logike v ločeni niti

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

@Pregrada

Omejite število hkratnih zahtev

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

@Varovalka

Pametno ravnanje z okvarami in okrevanje po okvarah

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

@Pasti nazaj

Klicanje alternativne logike v primeru okvare

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

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

Poskusite znova

Poskusi znova ob neuspešni zahtevi

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

Timeout

Časovna omejitev nadzora napake

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

Preverjanje storitev (Service Health)

Platforme Kubernetes spremljajo zdravje vsebnikov s pomočjo posebnih storitev. Da bi osnovni platformi omogočili spremljanje storitev, razvijalci Spring običajno uporabljajo HealthIndicator po meri in Spring Boot Actuator. V Quarkusu je to mogoče storiti z uporabo MicroProfile Health, ki privzeto izvede preverjanje stanja delovanja, vendar ga je mogoče konfigurirati tako, da istočasno preverja stanje delovanja in pripravljenost. Primeri uporabe podprtih API-jev MicroProfile Health so navedeni v tabeli 6, dodatne informacije pa so na voljo v priročniku Quarkus Zdravstveni vodnik.

Tabela 6: Primeri uporabe podprtih API-jev MicroProfile Health.

Funkcije MicroProfile Health
Opis
Primeri

@Živost

Platforma znova zažene neuspele kontejnerske aplikacije
Končna točka:
gostitelj:8080/health/live

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

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

@Pripravljenost

Platforma ne bo pošiljala prometa aplikacijam v kontejnerjih, če ni pripravljena
Končna točka:
gostitelj:8080/zdravje/pripravljen

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

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

Metrike

Aplikacije zagotavljajo metrike bodisi za operativne namene (za spremljanje zmogljivosti SLA) ali neoperativne namene (poslovne SLA). Razvijalci pomladi zagotavljajo meritve z uporabo pomladnega zagonskega aktuatorja in mikrometra. Quarkus pa uporablja metrike MicroProfile za zagotavljanje osnovnih metrik (JVM in operacijski sistem), metrik prodajalca (Quarkus) in metrik aplikacij. MicroProfile Metrics zahteva, da izvedba podpira izhodne formate JSON in OpenMetrics (Prometheus). Primeri uporabe API-ja MicroProfile Metrics so podani v tabeli 7.

В projekt iz našega primera Meritve MicroProfile se uporabljajo za zagotavljanje metrik aplikacij. Za več informacij si oglejte priročnik Quarkus Vodnik po meritvah.

Tabela 7. Primeri uporabe API-jev MicroProfile Metrics.

Funkcije meritev mikroprofila
Opis
Primeri

@Prešteto

Označuje števec števca, ki šteje, kolikokrat je bil klican označen objekt

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

@ConcurrentGauge

Označuje merilnik, ki šteje število sočasnih klicev označenemu objektu

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

@Merilec

Označuje merilni senzor, ki meri vrednost označenega predmeta

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

@Metered

Označuje senzor merilnika, ki spremlja frekvenco klica označenega predmeta

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

Metric

Opomba, ki vsebuje informacije o metapodatkih, ko prejmete zahtevo za vnos ali izdelavo metrike

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

Časovno

Označuje časovnik, ki sledi trajanju označenega predmeta

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

Končne točke meritev

Meritve aplikacije localhost:8080/metrics/aplikacija
Osnovne metrike localhost:8080/metrika/osnova
Meritve prodajalca localhost:8080/metrics/vendor
Vse meritve localhost:8080/metrics

MicroProfile Rest Client

Mikrostoritve pogosto zagotavljajo končne točke RESTful, ki za delo zahtevajo ustrezne odjemalske API-je. Za uporabo končnih točk RESTful razvijalci Spring običajno uporabljajo RestTemplate. Quarkus ponuja API-je MicroProfile Rest Client za rešitev te težave, katerih primeri uporabe so podani v tabeli 8.

В projekt iz našega primera uporaba končnih točk RESTful poteka z odjemalcem MicroProfile Rest Client. Več informacij in primerov na to temo najdete v priročniku Quarkus Rest Client Guide.

Tabela 8. Primeri uporabe API-jev MicroProfile Rest Client.

Funkcije odjemalca MicroProfile Rest
Opis
Primeri

@RegisterRestClient

Registrira tipiziran vmesnik Java kot odjemalca REST

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

@RestClient

Označuje izvedbo primerka tipiziranega odjemalskega vmesnika REST

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

Invokacija

Pokliče končno točko REST

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

mp-rest/url

Podaja končno točko REST

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

Rezultati

V tem spletnem dnevniku, namenjenem predvsem razvijalcem Spring, smo si na hitro ogledali, kako uporabiti API-je Spring z API-ji MicroProfile v Quarkusu za razvoj mikrostoritev Java in jih nato prevesti v izvorno binarno kodo, ki prihrani na stotine megabajtov RAM-a in se zažene v stvar milisekund.

Kot ste že razumeli, lahko več informacij o podpori za API-je Spring in MicroProfile ter veliko drugih koristnih informacij najdete v Quarkus priročniki.

Vir: www.habr.com

Dodaj komentar