Dans cette série d'articles, nous présenterons le projet de contrôle de flux open source ** Alibaba ** ** Sentinel Java ** en comparaison avec ** Hystrix **.
Dans mon dernier blog, j'ai comparé les deux bibliothèques à un niveau élevé. Voyons maintenant comment utiliser les deux tout en regardant l'exemple de code.
L'exemple utilisé ici est tiré de ce tutoriel Spring (https://spring.io/guides/gs/circuit-breaker/?spm=a2c65.11461447.0.0.7e4717c6AVEkbf). Ceci est un exemple d'application d'une célèbre librairie.
Avant de commencer, assurez-vous de suivre les étapes de la documentation d'origine pour télécharger et configurer l'exemple d'application.
L'échantillon peut être réutilisé avec des modifications mineures. Sentinel fait partie de la dernière version de Spring Framework. Par conséquent, il n'y a aucun changement de dépendance supplémentaire.
Allons directement à read / src / main / java / hello / BookService.java
et collez le code ci-dessous.
@Service
public class BookService {
private final RestTemplate restTemplate;
public BookService(RestTemplate rest) {
this.restTemplate = rest;
}
@SentinelResource(value = "readingList", fallback = "reliable")
public String readingList() {
URI uri = URI.create("http://localhost:8090/recommended");
return this.restTemplate.getForObject(uri, String.class);
}
public String reliable() {
return "Cloud Native Java (O'Reilly)";
}
}
Comme vous pouvez le voir, nous venons de remplacer l'annotation @ HystrixCommand
par @ SentinelResource
. L'attribut value
étiquette la méthode que vous souhaitez appliquer au disjoncteur. Et l'attribut fallback
pointe vers la fonction fallbackMethod
. Ensuite, ajoutez la fonction fallback`` fiable ()
. Cette fonction fait la même chose que l'exemple.
Jusqu'à présent, c'est assez proche de ce que fait Hystrix. Cependant, comme mentionné dans l'article précédent, Hystrix dirige le fonctionnement du disjoncteur. Après avoir signalé la ressource, les conditions de démarrage du disjoncteur sont traitées telles quelles.
Sentinel, en revanche, laisse le contrôle à l'utilisateur, qui doit créer des règles pour définir les conditions. Faisons cela et ajoutons une règle. Vous pouvez l'ajouter à la fin du fichier.
DegradeRuleManager.loadRules(Collections.singletonList(
new DegradeRule("readingList") // resource name
.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) // strategy
.setCount(0.5) // threshold
.setTimeWindow(10) // circuit breaking timeout (in second)
));
Je viens de créer une DegradeRule
et de définir le mode sur le taux d'exception, le seuil à 0,5 (1 sur 2) et le temps de récupération à 10 secondes. DegradeRuleManager
charge et active cette règle.
Essayons-le. Seul le service de lecture est démarré, pas le service de librairie. Par conséquent, il échoue à chaque fois qu'une demande arrive. Après deux tentatives (et deux échecs), voyons la fonctionnalité de secours activée.
Cloud Native Java (O'Reilly)
Maintenant, commençons le service Bookstore. Après 10 secondes, nous verrons la réponse normale.
Spring in Action (Manning), Cloud Native Java (O'Reilly), Learning Spring Boot (Packt)
Dans un environnement de production, il est en fait plus facile de définir cette règle à l'aide du tableau de bord Sentinel que de l'ajouter via le code. Ci-dessous, une capture d'écran.
Jusqu'à présent, nous avons vu la même fonctionnalité qu'Hystrix exécutée. Et en réalité, Sentinel a besoin d'une autre étape. Regardons un exemple.
Sentinel vous permet de définir des règles basées sur différentes métriques. Cet exemple utilise QPS.
Tout d'abord, cherchons la classe principale bookstore / src / main / java / hello / BookstoreApplication.java
.
@RestController
@SpringBootApplication
public class BookstoreApplication {
private static final Logger LOGGER = LoggerFactory.getLogger(BookstoreApplication.class);
@SentinelResource(value = "readingList", blockHandler = "handleTooManyRequests")
@RequestMapping(value = "/recommended")
public String readingList(){
return "Spring in Action (Manning), Cloud Native Java (O'Reilly), Learning Spring Boot (Packt)";
}
public String handleTooManyRequests(BlockException ex) {
LOGGER.error("Too many requests: " + ex.getClass().getSimpleName());
return "Sentinel in Action";
}
public static void main(String[] args) {
SpringApplication.run(BookstoreApplication.class, args);
}
J'ai ajouté @ SentinelResource
, mais j'utilise la fonction blockHandler
au lieu de la fonction fallback
. Cette fonction imprime simplement le message "Sentinel en action". Nous devons maintenant ajouter une nouvelle règle lorsque cette fonction est déclenchée.
FlowRule rule = new FlowRule("readingList")
.setCount(1);
FlowRuleManager.loadRules(Collections.singletonList(rule));
Cette règle s'applique lorsqu'il y a une ou plusieurs demandes par seconde. Une partie de ce code peut être ajoutée à la fin du fichier.
À la première demande après le démarrage du service BookStore
, nous devons obtenir une réponse normale.
Spring in Action (Manning), Cloud Native Java (O'Reilly), Learning Spring Boot (Packt)
Cependant, si vous faites plus d'une requête par seconde, vous devriez voir la fonction blockHandler
démarrer.
Sentinel in Action
Et après 1 seconde, vous pouvez à nouveau voir la réaction normale.
Là encore, dans un environnement de production réel, les utilisateurs peuvent utiliser des tableaux de bord pour configurer et surveiller le trafic.
Sentinel vise à fournir aux utilisateurs plusieurs options pour contrôler le flux vers le service. Pour ce faire, l'utilisateur doit définir les règles via l'interface graphique ou le code. En plus de QPS, les utilisateurs peuvent contrôler le nombre de threads et créer des listes blanches pour le contrôle d'accès. À mesure que les services distribués deviendront plus complexes, ce modèle répondra mieux aux demandes des utilisateurs.
Recommended Posts