Introduction au client Spring Cloud Rest avec ruban Netflix

1. Introduction

Netflix Ribbon est une bibliothèque cloud IPC (Inter Process Communication). Ribbon fournit principalement des algorithmes d'équilibrage de charge côté client.

Outre les algorithmes d'équilibrage de charge côté client, Ribbon fournit également d'autres fonctionnalités:

  • Intégration de la découverte de services - Les équilibreurs de charge en ruban fournissent la découverte de services dans des environnements dynamiques comme un cloud. L'intégration avec le composant de découverte de services Eureka et Netflix est incluse dans la bibliothèque de rubans
  • Tolérance aux pannes - l'API du ruban peut déterminer dynamiquement si les serveurs sont opérationnels dans un environnement en direct et peut détecter les serveurs qui sont en panne
  • Règles d'équilibrage de charge configurables - Ribbon prend en charge RoundRobinRule , AvailabilityFilteringRule , WeightedResponseTimeRule prêt à l'emploi et prend également en charge la définition de règles personnalisées

L'API du ruban fonctionne sur la base du concept appelé «client nommé». Lors de la configuration du ruban dans notre fichier de configuration d'application, nous fournissons un nom pour la liste des serveurs inclus pour l'équilibrage de charge.

Prenons-le pour un tour.

2. Gestion des dépendances

L'API du ruban Netflix peut être ajoutée à notre projet en ajoutant la dépendance ci-dessous à notre pom.xml:

 org.springframework.cloud spring-cloud-starter-netflix-ribbon 

Les dernières bibliothèques peuvent être trouvées ici.

3. Exemple d'application

Afin de voir le fonctionnement de l'API Ribbon, nous construisons un exemple d'application de microservice avec Spring RestTemplate et nous l' améliorons avec l'API Netflix Ribbon ainsi que l'API Spring Cloud Netflix.

Nous utiliserons l'une des stratégies d'équilibrage de charge de Ribbon, WeightedResponseTimeRule , pour activer l'équilibrage de charge côté client entre 2 serveurs, qui sont définis sous un client nommé dans le fichier de configuration, dans notre application.

4. Configuration du ruban

L'API du ruban nous permet de configurer les composants suivants de l'équilibreur de charge:

  • Règle - Composant logique qui spécifie la règle d'équilibrage de charge que nous utilisons dans notre application
  • Ping - Un composant qui spécifie le mécanisme que nous utilisons pour déterminer la disponibilité du serveur en temps réel
  • ServerList - peut être dynamique ou statique. Dans notre cas, nous utilisons une liste statique de serveurs et nous les définissons donc directement dans le fichier de configuration de l'application

Écrivons une configuration simple pour la bibliothèque:

public class RibbonConfiguration { @Autowired IClientConfig ribbonClientConfig; @Bean public IPing ribbonPing(IClientConfig config) { return new PingUrl(); } @Bean public IRule ribbonRule(IClientConfig config) { return new WeightedResponseTimeRule(); } }

Notez comment nous avons utilisé la règle WeightedResponseTimeRule pour déterminer le serveur et le mécanisme PingUrl afin de déterminer la disponibilité du serveur en temps réel.

Selon cette règle, chaque serveur reçoit un poids en fonction de son temps de réponse moyen, moins le temps de réponse donne moins le poids. Cette règle sélectionne au hasard un serveur où la possibilité est déterminée par le poids du serveur.

Et PingUrl enverra une requête ping à chaque URL pour déterminer la disponibilité du serveur.

5. application.yml

Vous trouverez ci-dessous le fichier de configuration application.yml que nous avons créé pour cet exemple d'application:

spring: application: name: spring-cloud-ribbon server: port: 8888 ping-server: ribbon: eureka: enabled: false listOfServers: localhost:9092,localhost:9999 ServerListRefreshInterval: 15000

Dans le fichier ci-dessus, nous avons spécifié:

  • Nom de l'application
  • Numéro de port de l'application
  • Client nommé pour la liste des serveurs: "ping-server"
  • Composant de découverte de service Eureka désactivé, en définissant eureka: enabled sur false
  • Définition de la liste des serveurs disponibles pour l'équilibrage de charge, dans ce cas, 2 serveurs
  • Configuration du taux de rafraîchissement du serveur avec ServerListRefreshInterval

6. RibbonClient

Configurons maintenant l' extrait de code du composant d'application principal - où nous utilisons le RibbonClient pour activer l'équilibrage de charge au lieu du RestTemplate simple :

@SpringBootApplication @RestController @RibbonClient( name = "ping-a-server", configuration = RibbonConfiguration.class) public class ServerLocationApp { @LoadBalanced @Bean RestTemplate getRestTemplate() { return new RestTemplate(); } @Autowired RestTemplate restTemplate; @RequestMapping("/server-location") public String serverLocation() { return this.restTemplate.getForObject( "//ping-server/locaus", String.class); } public static void main(String[] args) { SpringApplication.run(ServerLocationApp.class, args); } }

Nous avons défini une classe de contrôleur avec l'annotation @RestController ; nous avons également annoté la classe avec @RibbonClient avec un nom et une classe de configuration.

La classe de configuration que nous avons définie ici est la même classe que celle que nous avons définie auparavant dans laquelle nous avons fourni la configuration d'API Ribbon souhaitée pour cette application.

Notez que nous avons également annoté le RestTemplate avec @LoadBalanced, ce qui suggère que nous voulons que cela soit équilibré en charge et dans ce cas avec le ruban.

7. Résilience aux pannes dans le ruban

Comme nous l'avons vu précédemment dans cet article, l'API du ruban fournit non seulement des algorithmes d'équilibrage de charge côté client, mais également une résilience intégrée aux pannes.

Comme indiqué précédemment, l'API Ribbon peut déterminer la disponibilité du serveur grâce au ping constant des serveurs à intervalles réguliers et a la capacité de sauter les serveurs qui ne sont pas actifs.

En plus de cela, il implémente également un modèle de disjoncteur pour filtrer les serveurs en fonction de critères spécifiés.

Le modèle Circuit Breaker minimise l'impact d'une panne de serveur sur les performances en rejetant rapidement une demande adressée à ce serveur qui échoue sans attendre l'expiration du délai. Nous pouvons désactiver cette fonctionnalité de disjoncteur en définissant la propriété niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped sur false .

Lorsque tous les serveurs sont en panne, donc aucun serveur n'est disponible pour répondre à la requête, le pingUrl () échouera et nous recevons une exception java.lang.IllegalStateException avec un message «Aucune instance n'est disponible pour répondre à la requête» .

8. Conclusion

Dans cet article, nous avons discuté de l'API Netflix Ribbon et de son implémentation dans un exemple d'application simple.

Le code source complet de l'exemple décrit ci-dessus se trouve sur le référentiel GitHub.