Solo se necesitan tres pasos para realizar Gateway combinado con Sentinel para realizar una limitación de corriente de puerta de enlace no intrusiva, ¡preste atención para evitar trampas!

Prefacio: este artículo se basa en su sistema de microservicio básico y operativo existente, utilizando Sping Cloud Alibaba, Gateway, Nacos, etc.; el objetivo es lograr la limitación de flujo del tipo de control de flujo de la puerta de enlace.

Como su nombre lo indica, la limitación actual se usa para limitar la entrada de tráfico de solicitudes en escenarios de alta simultaneidad para evitar que el sistema se vea abrumado. El centinela de código abierto de Alibaba puede proteger diferentes recursos al establecer diferentes tipos de reglas.

  • Recurso: puede ser cualquier cosa; servicio, método, código...
  • Reglas: reglas de control de flujo, reglas de degradación de fusibles, reglas de protección del sistema, reglas de puntos de acceso, reglas de agrupación de API de puerta de enlace, reglas de control de flujo de puerta de enlace

La correspondencia entre las versiones utilizadas en este artículo es la siguiente (enlace oficial: correspondencia de versiones)

<spring.boot>2.6.7</spring.boot>
<spring-cloud>2021.0.2</spring-cloud>
<spring-cloud-alibaba>2021.0.4.0</spring-cloud-alibaba>

El objetivo de este artículo

  • Centinela de integración de microservicios
  • Use el cliente Sentinel para generar reglas de limitación de corriente de puerta de enlace y persistirlas en nacos
  • La regla entra en vigor y produce un efecto de limitación de corriente

estrategia de tres pasos


1. Integrar centinela

1.1 Integración del servidor

1.1.1 Importar pom

<!--网关组件-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!--sentinel限流-->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!-- SpringCloud Ailibaba Sentinel Gateway -->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

<!-- 通过nacos持久化流控规则 -->
<dependency>
   <groupId>com.alibaba.csp</groupId>
   <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

Para configurar Sentinel Starter, debe haber dependencias spring-cloud-alibaba-sentinel-gateway y spring-cloud-starter-gateway para que la clase de configuración automática Spring Cloud Gateway en el módulo spring-cloud-alibaba-sentinel-gateway surta efecto.

Punto a evitar 1: para acceder a Sentinel a través de Spring Cloud Alibaba, debe establecer el elemento de configuración spring.cloud.sentinel.filter.enabled en falso (la granularidad predeterminada del control de flujo de la puerta de enlace es ruta y dimensión de agrupación API personalizada, la granularidad de URL no es soportado)

Punto a evitar 2: a través del módulo de fuente de datos Spring Cloud Alibaba Sentinel, el tipo de fuente de datos de la regla de control de flujo de la puerta de enlace es gw-flow en lugar de flujo

1.1.2 Escritura de archivos de configuración de reglas

Cree un nuevo archivo application-sentinel.yaml en gatewaymodule

reglas de configuración

spring:
  cloud:
    sentinel:
      enabled: true
      datasource:
        ds1:
          nacos:
            server-addr: ${spring.cloud.nacos.config.server-addr}
            namespace: ${spring.cloud.nacos.config.namespace}
            data-id: ${spring.application.name}-gateway-flow-rules
            group-Id: SENTINEL_GROUP
            rule-type: gw-flow
            data-type: json
        ds2:
          nacos:
            server-addr: ${spring.cloud.nacos.config.server-addr}
            namespace: ${spring.cloud.nacos.config.namespace}
            data-id: ${spring.application.name}-gateway-api-rules
            group-Id: SENTINEL_GROUP
            rule-type: gw-api-group
            data-type: json
          ds3:
            nacos:
              server-addr: ${spring.cloud.nacos.config.server-addr}
              namespace: ${spring.cloud.nacos.config.namespace}
              data-id: ${spring.application.name}-degrade-rules
              group-Id: SENTINEL_GROUP
              rule-type: degrade
              data-type: json
          ds4:
            nacos:
              server-addr: ${spring.cloud.nacos.config.server-addr}
              namespace: ${spring.cloud.nacos.config.namespace}
              data-id: ${spring.application.name}-system-rules
              group-Id: SENTINEL_GROUP
              rule-type: system
              data-type: json
      log:
        dir: /home/omo/sentinel/logs
        # 启用向sentinel发送心跳
      eager: true
      scg:
        fallback:
          response-status: 429
          mode: response
          response-body: '{"code": 429,"message": "前方拥堵,请稍后再试!"}'

1. El panel de Sentinel generará reglas que comienzan con spring.application.name de forma predeterminada, y ds1 y ds2 son los tipos de esta prueba

2. tipo de datos es el tipo de datos de lectura, aquí se establece en json

3. El respaldo final se configura con una respuesta personalizada después de ser limitado

1.1.3 Configurar el puerto de comunicación

Configuración del puerto de comunicación entre el servicio y el panel de Sentinel

spring:
  cloud:
    sentinel:
      transport:
        # sentinel控制台地址
        dashboard: localhost:8081
        # 跟sentinel控制台交流的端口,随意指定一个未使用的端口即可,默认是8719
        port: 8719
        # Get heartbeat client local ip
        clientIp: 127.0.0.1

1.2.Integración del panel Sentinel

Sentinel 1.6.3 introdujo el soporte de la consola de control de flujo de puerta de enlace, puede ver directamente la ruta en tiempo real de API Gateway y el monitoreo de grupo API personalizado en la consola Sentinel, administrar las reglas de puerta de enlace y la configuración del grupo API

