Kako Quarkus povezuje MicroProfile in Spring

Pozdravljeni vsi, to je tretji prispevek v seriji o Quarkusu!

Kako Quarkus povezuje MicroProfile in Spring

Pri razvijanju Java mikroservisov se pogosto smatra, da Eclipse MicroProfile in Spring Boot – to so ločeni in neodvisni API-ji. Običajno programerji uporabljajo tiste API-je, ki so jim znani, saj učenje novih ogrodij in komponent za izvajanje zahteva veliko časa. Danes bomo poskusili poenostaviti usvajanje nekaterih priljubljenih MicroProfile API-jev za Spring razvijalce in pokazali, kako hkrati uporabiti Spring API in nove uporabne možnosti. Quarkus.

Če nekoliko podrobneje, bomo najprej obravnavali področje uporabe in podrobnosti o tem, kako Quarkus podpira Spring API-je, da bomo pokazali Spring razvijalcem, kako lahko uporabljajo MicroProfile API v svojem vsakdanjem delu. Potem bomo predstavili MicroProfile API-je, ki bodo koristni Spring razvijalcem pri ustvarjanju mikroservisov.

Zakaj prav Quarkus? Prvič, to je live coding, torej samodejno ponovno nalaganje vseh sprememb v MicroProfile API-jih, Spring API-jih in drugih Java API-jih, kar se izvede z eno samo ukazom: mvn quarkus:dev. Drugič, obravnavamo naš primer storitev Person (ta se sestavi iz Spring, MicroProfile in JPA API-jev v binarno datoteko z uporabo nativne slike GraalVM) se zažene v samo 0,055 sekunde in zasede približno 90 MB pomnilnika (RSS) na končni točki RESTful aplikacije. Njena kompilacija pa se izvede z eno samo ukazom: mvn package -Pnative.

Ne bomo se poglabljali v podrobnosti MicroProfile, ampak se bomo trudili, da pomagamo Spring razvijalcem razumeti, kako uporabiti Spring API-je skupaj z MicroProfile API-ji v Quarkusu.

Kontejnerji in Kubernetes

Da ne bi preobremenili tega članka, bomo tukaj obravnavali le višje ravni vidike podpore Kubernetes, saj je to pomembno razumeti. Quarkus se pozicionira kot Java kup za Kubernetes, ki minimizira porabo pomnilnika in čas zagona Java aplikacij in storitev, hkrati pa povečuje gostoto njihovega nameščanja na gostitelju in zmanjšuje skupne stroške.

Quarkus prav tako podpira samodejno generiranje Kubernetes virov in ponuja navodila za uvajanje na platformah Kubernetes in Red Hat OpenShift. Poleg tega Quarkus samodejno generira datoteke Dockerfile.jvm (JVM pakiranje) in Dockerfile.native (pakiranje nativne binarne slike), potrebne za ustvarjanje kontejnerjev.

In conclusion, focusing on Kubernetes as the target deployment environment, Quarkus does not use Java frameworks in cases where similar functionality is implemented at the Kubernetes platform level itself. Table 1 presents a functional mapping of Kubernetes and typical Java frameworks used by Spring developers.

Table 1. Functional mapping of Java frameworks and Kubernetes.

Functionality
Traditional Spring Boot
Kubernetes

Service discovery
Eureka
DNS

Konfiguracija
Spring Cloud Config
Config Maps / Secrets

Porazdelitev obremenitve
Ribbon (client-side)
Service, Replication Controller (server-side)

Compiling and running the example code

In this article, we refer to the example project, where the Spring and MicroProfile APIs are used together and even that very Java class. The code from this example can be compiled and run from the command line; see the README.md file for more details.

Spring Framework APIs

Dependency Injection

Quarkus supports a wide range of Contexts and Dependency Injection (CDI) APIs and Spring Dependency Injection (Spring DI) APIs. If you are working with MicroProfile, Java EE and Jakarta EE, you are already well acquainted with CDI. On the other hand, Spring developers can use the Quarkus Extension for Spring DI API to ensure compatibility with Spring DI. Examples of using supported Spring DI APIs are provided in Table 2.

