Sentinel持久化【无改造】

101 阅读2分钟

前提概述

大家都知道,Sentinel是一款阿里的开源限流工具,不过目前没有持久化功能,每次配好的参数,重启后,就会丢失,所以本次集成Gateway+Sentinel+nacos,通过nacos配置中心读取参数,来单向持久化。

nacos持久化方案有多中 方案一:sentinel持久化到nacos。 方案二:nacos持久化推送到sentinel。

单向持久化方案

思路是直接从nacos中获取配置参数,适配到sentinel中。如果把改造当做是做手术,从sentinel持久化到nacos,就像是开膛破肚的大手术,本次改造就是一个无创手术。 方案一网上有很多案例,这里就不多做赘述。本次重点是方案二中的参数

网关配置文件

spring:
  application:
    # 应用名称
    name: iuv-gateway
  profiles:
    # 环境配置
    active: dev
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        # 认证中心
        - id: iuv-auth
          uri: lb://iuv-auth
          predicates:
            - Path=/auth/**
        # 系统模块
        - id: iuv-system
          uri: lb://iuv-system
          predicates:
            - Path=/system/**
          filters:
            - StripPrefix=1
    nacos:
      discovery:
        # 服务注册地址
        server-addr: ${NACOS_HOST:node29}:${NACOS_PORT:8848}
        service: ${spring.application.name}
        namespace: public
        username: nacos
        password: nacos
      config:
        # 配置中心地址
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        # 配置文件格式
        file-extension: yml
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
        namespace: ${spring.cloud.nacos.discovery.namespace}
        username: ${spring.cloud.nacos.discovery.username}
        password: ${spring.cloud.nacos.discovery.password}
    sentinel:
      # 取消控制台懒加载
      eager: true
      transport:
        # 控制台地址
        dashboard: ${NACOS_HOST:node29}:8686
      # nacos配置持久化
      datasource:
        ds1:
          nacos:
            server-addr: ${NACOS_HOST:node29}:8848
            username: ${spring.cloud.nacos.discovery.username}
            password: ${spring.cloud.nacos.discovery.password}
            dataId: sentinel-iuv-gateway
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: gw-flow

SentinelFallbackHandler

/**
 * 自定义限流异常处理
 */
public class SentinelFallbackHandler implements WebExceptionHandler
{
    private Mono<Void> writeResponse(ServerResponse response, ServerWebExchange exchange)
    {
        return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求超过最大数,请稍候再试");
    }

    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex)
    {
        if (exchange.getResponse().isCommitted())
        {
            return Mono.error(ex);
        }
        if (!BlockException.isBlockException(ex))
        {
            return Mono.error(ex);
        }
        return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange));
    }

    private Mono<ServerResponse> handleBlockedRequest(ServerWebExchange exchange, Throwable throwable)
    {
        return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable);
    }
}

限流规则

根据网关中配置的dataId: sentinel-iuv-gateway,配置限流规则

[
    {
        "resource": "iuv-auth",//限流资源
        "count": 501,//限流大小
        "grade": 1,//1为qps,0为线程数
        "limitApp": "default",
        "strategy": 0,
        "controlBehavior": 0,//流控方式0快速失败2匀速排队
        "paramItem": {
            "parseStrategy": 2,//参数属性2是Header
            "fieldName": "interfaceNO",//属性名称
            "pattern": "BT002",//匹配内容
            "matchStrategy": 3//匹配模式3子串0精准2正则
        }
    },
	{
        "resource": "iuv-system",
        "count": 1002,
        "grade": 1,
        "limitApp": "default",
        "strategy": 0,
        "controlBehavior": 0
    }
]
参数说明
parseStrategyClient IP为0,Remote Host为1,Header为2,URL 参数为3,Cookie为4
matchStrategy匹配模式3子串0精准2正则
fieldName属性名称
pattern匹配内容

配置中心改后生效。官网和帖子上都没有这些参数配置,因此,本次主要提供了带参数的配置方法。这只是一个讨巧的方式解决方式。谢谢大家,记得一键三连!

博客地址

本文由博客一文多发平台 OpenWrite 发布!