[JAVA] Utilisation de Hystrix et Sentinel dans un exemple de code

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.

Exemple

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.

image.png

en outre

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.

image.png

Là encore, dans un environnement de production réel, les utilisateurs peuvent utiliser des tableaux de bord pour configurer et surveiller le trafic.

emballer

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

Utilisation de Hystrix et Sentinel dans un exemple de code
Exemple d'encodage et de décodage en Java
Écrire du code à l'aide de classes et d'instances Ruby
Essayez d'utiliser Sourcetrail (version win) avec du code Java
Essayez d'utiliser Sourcetrail (version macOS) avec du code Java
Politique de contre-mesure CSRF et exemple de mise en œuvre dans une application REST utilisant "Spring Boot" + "EXT JS"
Linked HashMap référencé dans l'ordre d'insertion et son exemple d'utilisation
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Différences de code lors de l'utilisation du système de longueur en Java
Exemple de code Java pour acquérir et afficher les données source et de destination DBLINK dans Oracle Database à l'aide de DBLINK
Exemple d'utilisation de vue.config.js
Implémenter CustomView dans le code
Implémentez Thread en Java et essayez d'utiliser la classe anonyme Lambda
Comment spécifier le code de caractère et le code de saut de ligne avec JAXB
Comment définir le code de caractère et le code de saut de ligne dans Eclipse
Obtenez des informations d'erreur à l'aide de DefaultErrorAttributes et ErrorAttributeOptions dans Spring Boot 2.3
Créer un code QR pour Google Authenticator à l'aide de ZXing en Java
Corrigez le code de caractère en Java et lisez à partir de l'URL
Conseils d'utilisation de Salesforce SOAP et de l'API Bulk en Java
L'histoire de l'utilisation de Java Input Wait (Scanner) avec VSCode