V the project from our example uses both CDI and Spring Dependency Injection. More information and examples on this topic can be found in the Quarkus guide called Spring DI Guide.

Table 2. Examples of using supported Spring DI APIs.

Supported features of Spring DI
Primeri

Constructor Injection

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

Field Injection
Autowired
Vrednost

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Configuration

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

Component

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

Storitev

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

   public String getPrefix() {
      return message;
   }
}

Web framework

Uporabnikom MicroProfile bo všeč, da Quarkus podpira JAX-RS, MicroProfile Rest Client, JSON-P in JSON-B kot osnovni model za spletno programiranje. Razvijalce v Springu bo razveselila nedavno dodana podpora Quarkusa za Spring Web API, zlasti za vmesnike, ki skrbijo za REST. Po analogiji s Spring DI je glavni cilj podpore Spring Web API omogočiti razvijalcem Springa, da uporabljajo API vmesnike Spring Web skupaj z API vmesniki MicroProfile. Primeri uporabe podprtih Spring Web API so navedeni v tabeli 3, dodatne informacije in primeri pa so na voljo v vodniku Quarkus, ki nosi naziv Spring Web Guide.

Tabela 3. Primeri uporabe podprtih API vmesnikov Spring Web.

Podprte funkcionalnosti Spring Web
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) {
   ...
   ...
   ...
}

Spring Data JPA

Uporabnikom MicroProfile bo prav tako ustrezala podpora Quarkusa za JPA z uporabo Hibernate ORM. Za razvijalce Springa je dobra novica, da Quarkus podpira splošno sprejete anotacije in tipe Spring Data JPA. Primeri uporabe podprtih API vmesnikov Spring Data JPA so navedeni v tabeli 4.
V the project from our example uporabljajo se API vmesniki Spring Data JPA, dodatne informacije pa so na voljo v vodniku Quarkus z naslovom Spring Data JPA Guide.

Tabela 4. Primeri uporabe podprtih API vmesnikov Spring Data JPA.

Podprte funkcionalnosti Spring Data JPA
Primeri

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 {
   ...
}

Derived query methods

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

User-defined queries

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 vmesniki MicroProfile

Odporna na napake (Fault tolerance)

Konstrukcije odpornosti na greške so zelo pomembne za preprečevanje kaskadnih napak in za ustvarjanje zanesljivih mikroservisnih arhitektur. Razvijalci Spring že leta uporabljajo circuit-breakerje za odpornost na napake. Hystrix. Hystrix pa že dolgo ni bil posodobljen, medtem ko se microProfile-ov Fault Tolerance trenutno aktivno razvija in ima že več let izkušenj z uporabami v produkciji. Zato se za povečanje zanesljivosti storitev v Quarkusu priporoča uporaba API vmesnikov MicroProfile Fault Tolerance, katerih primere uporabe najdete v tabeli 5. Dodatne informacije so na voljo v vodniku Quarkus. Vodnik za odpornost na napake.

Tabela 5. Primeri uporabe podprtih API vmesnikov MicroProfile Fault Tolerance.

Funkcije MicroProfile Fault Tolerance
Opis
Primeri

@Asynchronous

Izvajanje logike v ločenem niti

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

@Bulkhead

Omejevanje števila hkratnih zahtevkov

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

@CircuitBreaker

Pametno obvladovanje napak in obnova po napakah

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

@Fallback

Klic alternativne logike v primeru napake

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

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

Retry

Ponovni poskus pri napaki zahtevka

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

Timeout

Nadzor časa čakanja pri napaki

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

Preverjanje storitev (Health Service)

Platforme Kubernetes spremljajo delovanje kontejnerjev z uporabo posebnih storitev. Da bi spodnja platforma lahko spremljala storitve, razvijalci Spring običajno uporabljajo prilagodljive HealthIndicator in Spring Boot Actuator. V Quarkusu to lahko storite z MicroProfile Health, ki privzeto izvaja nadzor življenjske sposobnosti (liveness check), vendar jih lahko nastavite tudi na hkratno preverjanje poslušnosti in pripravljenosti (readiness). Primeri uporabe podprtih API MicroProfile Health so navedeni v tabeli 6, dodatne informacije pa so predstavljene v vodniku Quarkus. Vodnik za zdravje.

