当前位置: 首页 > news >正文

java B2B2C springmvc mybatis多租户电子商城系统-gateway 限流

Spring Cloud Gateway限流

在Spring Cloud Gateway中,有Filter过滤器,因此可以在“pre”类型的Filter中自行实现上述三种过滤器。需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码 一零三八七七四六二六,但是限流作为网关最基本的功能,Spring Cloud Gateway官方就提供了RequestRateLimiterGatewayFilterFactory这个类,适用Redis和lua脚本实现了令牌桶的方式。

具体源码不打算在这里讲述,读者可以自行查看,代码量较少,先以案例的形式来讲解如何在Spring Cloud Gateway中使用内置的限流过滤器工厂来实现限流。

首先在工程的pom文件中引入gateway的起步依赖和redis的reactive依赖,代码如下:


 <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifatId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

复制代码

在配置文件中做以下的配置:


server:
  port: 8081
spring:
  cloud:
    gateway:
      routes:
      - id: limit_route
        uri: http://httpbin.org:80/get
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]
        filters:
        - name: RequestRateLimiter
          args:
            key-resolver: '#{@hostAddrKeyResolver}'
            redis-rate-limiter.replenishRate: 1
            redis-rate-limiter.burstCapacity: 3
  application:
    name: gateway-limiter
  redis:
    host: localhost
    port: 6379
    database: 0


复制代码

在上面的配置文件,指定程序的端口为8081,配置了 redis的信息,并配置了RequestRateLimiter的限流过滤器,该过滤器需要配置三个参数:

burstCapacity,令牌桶总容量。

replenishRate,令牌桶每秒填充平均速率。

key-resolver,用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据#{@beanName}从 Spring 容器中获取 Bean 对象。

KeyResolver需要实现resolve方法,比如根据Hostname进行限流,则需要用hostAddress去判断。实现完KeyResolver之后,需要将这个类的Bean注册到Ioc容器中。


public class HostAddrKeyResolver implements KeyResolver {

    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }

}

 @Bean
    public HostAddrKeyResolver hostAddrKeyResolver() {
        return new HostAddrKeyResolver();
    }

复制代码

可以根据uri去限流,这时KeyResolver代码如下:


public class UriKeyResolver  implements KeyResolver {

    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(exchange.getRequest().getURI().getPath());
    }

}

 @Bean
    public UriKeyResolver uriKeyResolver() {
        return new UriKeyResolver();
    }

 

复制代码

也可以以用户的维度去限流:


   @Bean
    KeyResolver userKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
    }


复制代码

用jmeter进行压测,配置10thread去循环请求lcoalhost:8081,循环间隔1s。从压测的结果上看到有部分请求通过,由部分请求失败。通过redis客户端去查看redis中存在的key。如下:

可见,RequestRateLimiter是使用Redis来进行限流的,并在redis中存储了2个key。

java B2B2C springmvc mybatis多租户电子商城系统 

转载于:https://juejin.im/post/5cac0289f265da03a00facd8

相关文章:

  • 秦初霜:暴风雨前的平静!接下来这五件事需要密切关注!
  • 第三章:进程管理-进程描述符及任务结构
  • 嵌入式编程(二):ARM单片机如何将函数 定义到指定程序地址
  • 透过3D立方体深入理解perspective和translateZ的关系
  • 深入理解静态代理与JDK动态代理
  • 常见漏洞解析
  • [转] 谈谈前端异常捕获与上报
  • Apache Tomcat 8.5.40 与 7.0.94 发布
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 线程同步利与弊,线程同步的前提
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • Python数据类型、运算符、语句、循环
  • 激活效能,CODING 敏捷研发模块上线
  • cmd中subst的使用
  • [MySQL光速入门]003 留点作业...
  • Google 是如何开发 Web 框架的
  • 《深入 React 技术栈》
  • Android系统模拟器绘制实现概述
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Intervention/image 图片处理扩展包的安装和使用
  • Java 内存分配及垃圾回收机制初探
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • leetcode386. Lexicographical Numbers
  • LintCode 31. partitionArray 数组划分
  • Phpstorm怎样批量删除空行?
  • rc-form之最单纯情况
  • SQLServer之创建数据库快照
  • Vue官网教程学习过程中值得记录的一些事情
  • XForms - 更强大的Form
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 基于游标的分页接口实现
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 项目实战-Api的解决方案
  • ​油烟净化器电源安全,保障健康餐饮生活
  • (1)(1.13) SiK无线电高级配置(五)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C语言)fgets与fputs函数详解
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (数据结构)顺序表的定义
  • (四)linux文件内容查看
  • (算法)Game
  • (转)【Hibernate总结系列】使用举例
  • ***监测系统的构建(chkrootkit )
  • ***详解账号泄露:全球约1亿用户已泄露
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)