Comment Quarkus intĂšgre MicroProfile et Spring

Bonjour à tous, et voici le troisiÚme post de notre série sur Quarkus !

Comment Quarkus intĂšgre MicroProfile et Spring

Lors du dĂ©veloppement de microservices Java, il est souvent considĂ©rĂ© que Eclipse MicroProfile et Spring Boot – ce sont des API distinctes et indĂ©pendantes les unes des autres. Par dĂ©faut, les programmeurs utilisent gĂ©nĂ©ralement les API auxquelles ils sont dĂ©jĂ  habituĂ©s, car apprendre de nouveaux frameworks et composants runtime demande beaucoup de temps. Aujourd'hui, nous allons essayer de simplifier l'apprentissage de certains des API populaires MicroProfile pour les dĂ©veloppeurs Spring et montrer comment utiliser Ă  la fois les API Spring et de nouvelles fonctionnalitĂ©s utiles Quarkus.

Pour entrer dans les détails, nous allons d'abord examiner le domaine d'application et les détails de la façon dont Quarkus prend en charge les interfaces API Spring, afin de montrer aux développeurs Spring comment ils peuvent appliquer les API MicroProfile dans leur travail quotidien. Ensuite, nous parlerons des API MicroProfile qui seront utiles aux développeurs Spring lors de la création de microservices.

Pourquoi Quarkus ? Tout d'abord, il s'agit de la programmation en direct (live coding), c'est-à-dire le rechargement automatique de tout changement dans les API MicroProfile, les API Spring et d'autres API Java, qui s'effectue par une simple commande : mvn quarkus:dev. DeuxiÚmement, l'exemple traité dans notre exemple le service Person (il est compilé à partir des interfaces API Spring, MicroProfile et JPA en un fichier binaire à l'aide de l'image native GraalVM) se lance en seulement 0,055 seconde et occupe environ 90 Mo de mémoire vive (RSS) sur le point d'application RESTful. De plus, sa compilation s'effectue par une simple commande : mvn package -Pnative.

Nous n'allons pas entrer dans les détails de MicroProfile, mais nous allons essayer d'aider les développeurs Spring à comprendre comment utiliser les interfaces API Spring avec les interfaces API MicroProfile dans Quarkus.

Conteneurs et Kubernetes

Pour ne pas alourdir cet article, nous allons examiner ici seulement les aspects de haut niveau du support Kubernetes, car il est important de comprendre cela. Quarkus se positionne comme une stack Java pour Kubernetes, visant à minimiser la consommation de mémoire et le temps de démarrage des applications et services Java, augmentant ainsi leur densité d'hébergement et réduisant les coûts globaux.

Quarkus prend également en charge la génération automatique des ressources Kubernetes et propose du manuel des solutions de déploiement sur les plateformes Kubernetes et Red Hat OpenShift. De plus, Quarkus génÚre automatiquement des fichiers Dockerfile.jvm (emballage JVM) et Dockerfile.native (emballage binaire natif), nécessaires à la création de conteneurs.

Enfin, en utilisant Kubernetes comme environnement de dĂ©ploiement cible, Quarkus n’utilise pas de frameworks Java lorsque des fonctionnalitĂ©s similaires sont mises en Ɠuvre au niveau de la plateforme Kubernetes elle-mĂȘme. La table 1 prĂ©sente une carte de correspondance fonctionnelle entre Kubernetes et les frameworks Java typiques utilisĂ©s par les dĂ©veloppeurs Spring.

Tableau 1. Carte de correspondance entre les frameworks Java et Kubernetes.

Fonctionnalités
Spring Boot traditionnel
Kubernetes

Découverte de services
Eureka
DNS

Configuration
Spring Cloud Config
Cartes de configuration / Secrets

Équilibrage de charge
Ribbon (cÎté client)
Service, ContrÎleur de réplique (cÎté serveur)

Compilation et exĂ©cution du code de l’exemple

Dans cet article, nous faisons rĂ©fĂ©rence Ă  un exemple de projet, oĂč les API Spring et MicroProfile sont utilisĂ©es ensemble, ainsi que cette classe Java. Le code de cet exemple peut ĂȘtre compilĂ© et exĂ©cutĂ© Ă  partir de la ligne de commande ; pour plus de dĂ©tails, voir le fichier README.md.

APIs du Framework Spring

Dependency Injection

Quarkus prend en charge toute une gamme de API de Contextes et d'Injection de DĂ©pendances (CDI) et d’APIs d’Injection de DĂ©pendances Spring (Spring DI). Si vous travaillez avec MicroProfile, Java EE et Jakarta EE, vous ĂȘtes dĂ©jĂ  bien familiarisĂ© avec CDI. D'autre part, les dĂ©veloppeurs Spring peuvent utiliser l’extension Quarkus pour l’API Spring DI afin d’assurer la compatibilitĂ© avec Spring DI. Des exemples d'utilisation des APIs Spring DI prises en charge sont prĂ©sentĂ©s dans le tableau 2.

