Sentinel Learning (2) - Utilisation de Sentinel, introduire des dépendances et des configurations et effectuer un contrôle de flux sur les consommateurs et effectuer des disjoncteurs et des déclassements sur les producteurs

Préface

Sentinel est un composant de gestion du trafic pour une architecture de services hétérogènes distribués et multilingues. Il prend principalement le trafic comme point d'entrée, couvrant le routage du trafic, le contrôle du trafic, la mise en forme du trafic, la dégradation des disjoncteurs, la protection adaptative contre les surcharges du système, la protection du trafic des points chauds, etc. Dimension pour aider les développeurs à assurer la stabilité des microservices.

Ce blog présente l'utilisation de Sentinel, présente les dépendances et les configurations, et illustre le contrôle de flux des consommateurs et des disjoncteurs et le déclassement des producteurs par Sentinel à travers des études de cas.

D'autres articles sur Sentinel sont les suivants :

Apprentissage Sentinel (1) - Théorie CAP, problème d'avalanche dans les microservices et solutions Hystix et concepts associés de Sentinel + télécharger et exécuter

Insérer la description de l'image ici

emmener


1. L'utilisation de Sentinel introduit des dépendances et des configurations ;
2. Contrôle de flux pour les consommateurs ;
3. Disjoncteurs et déclassements pour les producteurs.

1. Préparation à l'utilisation de Sentinel

1. Contexte et ressources

Contexte (Context) et context-name
Context représentent le contexte du lien appelant. Est un nœud racine. Au début de l'ensemble du lien appelant, Sentinel créera un objet Context et lui attribuera un nom, qui est équivalent à la ressource racine. Dans Sentinel, différents liens appelants peuvent utiliser le même objet contextuel (un nœud racine total). Ici (intégré à Spring MVC), nos liens d'appel sont tous dans sentinel_spring_web_context :

Insérer la description de l'image ici

Les ressources et le nom de la ressource
sont dans Sentinel. Pour chaque ressource, Sentinel attribuera un nom (ou vous le spécifiez manuellement). Lors de l'intégration avec Spring MVC, Sentinel utilise l'URI comme nom de ressource de la méthode Controller (ici, la méthode Controller est la ressource)

Insérer la description de l'image ici

2. Répartition des responsabilités

Pour les consommateurs, en matière de contrôle du trafic, si d'autres personnes accèdent à moi, j'ai peur d'échouer, je veux donc limiter le trafic auquel les autres peuvent accéder ;

Pour le producteur, le disjoncteur est dégradé. Le consommateur appelle le producteur, craignant que le producteur ait un problème, donc le disjoncteur est dégradé. Si l'appelé, c'est-à-dire le producteur, a un problème, la réponse correspondante sera être donné;

Insérer la description de l'image ici

3.Introduire les dépendances et la configuration

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
spring:
  cloud:
    # nacos的配置
    nacos:
      discovery:
        # 能够注册
        register-enabled: true
        server-addr: http://192.168.111.130:8848/
        # 命名空间
        namespace: my-tianju
        # 组名
        group: DEV

    # sentinel的配置
    sentinel:
      transport:
        dashboard: 192.168.111.130:7777
        port: 8719
      # 这样一启动能够立马被发现,不用请求一次后才被监控
      eager: true
      # 链路相关的配置
      # 默认是true,开启上下文整合,所有链路在根节点下,链路监控就是将请求分开统计
      web-context-unify: false

  application:
    name: springCloud-consumer

#feign:
#  hystrix:
#    enable: true

# 打开阿里的 sentinel
feign:
  sentinel:
    enabled: true

2. Contrôler le flux des consommateurs

QPS (Queries Per Second) représente le nombre de requêtes par seconde. C'est-à-dire le nombre de requêtes auxquelles un serveur peut répondre par seconde.

1. Seuil de machine unique

QPS (Queries Per Second) représente le nombre de requêtes par seconde. C'est-à-dire le nombre de requêtes auxquelles un serveur peut répondre par seconde.

Insérer la description de l'image ici

Il y avait trop de demandes et le flux était restreint par sentinelle.

Insérer la description de l'image ici

2. Paramètres de préchauffage

Au premier démarrage du système, moins de requêtes sont autorisées. À mesure que le système se stabilise progressivement, le seuil d'autorisation d'accès augmente.

Insérer la description de l'image ici

JMeter teste les demandes de publication et doit ajouter des paramètres d'en-tête de demande.

Insérer la description de l'image ici

Temps de montée en puissance : intervalle entre les démarrages des threads. Si 100 threads sont démarrés dans un délai de 10 s, définissez la montée en puissance sur 100/10 = 10 s.

Insérer la description de l'image ici

Graphique de forme d'onde

Insérer la description de l'image ici

