Aprendizaje Sentinel (2): uso de Sentinel, introducción de dependencias y configuraciones, control de flujo en los consumidores, disyuntores y degradaciones en los productores.

Prefacio

Sentinel es un componente de gestión de tráfico para una arquitectura de servicios heterogéneos distribuidos en varios idiomas. Principalmente toma el tráfico como punto de entrada y cubre el enrutamiento del tráfico, el control del tráfico, la configuración del tráfico, la degradación del disyuntor, la protección adaptativa contra sobrecargas del sistema, la protección del tráfico en puntos calientes, etc. Dimensión para ayudar a los desarrolladores a garantizar la estabilidad de los microservicios.

Este blog presenta el uso de Sentinel, presenta dependencias y configuraciones, e ilustra el control de flujo de consumidores y disyuntores de Sentinel y la degradación de productores a través de estudios de casos.

Otros artículos sobre centinela son los siguientes:

Aprendizaje Sentinel (1): teoría CAP, problema de avalancha en microservicios y soluciones Hystix y conceptos relacionados de Sentinel + descargar y ejecutar

Insertar descripción de la imagen aquí

conducir fuera


1. El uso de centinela introduce dependencias y configuraciones,
2. Control de flujo para los consumidores,
3. Disyuntores y degradaciones para los productores.

1. Preparación para usar centinela

1. Contexto y recursos

Contexto (Contexto) y contexto-nombre de contexto
representan el contexto del enlace de llamada. Es un nodo raíz. Al comienzo de todo el enlace de llamada, Sentinel creará un objeto de contexto y le asignará un nombre, que es equivalente al recurso raíz. En Sentinel, diferentes enlaces de llamada pueden usar el mismo objeto de contexto (un nodo raíz total). Aquí (integrado con Spring MVC), nuestros enlaces de llamadas están todos en sentinel_spring_web_context:

Insertar descripción de la imagen aquí

Los recursos y el nombre del recurso
están en Sentinel. Para cada recurso, Sentinel asignará un nombre (o usted lo especificará manualmente). Al integrarse con Spring MVC, Sentinel usa URI como el nombre de recurso del método del controlador (aquí, el método del controlador es el recurso)

Insertar descripción de la imagen aquí

2. División de responsabilidades

Para los consumidores, cuando se trata de control de tráfico, si otros acceden a mí, tengo miedo de fallar, por lo que quiero limitar el tráfico al que otros pueden acceder a mí;

Para el productor, el disyuntor se degrada. El consumidor llama al productor, temiendo que el productor tenga un problema, por lo que el disyuntor se degrada. Si el destinatario de la llamada, es decir, el productor, tiene un problema, la respuesta correspondiente será ser dado;

Insertar descripción de la imagen aquí

3.Introducir dependencias y configuración.

        <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. Controlar el flujo de consumidores.

QPS (Consultas por segundo) representa el número de consultas por segundo. Es decir, la cantidad de consultas a las que un servidor puede responder por segundo.

1. Umbral de una sola máquina

QPS (Consultas por segundo) representa el número de consultas por segundo. Es decir, la cantidad de consultas a las que un servidor puede responder por segundo.

Insertar descripción de la imagen aquí

Hubo demasiadas solicitudes y el flujo fue restringido por centinela.

Insertar descripción de la imagen aquí

2. Configuraciones de precalentamiento

Cuando el sistema se inicia por primera vez, se permiten menos solicitudes y, a medida que el sistema se estabiliza gradualmente, aumenta el umbral de permiso de acceso.

Insertar descripción de la imagen aquí

JMeter prueba las solicitudes de publicación y necesita agregar parámetros de encabezado de solicitud.

Insertar descripción de la imagen aquí

Tiempo de aceleración: el intervalo entre inicios de subprocesos. Si se inician 100 subprocesos en 10 segundos, configure la aceleración en 100/10 = 10 s.

Insertar descripción de la imagen aquí

Gráfico de forma de onda

Insertar descripción de la imagen aquí

Análisis de todo el proceso:
1. Permitir 3 veces por segundo al principio,
2. Aumentar gradualmente dentro de los primeros 10 segundos,
3. Alcanzar un valor estable después de 10 segundos y permitir 10 veces por segundo;

Insertar descripción de la imagen aquí

3. Espera en la fila

Hacer cola y esperar: también llamado modelado de tráfico, permite que las solicitudes pasen a una velocidad uniforme. El umbral de una sola máquina es el número de pases por segundo. El resto se pone en cola y espera durante un período de tiempo (es decir, El tiempo que configuramos, en milisegundos). Este tiempo no se excede. Se puede procesar a tiempo. Si no hay ningún hilo para procesar la interfaz solicitada después de este tiempo de espera, se lanzará una excepción.

Insertar descripción de la imagen aquí

Configuración de parámetros de JMeter

Insertar descripción de la imagen aquí

Gráfico de forma de onda

Insertar descripción de la imagen aquí

Proceso de política de limitación actual:
1. Permitir 10 por segundo
2. Enviar 50, pasar 10 y los 40 restantes ingresan a la cola para esperar:
3. Cuando no hay solicitudes, a través de las solicitudes esperando en la cola,

Insertar descripción de la imagen aquí

4.Modo de asociación

