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