Analyse de l'ensemble du processus :
1. Autoriser 3 fois par seconde au début ;
2. Augmenter progressivement au cours des 10 premières secondes ;
3. Atteignez une valeur stable après 10 secondes et autorisez 10 fois par seconde.

Insérer la description de l'image ici

3. Faites la queue

Mise en file d'attente et attente : également appelée mise en forme du trafic, elle permet aux requêtes de passer à une vitesse uniforme. Le seuil d'une seule machine est le nombre de passages par seconde. Les autres sont mis en file d'attente dans la file d'attente et attendent pendant un certain temps (c'est-à-dire le temps que nous avons défini, en millisecondes). Ce temps n'est pas dépassé. peut être traité dans le temps. Si ce temps d'attente est dépassé et qu'il n'y a pas de thread pour traiter l'interface demandée, une exception sera levée.

Insérer la description de l'image ici

Paramètres des paramètres JMeter

Insérer la description de l'image ici

Graphique de forme d'onde

Insérer la description de l'image ici

Processus politique de limitation actuel :
1. Autoriser 10 par seconde
2. Envoyez 50, passez 10 et les 40 restants entrent dans la file d'attente pour attendre :
3. Lorsqu'il n'y a aucune demande, via les demandes en attente dans la file d'attente,

Insérer la description de l'image ici

4. Mode association

Association : L'importance de l'interface /important est supérieure à celle de l'interface /normal. Si la pression d'accès de l'interface /important est très élevée, alors l'interface /normal` peut être « sacrifiée » pour assurer le fonctionnement normal du /interface importante.

Insérer la description de l'image ici

Paramètres des paramètres JMeter

Insérer la description de l'image ici

Paramétrage du numéro de fil

Insérer la description de l'image ici

l'ajout est réussi, l'obtention est limitée

Insérer la description de l'image ici

Dans les situations de concurrence élevée, l’interface d’ajout n’échoue pas.

Insérer la description de l'image ici

Supplément : retour d'exception de limitation de courant personnalisé

Les informations par défaut renvoyées par Sentinel sont Bloqué par Sentinel (limitation de flux). Si vous n'êtes pas satisfait des informations de réponse par défaut, vous pouvez personnaliser les informations de retour de limitation de flux.

Sentinel fournit l'interface BlockExceptionHandler. Quelle que soit la raison pour laquelle Sentinel bloque la requête normale de l'utilisateur, Sentinel « entrera » dans la classe d'implémentation de l'interface BlockExceptionHandler définie par l'utilisateur, exécutera la méthode handle et transmettra la requête actuelle, l'objet de réponse et l'objet d'exception, ainsi que l'exécution. le résultat de la méthode handle est renvoyé à l’utilisateur.

package com.tianju.test;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
    
    
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response,
                       BlockException ex) throws Exception {
    
    
        String msg = null;
        if (ex instanceof FlowException) {
    
    
            msg = "该请求限流了,请稍后重试";
        } else if (ex instanceof DegradeException) {
    
    
            msg = "被熔断了";
        } else {
    
    
            msg = "其它原因";
            // ParamFlowException "热点参数限流";
            // SystemBlockException "系统规则(负载/...不满足要求)";
            // AuthorityException "授权规则不通过";
        }
        // http 状态码
        response.setStatus(500);
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type", "application/json;charset=utf-8");
        response.setContentType("application/json;charset=utf-8");
        new ObjectMapper().writeValue(response.getWriter(), msg);
    }
}

Il est à noter que : ce ne sont pas seulement les raisons de limitation de courant et de disjoncteur qui provoqueront l'exécution de la méthode handle de BlockExceptionhandler, mais aussi d'autres raisons qui feront également appel à cette méthode de gestionnaire. Il est donc nécessaire d'effectuer une instance de jugement sur l'objet paramètre BlockException de la méthode handle.

5. Mode lien

Les idées de limitation de courant de liaison et de limitation de courant d'association sont très similaires. Supposons que nous souhaitions demander un certain microservice. Le microservice a deux interfaces (/query et /add), et ces deux interfaces appellent la même couche de service. méthode (telle que : méthode doSomething()), alors nous pouvons le définir du point de vue de la méthode doSomething : si l'interface /query appelle la méthode doSomething de la couche de service, alors le courant est limité, et /add Il n'y a pas de limite de courant pour appelant l'interface, ou il peut être réglé sur un contrôle de flux plus détendu.

Désactivez la fonction de convergence d'URL de Sentinel via la configuration

Insérer la description de l'image ici

package com.tianju.consumer.service;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;

@Service
public class ConsumerService {
    
    
    @SentinelResource("hello")
    public String hello(){
    
    
        return "consumerService";
    }
}

Insérer la description de l'image ici

Mode lien, du point de vue des méthodes de couche de service

Insérer la description de l'image ici

Interface d'ajout de haute concurrence, pas d'échec

Insérer la description de l'image ici

Cliquez rapidement sur la méthode get et une situation non valide se produit.

Insérer la description de l'image ici

3. Coupe-circuit et déclassement des producteurs

3 états de fusible :

  • Fermé : état fermé, toutes les requêtes sont accessibles normalement.

  • Ouvert : état ouvert, toutes les demandes seront rétrogradées.

    Hystrix comptera les demandes. Lorsque le pourcentage de demandes ayant échoué atteint le seuil dans un certain laps de temps, le fusible se déclenchera et le disjoncteur sera complètement ouvert. Le seuil de taux d'échec par défaut est de 50 % et le nombre de requêtes est d'au moins 20. La valeur par défaut est de 20 requêtes dans les cinq secondes. Si 10 fois échouent (50%), la requête n'est pas accessible normalement.

  • Semi-ouvert : état à moitié ouvert. L'état ouvert n'est pas permanent. Il entrera en mode veille après l'ouverture (la valeur par défaut est 5S). Le disjoncteur entrera alors automatiquement dans l’état semi-ouvert.

    A ce moment, certaines requêtes seront libérées pour passer. Si ces requêtes sont saines, le disjoncteur sera complètement fermé. Sinon, il restera ouvert et la minuterie de mise en veille sera redémarrée.

Insérer la description de l'image ici

1. Nombre d'exceptions

La configuration suivante : Envoyer 2 requêtes en une seconde. Si une panne (anormale) se produit, le disjoncteur sera directement déconnecté puis rétrogradé.

Insérer la description de l'image ici

Paramètres de réglage

Insérer la description de l'image ici

Insérer la description de l'image ici

2. Des proportions anormales

Insérer la description de l'image ici

Définir la méthode de secours

Insérer la description de l'image ici

package com.tianju.config;

import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.fallback.StorageFeignFallback;
import com.tianju.entity.Order;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(value = "storage-server",fallback = StorageFeignFallback.class)
public interface StorageFeign {
    
    

    @PostMapping("/storage/sub")
    HttpResp subStorage(@RequestBody StorageDto storageDto);

}

openfeign définit la méthode de repli

Insérer la description de l'image ici

package com.tianju.config;

import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.fallback.StorageFeignFallback;
import com.tianju.entity.Order;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(value = "storage-server",fallback = StorageFeignFallback.class)
public interface StorageFeign {
    
    
    @PostMapping("/storage/sub")
    HttpResp subStorage(@RequestBody StorageDto storageDto);
}

Une anomalie se produit chez le producteur

Insérer la description de l'image ici

Test avec le facteur

Insérer la description de l'image ici

package com.tianju.config.fallback;

import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.StorageFeign;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 调用库存的feign异常时的返回
 */
@Component
@Slf4j
public class StorageFeignFallback implements StorageFeign {
    
    
    @Override
    public HttpResp subStorage(StorageDto storageDto) {
    
    
        System.out.println("#########################进入了减库存方法的异常中....###########################");
        log.debug("进入了减库存方法的异常中....");
        return HttpResp.failed("减库存的openFeign调用失效,请稍后重试");
    }
}

Insérer la description de l'image ici

package com.tianju.config.fallback;

import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.StorageFeign;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 调用库存的feign异常时的返回
 */
@Component
@Slf4j
public class StorageFeignFallback implements StorageFeign {
    
    
    @Override
    public HttpResp subStorage(StorageDto storageDto) {
    
    
        System.out.println("#########################进入了减库存方法的异常中....###########################");
        log.debug("进入了减库存方法的异常中....");
        return HttpResp.failed("减库存的openFeign调用失效,请稍后重试");
    }
}

3. Taux d'appels lent

La configuration suivante : envoyer 5 requêtes en une seconde. Si le temps de réponse de chaque requête dépasse 500 millisecondes et que le rapport atteint 0,5 (50%), un disjoncteur sera effectué. La durée du disjoncteur est de 10 secondes. Par exemple : il y a 5 requêtes en 1 seconde, et le temps de réponse de 3 d'entre elles dépasse 500 millisecondes, alors le ratio est de 60 %. S'il est supérieur à 50 %, le circuit sera coupé à ce moment puis rétrogradé.

Insérer la description de l'image ici

Testé avec Jmeter, lorsque id=1 dans le programme, chaque réponse dure 800 millisecondes. Par conséquent, chaque requête prend plus de 500 millisecondes et le taux d'échec est de 100 %. À l'heure actuelle, la demande de ressource avec l'id=4 ne peut pas être demandée, car le disjoncteur est cassé, il est donc directement rétrogradé. Il sera normal de demander à nouveau id=4 après 10 secondes.


Résumer

1. L'utilisation de Sentinel introduit des dépendances et des configurations ;
2. Contrôle de flux pour les consommateurs ;
3. Disjoncteurs et déclassements pour les producteurs.

Je suppose que tu aimes

Origine blog.csdn.net/Pireley/article/details/133420975
conseillé
Classement