Primero, debe descargar el código del proyecto de la consola, modificarlo y compilarlo usted mismo. También puede usar mi proyecto modificado, listo para usar: sentinel-dashboard-1.8.6, el proyecto modificado admite la gestión de configuración de múltiples reglas, inserción de reglas (empujar a nacos)

Configure la dirección y el espacio de nombres de nacos antes del inicio (application.properties)

Configuración de parámetros de inicio (IDEA)

-Dserver.port=8081 -Dcsp.sentinel.dashboard.server=localhost:8081 -Dproject.name=sentinel-dashboard

Despues de los efectos

2.Persistencia de la regla del modo Push

proceso de modo de empuje

(Al descargar la versión oficial del panel de Sentinel, debe implementarlo usted mismo. Las personas perezosas pueden usar directamente la versión modificada que proporcioné anteriormente)

Los puntos básicos de modificación se enumeran a continuación.

2.1 Modificar la clase nacosConfig

@Bean
public ConfigService nacosConfigService() throws Exception {
    Properties properties = new Properties();
    //nacos地址
    properties.put(PropertyKeyConst.SERVER_ADDR, nacosAddr);
    //namespace为空即为public
    properties.put(PropertyKeyConst.NAMESPACE, namespace);
    return ConfigFactory.createConfigService(properties);
}

Y el proveedor y editor del tipo de regla correspondiente, tome GatewayFlowRule como ejemplo:

2.2 Modificar la implementación de las reglas de publicación (editor)

@Component("gatewayFlowRuleNacosPublisher")
public class GatewayFlowRuleNacosPublisher implements DynamicRulePublisher<List<GatewayFlowRuleEntity>> {

    @Autowired
    private ConfigService configService;

    @Autowired
    private Converter<List<GatewayFlowRuleEntity>, String> converter;

    @Override
    public void publish(String app, List<GatewayFlowRuleEntity> rules) throws Exception {
        AssertUtil.notEmpty(app, "app name cannot be empty");
        if (rules == null) {
            return;
        }
        configService.publishConfig(app + NacosConfigUtil.GATEWAY_FLOW_DATA_ID_POSTFIX,
                NacosConfigUtil.GROUP_ID, converter.convert(rules));
    }
}

2.3 Modificar la implementación de la regla de adquisición (proveedor)

@Component("gatewayFlowRuleNacosProvider")
public class GatewayFlowRuleNacosProvider implements DynamicRuleProvider<List<GatewayFlowRuleEntity>> {
    @Autowired
    private ConfigService configService;

    @Autowired
    private Converter<String, List<GatewayFlowRuleEntity>> converter;

    @Override
    public List<GatewayFlowRuleEntity> getRules(String appName) throws Exception {
        String rules = configService.getConfig(appName + NacosConfigUtil.GATEWAY_FLOW_DATA_ID_POSTFIX,
                NacosConfigUtil.GROUP_ID, 3000);
        if (StringUtil.isEmpty(rules)) {
            return new ArrayList<>();
        }
        return converter.convert(rules);
    }
}

2.4 Modificar la interfaz correspondiente

(GatewayFlowRuleController)

introducir

@Autowired
@Qualifier("gatewayFlowRuleNacosProvider")
private DynamicRuleProvider<List<GatewayFlowRuleEntity>> ruleProvider;

@Autowired
@Qualifier("gatewayFlowRuleNacosPublisher")
private DynamicRulePublisher<List<GatewayFlowRuleEntity>> rulePublisher;

Luego modifique la implementación en el método de agregar, eliminar, modificar y verificar. Para obtener más detalles, consulte: sentinel-dashboard-1.8.6

3. Configurar reglas y probar el efecto de limitación actual

3.1 iniciar panel de centinela

Los pasos de puesta en marcha se describen arriba.

3.2 Configurar las reglas de limitación de corriente de la puerta de enlace

3.2.1 Configuración de reglas de tipo de ruta

Configure QPS = 5 para el servicio de usuario (la identificación en la configuración de enrutamiento de su puerta de enlace), y el método de control de flujo es la regla de falla rápida

Vaya al fondo de nacos para ver los detalles de la regla, que se han sincronizado con nacos

También modificado en nacos, el tablero también se actualizará sincrónicamente y ya no se mostrará. (Para conocer el significado de los atributos de la regla, consulte: campo de límite actual)

3.2.2 Configurar reglas de tipo de agrupación de API

Primero configure la agrupación API

Luego configure las reglas (desplegable para seleccionar el grupo que acaba de configurar, y también establezca QPS=5)

3.3 Efecto de limitación de la corriente de prueba

3.3.1 Limitación de corriente del tipo de ruta

Establecer el bucle de configuración del caso de prueba 10 veces

Los resultados de la prueba fueron 5 éxitos y 5 fracasos, que cumplieron con las expectativas, ¡y listo!

3.3.2 Límite de corriente del grupo API

Puede ver que la ruta a /auth/oms/** en el informe de prueba coincide y el límite actual puede tener efecto

4. Ampliar

  • Principio de control de flujo de puerta de enlace, consulte el sitio web oficial para obtener más detalles

  • Al usar SpringCloud Gateway y SpringCloud Sentinel, el oficial no admite fusibles estadísticos anormales para códigos de respuesta 4xx, 5xx, puede implementarlo usted mismo, consulte el problema 1842, problema 2537

Supongo que te gusta

Origin blog.csdn.net/mxt51220/article/details/131721660
Recomendado
Clasificación