Dans dans notre exemple de projet tant CDI que l’Injection de DĂ©pendances Spring. Pour des informations supplĂ©mentaires et des exemples sur ce sujet, vous pouvez consulter le guide Quarkus intitulĂ© Guide Spring DI.

Tableau 2. Exemples d’utilisation des APIs Spring DI prises en charge.

Fonctionnalités prises en charge de Spring DI
Exemples

Injection par constructeur

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

Injection par champ
Autowired
Valeur

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Configuration

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

Composant

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

Framework web

Les utilisateurs de MicroProfile apprĂ©cieront que Quarkus prenne en charge JAX-RS, MicroProfile Rest Client, JSON-P et JSON-B comme modĂšle principal de programmation web. Les dĂ©veloppeurs Spring seront ravis de la prise en charge rĂ©cemment ajoutĂ©e de Spring Web API dans Quarkus, notamment des interfaces responsables du REST. À l'instar de Spring DI, l'objectif principal du support de Spring Web API est de permettre aux dĂ©veloppeurs Spring d'utiliser les API Spring Web en conjonction avec les API MicroProfile. Des exemples d'utilisation des API Spring Web prises en charge sont prĂ©sentĂ©s dans le tableau 3, et des informations supplĂ©mentaires et des exemples sur ce sujet peuvent ĂȘtre trouvĂ©s dans le guide Quarkus intitulĂ© Guide de Spring Web.

Tableau 3. Exemples d'utilisation des interfaces API Spring Web prises en charge.

Fonctionnalités prises en charge de Spring Web
Exemples

@RestController
@RequestMapping

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

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

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

Spring Data JPA

Les utilisateurs de MicroProfile apprécieront également que Quarkus prenne en charge JPA avec Hibernate ORM. Il y a également de bonnes nouvelles pour les développeurs Spring : Quarkus prend en charge les annotations et types standards de Spring Data JPA. Des exemples d'utilisation des API Spring Data JPA prises en charge sont présentés dans le tableau 4.
Dans dans notre exemple de projet des interfaces API Spring Data JPA sont utilisés, et des informations supplémentaires sont disponibles dans le guide Quarkus intitulé Guide de Spring Data JPA.

Tableau 4. Exemples d'utilisation des interfaces API Spring Data JPA prises en charge.

Fonctionnalités prises en charge de Spring Data JPA
Exemples

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragments de Repository

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

MĂ©thodes de requĂȘte dĂ©rivĂ©es

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

RequĂȘtes dĂ©finies par l'utilisateur

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

Interfaces API MicroProfile

Tolérance aux pannes

Les constructions de tolĂ©rance aux pannes sont trĂšs importantes pour prĂ©venir les dĂ©faillances en cascade et crĂ©er des architectures de microservices robustes. Les dĂ©veloppeurs de Spring utilisent depuis de nombreuses annĂ©es des disjoncteurs pour la tolĂ©rance aux pannes. Hystrix. Cependant, Hystrix n'a pas Ă©tĂ© mis Ă  jour depuis longtemps, tandis que la tolĂ©rance aux pannes de MicroProfile est actuellement en dĂ©veloppement actif et a dĂ©jĂ  plusieurs annĂ©es d'utilisation en production. Par consĂ©quent, pour amĂ©liorer la fiabilitĂ© des services dans Quarkus, il est recommandĂ© d'utiliser les interfaces API de MicroProfile Fault Tolerance, dont des exemples d'utilisation sont fournis dans le tableau 5. Des informations supplĂ©mentaires peuvent ĂȘtre trouvĂ©es dans le guide Quarkus. Guide de tolĂ©rance aux pannes.

Tableau 5. Exemples d'utilisation des interfaces API MicroProfile Fault Tolerance prises en charge.

Fonctions de MicroProfile Fault Tolerance
Description
Exemples

@Asynchronous

Exécution de la logique dans un thread séparé

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

@Bulkhead

Limitation du nombre de requĂȘtes simultanĂ©es

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

@CircuitBreaker

Gestion intelligente des échecs et récupération aprÚs une panne

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

@Fallback

Appel de la logique alternative en cas d'échec

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

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

Retry

RĂ©essayer en cas d'Ă©chec de la requĂȘte

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

Timeout

Temps d'attente contrÎlé en cas d'échec

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

Vérification des services (Service Health)

Les plateformes Kubernetes surveillent l'intĂ©gritĂ© des conteneurs Ă  l'aide de services spĂ©ciaux. Pour que la plateforme sous-jacente puisse surveiller les services, les dĂ©veloppeurs de Spring utilisent gĂ©nĂ©ralement des HealthIndicators configurables et Spring Boot Actuator. Dans Quarkus, cela peut ĂȘtre rĂ©alisĂ© avec MicroProfile Health, qui effectue par dĂ©faut un contrĂŽle de l'Ă©tat de vie (liveness check), mais peut Ă©galement ĂȘtre configurĂ© pour effectuer simultanĂ©ment une vĂ©rification de l'Ă©tat de vie et de la prĂ©paration (readiness). Des exemples d'utilisation des API MicroProfile Health prises en charge sont fournis dans le tableau 6, et des informations supplĂ©mentaires sont disponibles dans le guide Quarkus. Guide de santĂ©.

