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.