• sentinel整合nacos在gateway中实现限流


    sentinel整合nacos在gateway中实现限流

    一、应用层面完成网关整合nacos和sentinel实现限流

    前沿

    启动nacos与sentinel的jar的启动,这里不细讲

    sentinel官网 https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5
    sentinel 下载地址 https://github.com/alibaba/Sentinel/releases
    nacos官网 https://nacos.io/zh-cn/docs/deployment.html
    nacos下载地址https://github.com/alibaba/nacos/releases

    1.1 导报

    在gateway中导入所需的jar

     
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-sentinel-gatewayartifactId>
                <version>2.2.1.RELEASEversion>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
                <version>2.2.1.RELEASEversion>
            dependency>
            <dependency>
                <groupId>com.alibaba.cspgroupId>
                <artifactId>sentinel-datasource-nacosartifactId>
                <version>1.8.0version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    集成nacos的注册中心与配置中心

       
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
                <version>2.2.1.RELEASEversion>
            dependency>
            
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
                <version>2.2.1.RELEASEversion>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1.2 配置文件(仅展示整合sentinel部分)
    # 应用名称
    spring:
      cloud:
        sentinel:
          transport:
          	# sentinel的连接地址
            dashboard: localhost:7777
            # sentinel与服务的通信端口,只要不冲突就行
            port: 8720
            # 取消控制台懒加载
          eager: true
          # 获取sentinel配置在nacos的文件信息
          datasource:
            ds1:
              nacos:
              	# nacos的地址
                server-addr: ${spring.cloud.nacos.discovery.server-addr}
                # nacos的文件名称
                data-id: gateway-flow-rule-sentinel
                # 在nacos的命名空间  注意public空间下不能设置为public否则获取不到配置,如果在public就不写此行
                namespace: 49dc14c4-e3a6-48de-a773-6fdda300424f   
                # 分组名称
                group-id: DEFAULT_GROUP
                # 文件类型
                data-type: json
                  # 规则类型: com.alibaba.cloud.sentinel.datasource.RuleType
                  # FlowRule 就是限流规则
                rule-type: gw-flow
            ds2:
              nacos:
                server-addr: ${spring.cloud.nacos.discovery.server-addr}
                data-id: gateway-flow-rule-api-sentinel
                namespace: 49dc14c4-e3a6-48de-a773-6fdda300424f   # 注意public空间下不能显示的设置为public否则获取不到配置
                group-id: DEFAULT_GROUP
                data-type: json
                # 规则类型: com.alibaba.cloud.sentinel.datasource.RuleType
                # FlowRule 就是限流规则
                rule-type: gw-api-group
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    1.3 编写配置类
    @Slf4j
    @Configuration
    public class GatewayConfiguration {
        
        private final List<ViewResolver> viewResolvers;
        private final ServerCodecConfigurer serverCodecConfigurer;
    
        public GatewayConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider,
                                    ServerCodecConfigurer serverCodecConfigurer) {
            this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
            this.serverCodecConfigurer = serverCodecConfigurer;
        }
    
        @Bean
        @Order(Ordered.HIGHEST_PRECEDENCE)
        public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
            // Register the block exception handler for Spring Cloud Gateway.
            return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
        }
    
        @Bean
        @Order(Ordered.HIGHEST_PRECEDENCE)
        public GlobalFilter sentinelGatewayFilter() {
            return new SentinelGatewayFilter();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    1.4 编写返回自定义限流拦截信息(如果不写此类返回就是429)
    @Configuration
    public class SentinelGatewayConfig {
        public SentinelGatewayConfig() {
            GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
                @Override
                public Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable t) {
                    R error = R.error(500, "限流啦 别在试啦");
                    String errorStr = JSON.toJSONString(error);
                    Mono<ServerResponse> just = ServerResponse.ok().body(Mono.just(errorStr), String.class);
                    return just;
                }
            });
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    注:如果启动后sentinel的画面没有API菜单,那就在启动类main函数里加上

      // 添加此代码,在Sentinel控制台中做判断使用
            System.setProperty("csp.sentinel.app.type", "1");
    
    • 1
    • 2
    1.5 限流json文件

    文件位置
    在这里插入图片描述

    gateway-flow-rule-sentinel的配置内容

    [
        {
        "resource": "macro-member",
        "resourceMode": 0,
        "count": 1,
        "intervalSec": 60
      },
      {
        "resource": "macro-member-api",
        "resourceMode": 1,
        "count": 2,
        "intervalSec": 60
       }
      ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    gateway-flow-rule-api-sentinel

    [{
     "apiName": "macro-member-api",
        "predicateItems": [
          {
            "pattern": "/api/member/sysUser/getUsers"
          },
          {
            "pattern": "/imooc/ecommerce-nacos-client/**",
            "matchStrategy": 1
          },
            {
            "pattern": "/api/member/sysUser/getUserByName"
          }
        ]
    }]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1.6 测试

    访问效果是达到了限流的目的
    在这里插入图片描述
    nacos的限流规则更改,sentinel控制台能马上感应到

    在这里插入图片描述

    二、sentinel限流原理

    Sentinel中的令牌桶算法采用固定窗口算法,将时间窗口分成若干个固定长度的小窗口,并在每个小窗口开始时向令牌桶中添加一定数量的令牌。每次请求需要获取一个令牌才能执行,如果令牌桶中的令牌数量不足,则请求将被拒绝。通过调整每个小窗口的长度和每次添加的令牌数量,可以控制限流的速率

    配置参数的含义

    FIELD说明默认值
    resource资源名,资源名是限流规则的作用对象
    count限流阈值
    grade限流阈值类型,QPS 模式(1)或并发线程数模式(0)QPS 模式
    limitApp流控针对的调用来源default,代表不区分调用来源
    strategy调用关系限流策略:直接、链路、关联根据资源本身(直接)
    controlBehavior流控效果(直接拒绝/WarmUp/匀速+排队等待),不支持按调用关系限流直接拒绝
    resource资源名,资源名是限流规则的作用对象直接拒绝
    resourceMode限流方式 0-服务限流 1-分组限流
    intervalSec统计时间窗口,单位是秒1
    matchStrategy参数值的匹配策略目前支持精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正则匹配(PARAM_MATCH_STRATEGY_REGEX)
  • 相关阅读:
    【构建并发程序】4-原子变量-CAS-ABA问题
    前端开发核心知识进阶 setTime相关考察
    光伏含氟废水吸附处理
    使用 Docker 部署 Draw.io 在线流程图系统
    RabbitMQ保姆级教程最佳实践
    通过usb串口发送接收数据
    LeetCode557. 反转字符串中的单词 III
    大数据技术从业者注意了!使用代理IP时避开这些误区
    详解ES6的Promise
    【数组】通过翻转子数组使两个数组相等
  • 原文地址:https://blog.csdn.net/m0_37635053/article/details/136272399