Introduction au client Spring Cloud Rest avec le ruban Netflix

1. Introduction

Netflix Ribbon est une bibliothèque de nuages ​​InterCommunication (IPC). Le ruban fournit principalement des algorithmes d’équilibrage de la charge côté client.

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

  • Intégration de la découverte de service - Les équilibreurs de charge du ruban fournissent

découverte de services dans des environnements dynamiques comme un nuage. Intégration avec Le composant de découverte de service Eureka et Netflix est inclus dans le ruban bibliothèque Fault Tolerance ** - l’API du ruban peut déterminer dynamiquement si

les serveurs sont opérationnels dans un environnement en direct et peuvent détecter ces serveurs qui sont en panne Règles d’équilibrage de charge configurables ** - Prise en charge du ruban

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 selon le concept appelé «client nommé». Lors de la configuration de Ribbon 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 de la dépendance

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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

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

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 allons utiliser l’une des stratégies d’équilibrage de la charge de Ribbon, WeightedResponseTimeRule , pour activer l’équilibrage de la charge côté client entre deux serveurs, définis sous un client nommé dans le fichier de configuration de notre application.

4. Configuration du ruban

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

  • Rule - Composant logique spécifiant la règle d’équilibrage de charge que nous

utilisez 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 un

liste statique des serveurs et donc nous les définissons dans le fichier de configuration de l’application directement

Laissons écrire 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 que nous avons utilisé la règle WeightedResponseTimeRule pour déterminer le serveur et le mécanisme PingUrl pour déterminer la disponibilité du serveur en temps réel.

Selon cette règle, un poids est attribué à chaque serveur en fonction de son temps de réponse moyen. Moins le temps de réponse est petit, plus le poids est faible.

Cette règle sélectionne de manière aléatoire un serveur où la possibilité est déterminée par le poids du serveur.

Et le PingUrl fera un ping de chaque URL pour déterminer la disponibilité du serveur.

5. application.yml

Voici 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: "serveur-ping"

  • Composant de découverte de service Eureka désactivé, en définissant eureka:

enabled à false ** Défini la liste des serveurs disponibles pour l’équilibrage de charge, dans ce

caisse, 2 serveurs ** Configuration du taux de rafraîchissement du serveur avec ServerListRefreshInterval

6. RibbonClient

Maintenant, configurons l’extrait de composant principal de l’application - où nous utilisons RibbonClient pour activer l’équilibrage de charge au lieu de plain RestTemplate :

@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(
          "http://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 que celle définie précédemment, dans laquelle nous avons fourni la configuration souhaitée de l’API du ruban pour cette application.

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

7. Échec de la résilience en ruban

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

Comme indiqué précédemment, l’API du ruban peut déterminer la disponibilité du serveur par le biais de requêtes ping constantes de serveurs à intervalles réguliers et permet de ignorer les serveurs inactifs.

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 de disjoncteur minimise l’impact d’une défaillance du serveur sur les performances en rejetant rapidement une demande adressée à ce serveur qui échoue sans attendre de délai d’expiration. Nous pouvons désactiver cette fonctionnalité en définissant la propriété niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped sur false .

Lorsque tous les serveurs sont hors service, aucun serveur n’est disponible pour répondre à la demande. PingUrl () échouera et nous recevrons une exception java.lang.IllegalStateException avec un message «Aucune instance n’est disponible pour traiter la demande» .

8. Conclusion

Dans cet article, nous avons présenté l’API Netflix Ribbon et son implémentation dans un exemple d’application simple.

Le code source complet de l’exemple décrit ci-dessus est disponible dans le référentiel GitHub .