Configuration et déploiement de Sentinel pour le contrôle de flux dans Spring Cloud

Pour déployer l'interface d'administration de Sentinel, une approche courante consiste à utiliser un conteneur Docker. Voici une commande adaptée :

docker run -d --name sentinel-admin \
--restart unless-stopped \
-p 8800:8080 \
registry.cn-hangzhou.aliyuncs.com/zxd-docker-images/sentinel-dashboard:1.8.6

Cette commande lance l'interface sur le port 8800 de l'hôte, avec un nom de conteneur distinct.

Intégration dans un projet Spring Cloud avec persistance via Nacos :

D'abord, ajoutez les dépendances nécessaires dans votre fichier pom.xml :

<!-- Dépendance principale pour Sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- Dépendance pour la synchronisation avec Nacos -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.6</version>
</dependency>

Ensuite, configurez les paramètres dans un fichier YAML de votre application. Adaptez les adresses IP et les identifiants selon votre environnement :

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8800
      eager: true
      datasource:
        flowRules:
          nacos:
            server-addr: ${NACOS_HOST}:8848
            data-id: flow-rules-config
            group-id: RULES_GROUP
            rule-type: flow
            data-type: json
        degradeRules:
          nacos:
            server-addr: ${NACOS_HOST}:8848
            data-id: degrade-rules-config
            group-id: RULES_GROUP
            rule-type: degrade
            data-type: json
        systemRules:
          nacos:
            server-addr: ${NACOS_HOST}:8848
            data-id: system-rules-config
            group-id: RULES_GROUP
            rule-type: system
            data-type: json

Notez que les propriétés client-username et client-password ont été omises pour simplifier, mais peuvent être ajoutées si nécessaire.

Définissez ensuite les règles dans des fichiers JSON. Exemples pour différentes catégories :

Pour les règles de limitation de débit (flow rules) :

[
  {
    "resource": "service-endpoint",
    "limitApp": "default",
    "grade": 1,
    "count": 10,
    "strategy": 0,
    "controlBehavior": 0,
    "clusterMode": false
  }
]

Pour les règles de dégradation (degrade rules) :

[
  {
    "resource": "service-endpoint",
    "count": 5,
    "grade": 0,
    "timeWindow": 30,
    "minRequestAmount": 10,
    "slowRatioThreshold": 0.6,
    "statIntervalMs": 5000,
    "strategy": 0
  }
]

Pour les règles système (system rules) :

[
  {
    "grade": 3,
    "count": 0.75
  }
]

Après avoir redémarré l'application, les règles devraient apparaître dans l'interface de Sentinel.

Pour gérer les exceptions personnalisées, créez une classe de gestion globale :

package com.example.handlers;

import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.Map;
import java.util.HashMap;

@RestControllerAdvice
public class SentinelExceptionManager {

    @ExceptionHandler(FlowException.class)
    public Map<String, Object> handleFlowLimit() {
        Map<String, Object> response = new HashMap<>();
        response.put("status", 429);
        response.put("message", "Requête limitée par le contrôle de flux");
        return response;
    }

    @ExceptionHandler(DegradeException.class)
    public Map<String, Object> handleDegrade() {
        Map<String, Object> response = new HashMap<>();
        response.put("status", 503);
        response.put("message", "Service dégradé ou indisponible");
        return response;
    }

    @ExceptionHandler(AuthorityException.class)
    public Map<String, Object> handleAuthorization() {
        Map<String, Object> response = new HashMap<>();
        response.put("status", 401);
        response.put("message": "Accès non autorisé");
        return response;
    }
}

Cette classe intercepte les exceptions spécifiques à Sentinel et fournit des réponses JSON structurées.

Étiquettes: Sentinel Spring Cloud Nacos Docker Microservices

Publié le 3 juin à 01h15