Asociación: La importancia de la interfaz /importante es mayor que la de la interfaz /normal. Si la presión de acceso de la interfaz /importante es muy alta, entonces la interfaz /normal` puede "sacrificarse" para garantizar el funcionamiento normal de /interfaz importante.

Insertar descripción de la imagen aquí

Configuración de parámetros de JMeter

Insertar descripción de la imagen aquí

Configuración del número de hilo

Insertar descripción de la imagen aquí

agregar es exitoso, obtener es limitado

Insertar descripción de la imagen aquí

En situaciones de alta concurrencia, la interfaz de adición no falla.

Insertar descripción de la imagen aquí

Suplemento: devolución de excepción límite actual personalizada

La información predeterminada devuelta por Sentinel está bloqueada por Sentinel (limitación de flujo). Si no está satisfecho con la información de respuesta predeterminada, puede personalizar la información de devolución de limitación de flujo.

Sentinel proporciona la interfaz BlockExceptionHandler. No importa qué cause que Sentinel bloquee la solicitud normal del usuario, Sentinel "ingresará" la clase de implementación de la interfaz BlockExceptionHandler definida por el usuario, ejecutará el método de manejo y pasará la solicitud actual, el objeto de respuesta y el objeto de excepción, y La ejecución El resultado del método de manejo se devuelve al usuario.

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);
    }
}

Cabe señalar que: no son solo las razones de limitación de corriente y disyuntor las que causarán la ejecución del método de manejo de BlockExceptionhandler, sino también otras razones que también llamarán a este método de manejo. Por lo tanto, es necesario realizar un juicio de instancia. en el objeto de parámetro BlockException del método de manejo.

5.Modo de enlace

Las ideas de limitación de corriente de enlace y limitación de corriente de asociación son muy similares. Supongamos que queremos solicitar un determinado microservicio. El microservicio tiene dos interfaces (/query y /add), y estas dos interfaces llaman a la misma capa de servicio. método (como : método doSomething()), entonces podemos configurarlo desde la perspectiva del método doSomething: si la interfaz /query llama al método doSomething de la capa de servicio, entonces la corriente es limitada y /add No hay límite actual para llamando a la interfaz, o se puede configurar en un control de flujo más relajado.

Desactive la función de convergencia de URL de Sentinel a través de la configuración

Insertar descripción de la imagen aquí

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";
    }
}

Insertar descripción de la imagen aquí

Modo de enlace, desde la perspectiva de los métodos de la capa de servicio.

Insertar descripción de la imagen aquí

Interfaz de adición de alta concurrencia, sin fallas

Insertar descripción de la imagen aquí

Haga clic rápidamente en el método obtener y se producirá una situación no válida.

Insertar descripción de la imagen aquí

3. Disyuntor y degradación de productores

3 estados de fusible:

  • Cerrado: estado cerrado, se accede a todas las solicitudes normalmente.

  • Abierto: estado abierto, todas las solicitudes se degradarán.

    Hystrix contará las solicitudes. Cuando el porcentaje de solicitudes fallidas alcance el umbral dentro de un cierto período de tiempo, el fusible se activará y el disyuntor se abrirá por completo. El umbral de tasa de error predeterminado es 50% y el número de solicitudes es al menos 20. El valor predeterminado es 20 solicitudes en cinco segundos. Si fallan 10 veces (50%), no se puede acceder a la solicitud normalmente.

  • Medio abierto: Estado medio abierto. El estado abierto no es permanente. Entrará en tiempo de suspensión después de la apertura (el valor predeterminado es 5S). El disyuntor entrará automáticamente en estado medio abierto.

    En este momento, algunas solicitudes se liberarán para que pasen. Si estas solicitudes están en buen estado, el disyuntor se cerrará por completo. De lo contrario, permanecerá abierto y el temporizador de apagado se iniciará nuevamente.

Insertar descripción de la imagen aquí

1. Número de excepciones

La siguiente configuración: envíe 2 solicitudes en un segundo. Si ocurre una falla (anormal), el disyuntor se desconectará directamente y luego se degradará.

Insertar descripción de la imagen aquí

Configuración de parámetros

Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

2. Proporciones anormales

Insertar descripción de la imagen aquí

Establecer método alternativo

Insertar descripción de la imagen aquí

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 establece el método alternativo

Insertar descripción de la imagen aquí

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);
}

Se produce una anomalía en el productor.

Insertar descripción de la imagen aquí

Prueba con cartero

Insertar descripción de la imagen aquí

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调用失效,请稍后重试");
    }
}

Insertar descripción de la imagen aquí

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. Proporción de llamadas lentas

La siguiente configuración: enviar 5 solicitudes en un segundo. Si el tiempo de respuesta de cada solicitud supera los 500 milisegundos y la relación alcanza 0,5 (50%), se realizará un disyuntor. La duración del disyuntor es de 10 segundos. Por ejemplo: hay 5 solicitudes en 1 segundo y el tiempo de respuesta de 3 de ellas supera los 500 milisegundos, entonces la relación es del 60%. Si es superior al 50%, el disyuntor se romperá y luego se degradará.

Insertar descripción de la imagen aquí

Probado con Jmeter, cuando id=1 en el programa, cada respuesta es de 800 milisegundos. Por lo tanto, cada solicitud demora más de 500 milisegundos y la tasa de falla es del 100%. En este momento, no se puede solicitar el recurso con id = 4 porque el disyuntor está roto, por lo que se degrada directamente. Será normal volver a solicitar id=4 después de 10 segundos.


Resumir

1. El uso de centinela introduce dependencias y configuraciones,
2. Control de flujo para los consumidores,
3. Disyuntores y degradaciones para los productores.

Supongo que te gusta

Origin blog.csdn.net/Pireley/article/details/133420975
Recomendado
Clasificación