Tableau 6. Exemples d'utilisation des interfaces API MicroProfile Health prises en charge.

Fonctions de MicroProfile Health
Description
Exemples

@Liveness

La plateforme redémarre les applications conteneurisées défaillantes
Point de terminaison :
hĂŽte: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

La plateforme ne dirigera pas le trafic vers les applications conteneurisĂ©es si celles-ci ne sont pas prĂȘtes
Point de terminaison :
hĂŽte:8080/health/ready

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

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

Métriques

Les applications fournissent des métriques soit à des fins opérationnelles (pour le contrÎle des indicateurs de performance SLA), soit à des fins non opérationnelles (indicateurs de performance SLA business). Les développeurs Spring fournissent des métriques via Spring Boot Actuator et Micrometer. D'autre part, Quarkus utilise MicroProfile Metrics pour fournir des métriques de base (JVM et systÚme d'exploitation), des métriques fournisseur (Quarkus) et des métriques d'application. MicroProfile Metrics exige que l'implémentation prenne en charge les formats de sortie JSON et OpenMetrics (Prometheus). Des exemples d'utilisation de l'API MicroProfile Metrics sont donnés dans le tableau 7.

Dans dans notre exemple de projet MicroProfile Metrics sont utilisĂ©s pour fournir des mĂ©triques d'application. Des informations supplĂ©mentaires peuvent ĂȘtre trouvĂ©es dans le guide Quarkus Guide des mĂ©triques.

Tableau 7. Exemples d'utilisation des interfaces API MicroProfile Metrics.

Fonctions des MicroProfile Metrics
Description
Exemples

@Counted

Désigne un compteur qui compte le nombre d'appels à l'objet annoté

@Counted(name = "fallbackCounter", 
  displayName = "Compteur de secours", 
  description = "Compteur de secours")
public String salutationFallback() {
   return fallbackSalutation;
}

@ConcurrentGauge

Désigne un capteur qui compte le nombre d'appels parallÚles à l'objet annoté

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

@Gauge

Désigne un capteur mesurant la valeur de l'objet annoté

@Metered(name = "FallbackGauge",
   displayName="Indicateur de secours",
   description="Fréquence de secours")
public String salutationFallback() {
   return fallbackSalutation;
}

@Metered

Désigne un compteur qui suit la fréquence d'appel de l'objet annoté

@Metered(name = "MeteredFallback",
   displayName="Fallback mesuré",
   description="Fréquence de secours")
public String salutationFallback() {
   return fallbackSalutation;
}

Métrique

Annotation contenant des informations sur les métadonnées lors de la réception d'une demande pour introduire ou produire une métrique

@Metric
@Metered(name = "MeteredFallback",
   displayName="Fallback mesuré",
   description="Fréquence de secours")
public String salutationFallback() {
   return fallbackSalutation;
}

Minutage

Désigne un chronomÚtre qui suit la durée de l'objet annoté

@Timed(name = "TimedFallback",
   displayName="Timed Fallback",
   description="Délai de secours")
public String salutationFallback() {
   return fallbackSalutation;
}

Points de terminaison des métriques (Metrics Endpoints)

Métriques des applications localhost:8080/metrics/application
Métriques de base localhost:8080/metrics/base
Métriques du vendeur localhost:8080/metrics/vendor
Toutes les métriques localhost:8080/metrics

Client REST MicroProfile

Les microservices offrent souvent des points de terminaison RESTful, pour lesquels des API clients appropriées sont nécessaires. Pour utiliser ces points de terminaison RESTful, les développeurs Spring utilisent généralement RestTemplate. Quarkus, quant à lui, propose des interfaces API MicroProfile Rest Client pour cela, dont des exemples d'utilisation sont fournis dans le tableau 8.

Dans dans notre exemple de projet L'utilisation des points de terminaison RESTful se fait Ă  l'aide de MicroProfile Rest Client. Plus d'informations et des exemples Ă  ce sujet peuvent ĂȘtre trouvĂ©s dans le guide Quarkus. Guide du Client REST.

Tableau 8. Exemples d'utilisation des interfaces API MicroProfile Rest Client.

Fonctionnalités du Client REST MicroProfile
Description
Exemples

@RegisterRestClient

Enregistre une interface Java typée en tant que client REST

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

@RestClient

Indique l'injection d'une instance d'interface typée de client REST

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

Invocation

Appelle le point de terminaison REST

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

mp-rest/url

Définit le point de terminaison REST

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

Résultats

Dans ce blog, principalement utile pour les développeurs Spring, nous avons briÚvement examiné comment utiliser les interfaces API Spring avec les API MicroProfile pour développer des microservices Java, et ensuite les compiler en code binaire natif, économisant des centaines de mégaoctets de mémoire vive et démarrant en quelques millisecondes.

Comme vous l'avez dĂ©jĂ  compris, des informations supplĂ©mentaires sur la prise en charge des interfaces API Spring et MicroProfile, ainsi qu'une multitude d'autres informations utiles peuvent ĂȘtre trouvĂ©es dans les guides Quarkus.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster