Combate práctico: Springboot integra Sentinel para lograr control de flujo, degradación del disyuntor y protección de carga

Artículo Tabla de contenidos
    Prefacio
    Acumulación de conocimientos
        Control de tráfico
        Protección de carga
        Degradación de fusión
        Documentación oficial Ejercicio práctico         Implementar panel centinela
    Implementación             directa de paquetes jar             Docker-compose         Orquestación Integración Springboot             Infraestructura Sentinel Construir             consola Sentinel Extensión             de verificación Sentinel     : Sistema de limitación de corriente adaptable         Principio         de reglas del sistema     Escritura         de página de configuración al final











01

prefacio

En el artículo anterior, conocimos Hystrix y lo integramos con el proyecto Springboot para implementar medidas de disyuntor, degradación y aislamiento para servicios. Sin embargo, Hystrix no controla muy bien el tráfico. Los semáforos por sí solos sólo pueden limitar el flujo de interfaces específicas. En cuanto al mecanismo de protección, Hystrix sólo puede fusionarse cuando se alcanza el objetivo. Entonces, ¿existe un middleware que pueda implementar con precisión el control de flujo y la protección de carga y al mismo tiempo sea compatible con la degradación del interruptor automático? La respuesta es, por supuesto, nuestro protagonista de hoy, Spring Cloud Alibaba Sentinel.

imagen

02

acumulación de conocimientos

Sentinel es un componente de protección de tráfico de alta disponibilidad para arquitectura de servicios distribuidos. Utiliza principalmente el tráfico como punto de entrada para ayudar a los desarrolladores a garantizar la estabilidad de los microservicios desde múltiples dimensiones, como limitación de corriente, configuración del tráfico, degradación de disyuntores, protección de carga del sistema y protección de puntos de acceso. .

control de flujo

Sentinel puede realizar el control de configuración de procesos de acuerdo con indicadores específicos para diferentes relaciones de llamada. Además, las estrategias de configuración incluyen tres modos: rechazo directo, precalentamiento de inicio lento y ecualizador. Los desarrolladores pueden seleccionar estrategias según sus propias necesidades para lograr un control preciso del tráfico.

protección de carga

Sentinel puede proporcionar un mecanismo de protección de carga preciso. Si el servicio llamado alcanza la carga máxima, la carga de solicitudes se equilibrará con otros proveedores de servicios. Si otros servicios también alcanzan la carga máxima, el mecanismo de protección de servicios se activará para permitir el tráfico de solicitudes. y carga de servicio para alcanzar el equilibrio.

degradación del disyuntor

Sentinel también proporciona un disyuntor básico y una función de degradación. Si el servicio se lanza una vez, se degradará directamente usando la lógica alternativa. Si es un indicador de configuración, se usará la lógica blockhander. Por supuesto, si el clúster de servicio alcanza la carga máxima, realizará una función de disyuntor para evitar avalanchas de servicio.

Documentación oficial

https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

imagen

03

Ejercicios practicos

Implementar panel centinela

Descargue el paquete jar
https://github.com/alibaba/Sentinel/releases

imagen

Implementación directa del paquete jar

nohup java -jar -Dserver.port=8109 sentinel-dashboard.jar &

orquestación de composición acoplable

Si es posible, puede utilizar la imagen del panel directamente. Si la extracción es lenta, considere crear la imagen usted mismo.
archivo acoplable

# this is sentinel-dashboard dockerfile
# version 1.0
# 基础镜像
FROM openjdk:8-jre
# 维护人
MAINTAINER senfel<[email protected]>
#jar
COPY ./sentinel-dashboard.jar /home/app.jar
# 端口
EXPOSE 8109
# 执行命令启动jar
ENTRYPOINT ["java","-jar","/home/app.jar"]

docker-compose.yml

version: '3.3'
services:
  sentinel:
    build: ./
    image: senfel/sentinel-dashboard
    container_name: sentinel-dashboard
    ports:
      - 8109:8109
    environment:
      JVM_OPTS: -server -Xmx512M -Xms512M -XX:MaxMetaspaceSize=256M -XX:CompressedClassSpaceSize=50M -XX:ReservedCodeCacheSize=240M -XX:MaxDirectMemorySize=400M
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "1"
    volumes:
      - "/home/test/demo/sentinel/logs:/root/logs"
      - "/home/test/demo/sentinel/logs:/app-logs"
    command: [
      "--server.port=8109",
      "--logging.file.path=/app-logs"
    ]

Construya e inicie el contenedor.

docker-compose up -d --build

Ver contenedor centinela

docker ps | grep sentinel

imagen

centinela integrado springboot

Construcción de infraestructura

Reglas de control de tráfico persistentes, otras reglas solo necesitan agregar configuración.
Sentinel persiste en nacos. Si no es persistente, las reglas se borrarán cada vez que se reinicie.

Agregar dependencia de maven

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--sentinel持久化到nacos 不持久每次重启都会清除规则-->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.0</version>
</dependency>

Agregue bootstrap.yml para configurar nacos para que lo construya usted mismo

server:
  port: 9999
spring:
  application:
    name: test-demo
  profiles:
    active: uat
  cloud:
    nacos:
      config:
        server-addr: 10.10.18.16:8848,10.10.18.16:2848,10.10.18.16:5848
        username: nacos
        password: nacos
        file-extension: yaml
      discovery:
        server-addr: 10.10.18.16:8848,10.10.18.16:2848,10.10.18.16:5848
        username: nacos
        password: nacos
    sentinel:
      transport:
        dashboard: 10.10.22.174:8109
        port: 8719
      datasource:
        ds1:
          nacos:
            server-addr: 10.10.18.16:8848,10.10.18.16:2848,10.10.18.16:5848
            dataId: test-demo-sentinel.json
            data-type: json
            rule-type: flow
            username: nacos
            password: nacos
            
#开启sentinel
feign:
  sentinel:
    enabled: true
  circuitbreaker:
    enabled: true

nacos nueva configuración de limitación actual


Recurso de control de flujo :
límite de nombre de recurso Aplicación: grado de aplicación de origen
: tipo de umbral, 0 representa el número de subprocesos, 1 representa el recuento de QPS : estrategia de
umbral de clic : modo de control de flujo, 0 representa directo, 1 representa asociación, 2 representa control de enlace Comportamiento: control de flujo Efecto, 0 representa falla rápida, 1 representa calentamiento, 2 representa espera en línea Modo de clúster: si se debe agrupar


-Otras reglas son similares y no se repetirán aquí.
-La configuración de Nacos no tiene nada que ver con este artículo y no se repetirá aquí.

[
  {
    "resource": "testFeign",
    "limitApp": "default",
    "grade":   1,
    "count":   1,
    "strategy": 0,
    "controlBehavior": 0,
    "clusterMode": false
  }
]

Inicia la clase para habilitar fingir y nacos.

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@Slf4j
public class TestDemoApplication implements ApplicationRunner {

    public static void main(String[] args) {
        SpringApplication.run(TestDemoApplication.class, args);
    }
}

caso de prueba

/**
 * testFeign
 * fallback只负责业务异常
 * blockHandler只负责sentinel配置超标
 * 两个都配置,如果都出错,会进入blockHandler
 * @param str
 * @author senfel
 * @date 2023/7/11 14:26
 * @return java.lang.String
 */
@SentinelResource(value = "testFeign",blockHandler = "blockHandler",fallback = "handlerFallback")
@GetMapping("/testFeign")
public String testFeign(String str){
    if(str.contains("y")){
        throw new RuntimeException();
    }
    return testMQService.testFeign(str);
}

/**
 * 异常阻塞处理
 * @param str
 * @author senfel
 * @date 2023/7/11 14:44
 * @return java.lang.String
 */
private String blockHandler(String str, BlockException blockException){
    return "blockHandler"+"-"+str;
}

/**
 * 降级处理
 * @param str
 * @author senfel
 * @date 2023/7/11 14:44
 * @return java.lang.String
 */
private String handlerFallback(String str,Throwable throwable){
    return "handlerFallback"+"-"+str;
}

caso de prueba de degradación de openfeign

/**
 * @author senfel
 * @version 1.0
 * @date 2023/7/03 15:04
 */
@Service
@FeignClient(value = "test-demo",fallback = FallbackService.class)
public interface TestService {

    /**
     * 测试sentinel
     */
    @GetMapping("/feign")
    String feign(@RequestParam String str);


}



/**
 * FallbackService
 * @author senfel
 * @version 1.0
 * @date 2023/7/3 15:26
 */
@Service
public class FallbackService implements TestService {

    @Override
    public String feign(String str) {
        return ">>>>>客户端服务降级>>>>>";
    }
}

consola centinela

Consulte http://10.10.22.174:8109/ después de la solicitud del cartero

imagen

Cargar automáticamente reglas de tráfico configuradas

imagen

imagen

verificación centinela

Verificar el tráfico de control activo
127.0.0.1:9999/testFeign?str=fffffffffss

imagen

Verificar el tráfico de control anormal
127.0.0.1:9999/testFeign?str=ffffffffffyy

imagen

Verifique que el cliente finja una degradación
127.0.0.1:9999/testFeign?str=fffffffffss

imagen

Ver monitoreo en tiempo real

imagen

04

Extensión: limitación de corriente adaptativa del sistema

Reglas del sistema

Las reglas de protección del sistema se controlan desde el tráfico de ingreso a nivel de la aplicación y los indicadores de la aplicación se monitorean desde varias dimensiones, como la carga de una sola máquina, el uso de la CPU, el RT promedio, el QPS de ingreso y la cantidad de subprocesos simultáneos, para que el sistema pueda ejecutarse a el máximo rendimiento posible, garantizando al mismo tiempo la estabilidad general del sistema.
Las reglas de protección del sistema se aplican en la dimensión general, no en la dimensión de recursos, y solo tienen efecto en el tráfico de entrada. El tráfico de entrada se refiere al tráfico que ingresa a la aplicación (EntryType.IN), como las solicitudes recibidas por los servicios web o los servidores Dubbo, todos pertenecen al tráfico de entrada.
Las reglas del sistema admiten los siguientes modos:
Carga adaptativa (válido solo para máquinas tipo Linux/Unix): la carga1 del sistema se utiliza como indicador heurístico para la protección adaptativa del sistema. La protección del sistema (fase BBR) se activará cuando la carga del sistema1 exceda el valor heurístico establecido y el número actual de subprocesos simultáneos en el sistema exceda la capacidad estimada del sistema. La capacidad del sistema se estima mediante maxQps * minRt del sistema. El valor de referencia de configuración es generalmente núcleos de CPU * 2,5.
Uso de CPU (versión 1.5.0+): cuando el uso de CPU del sistema excede el umbral, se activa la protección del sistema (rango de valores 0.0-1.0), que es relativamente sensible.
RT promedio: cuando el RT promedio de todo el tráfico de entrada en una sola máquina alcanza el umbral, se activa la protección del sistema. La unidad es milisegundos.
Número de subprocesos simultáneos: cuando el número de subprocesos simultáneos para todo el tráfico de entrada en una sola máquina alcanza el umbral, se activa la protección del sistema.
QPS de ingreso: cuando el QPS de todo el tráfico de ingreso en una sola máquina alcanza el umbral, se activa la protección del sistema.

principio

Imaginamos el proceso de procesamiento de solicitudes del sistema como una tubería de agua. Las solicitudes entrantes se llenan con agua en esta tubería de agua. Cuando el sistema procesa sin problemas, la solicitud no necesita estar en cola y pasa directamente a través de la tubería de agua. El RT de esta solicitud es el más corto; por el contrario, cuando las solicitudes se acumulan, el tiempo para procesarlas será: tiempo de cola + tiempo mínimo de procesamiento.

imagen

Página de configuración

imagen

05

aprobar

El uso real de Sentinel para lograr control de flujo, degradación de disyuntores y protección de carga es relativamente simple: solo necesita integrarse y configurarse de acuerdo con el artículo oficial. El control de tráfico, la protección de carga y el alto rendimiento de Sentinel son mejores que los de hystrix y proporciona una consola visual. Si se encuentra en un escenario de clúster de servicios donde la disponibilidad y la confiabilidad son altas e importantes, se le puede dar prioridad a Sentinel.

Supongo que te gusta

Origin blog.csdn.net/qq_45635347/article/details/132515945
Recomendado
Clasificación