Tabela 6. Primeri uporabe podprtih API vmesnikov MicroProfile Health.

Funkcije MicroProfile Health
Opis
Primeri

@Liveness

Platforma izvede ponovno nalaganje okvarjenih kontejneriziranih aplikacij.
Endpoint:
host:8080/health/live

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

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

@Readiness

Plattform ne bo usmerjala prometa na kontejnerizirane aplikacije, če niso pripravljene
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();  
}

Metrike

Aplikacije zagotavljajo metrike bodisi v operativne namene (za spremljanje KPI-jev zmogljivosti SLA) bodisi v neoperativne (poslovne KPI-jev SLA). Razvijalci v Springu zagotavljajo metrike prek Spring Boot Actuator in Micrometer. Quarkus uporablja MicroProfile Metrics za zagotavljanje osnovnih metrik (JVM in operacijski sistem), metrik dobavitelja (Quarkus) in metrik aplikacij. MicroProfile Metrics zahteva, da implementacija podpira izhodne formate JSON in OpenMetrics (Prometheus). Primeri uporabe MicroProfile Metrics API so prikazani v Tabeli 7.

V the project from our example MicroProfile Metrics se uporablja za zagotavljanje metrik aplikacij. Dodatne informacije lahko najdete v priročniku Quarkus Vodnik po metrikah.

Tabela 7. Primeri uporabe API-jev MicroProfile Metrics.

Funkcije MicroProfile Metrics
Opis
Primeri

@Counted

Označuje število, ki šteje število klicev annotiranega objekta

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

@ConcurrentGauge

Označuje gauge-senzor, ki šteje število hkratnih klicev annotiranega objekta

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

@Gauge

Označuje gauge-senzor, ki meri vrednost annotiranega objekta

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

@Metered

Označuje meter-senzor, ki spremlja frekvenco klicev annotiranega objekta

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

Metrika

Annotacija, ki vsebuje informacije o metapodatkih ob prejemu zahteve za dodajanje ali dokončanje metrike

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

Merjeno

Označuje časomer, ki spremlja trajanje annotiranega objekta

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

Merilne točke (Metrics Endpoints)

Merila aplikacij localhost:8080/metrics/application
Osnovna merila localhost:8080/metrics/base
Merila dobavitelja localhost:8080/metrics/vendor
Vsa merila localhost:8080/metrics

Rest-strank MicroProfile

Mikroservisi pogosto nudijo RESTful končne točke, za katere so potrebni ustrezni API-ji strank. Za delo s RESTful končnimi točkami Spring razvijalci običajno uporabljajo RestTemplate. Quarkus pa ponuja za ta namen API-čke MicroProfile Rest Client, katerih primere uporabe najdete v tabeli 8.

V the project from our example Uporaba RESTful končnih točk se izvaja s pomočjo MicroProfile Rest Client. Dodatne informacije in primeri so na voljo v Quarkus priročniku. Priročnik o Rest Client.

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

Funkcije MicroProfile Rest Client
Opis
Primeri

@RegisterRestClient

Registrira tipizirani Java vmesnik kot REST klienta.

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

@RestClient

Ozmarka vstavitve primerka tipiziranega vmesnika REST klienta.

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

Klic

Kliče REST končno točko.

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

mp-rest/url

Določa REST končno točko.

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

Zaključki

V tem blogu, ki bo v prvi vrsti koristen za Spring razvijalce, bomo na kratko obravnavali, kako v Quarkusu uporabiti Spring API-je skupaj z MicroProfile API-ji za razvoj Java mikroservisov in njihovo kompilacijo v nativno binarno kodo, kar prihrani stotine megabajtov pomnilnika in se zažene v nekaj milisekundah.

Kot ste že razumeli, dodatne informacije o podpori Spring in MicroProfile API-jem ter številne druge koristne informacije najdete v Quarkus priročnikih.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster