关于pig:

基于Spring Cloud、oAuth2.0开发基于Vue前后分离的开发平台,支持账号、短信、SSO等多种登录,提供配套视频开发教程。

关于 Spring Cloud Gateway

SpringCloudGateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring云网关旨在提供一种简单而有效的路由API的方法。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

zuul如何实现多维度限流请参考我的博客

[Zuul:构建高可用网关之多维度限流]

开始Gateway 限流

POM 依赖

<!--spring cloud gateway依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--基于 reactive stream 的redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

配置按照请求IP 的限流

spring:cloud:gateway:routes:- id: requestratelimiter_routeuri: lb://pigx-upmsorder: 10000predicates:- Path=/admin/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 1  # 令牌桶的容积redis-rate-limiter.burstCapacity: 3  # 流速 每秒key-resolver: "#{@remoteAddrKeyResolver}" #SPEL表达式去的对应的bean- StripPrefix=1

配置bean,多维度限流量的入口

/**
* 自定义限流标志的key,多个维度可以从这里入手
* exchange对象中获取服务ID、请求信息,用户信息等
*/
@Bean
KeyResolver remoteAddrKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}

OK 完成。

压力测试

并发5个线程。

Redis 数据变化

我们使用redis的monitor 命令,实时查看redis 的操作情况。
会发现在redis中会操作两个key

  • request_rate_limiter.{xxx}.timestamp
  • request_rate_limiter.{xxx}.tokens

实现原理

Spring Cloud Gateway 默认实现 Redis限流,如果扩展只需要实现ratelimter接口即可。

RedisRateLimter 的核心代码,判断是否取到令牌的实现,通过调用 redis的LUA 脚本。

public Mono<Response> isAllowed(String routeId, String id) {Config routeConfig = getConfig().getOrDefault(routeId, defaultConfig);int replenishRate = routeConfig.getReplenishRate();int burstCapacity = routeConfig.getBurstCapacity();try {List<String> keys = getKeys(id);returns unixtime in seconds.List<String> scriptArgs = Arrays.asList(replenishRate + "", burstCapacity + "",Instant.now().getEpochSecond() + "", "1");// 这里是核心,执行redis 的LUA 脚本。Flux<List<Long>> flux =this.redisTemplate.execute(this.script, keys, scriptArgs);return flux.onErrorResume(throwable -> Flux.just(Arrays.asList(1L, -1L))).reduce(new ArrayList<Long>(), (longs, l) -> {longs.addAll(l);return longs;}) .map(results -> {boolean allowed = results.get(0) == 1L;Long tokensLeft = results.get(1);Response response = new Response(allowed, getHeaders(routeConfig, tokensLeft));if (log.isDebugEnabled()) {log.debug("response: " + response);}return response;});}catch (Exception e) {log.error("Error determining if user allowed from redis", e);}return Mono.just(new Response(true, getHeaders(routeConfig, -1L)));
}

LUA 脚本

Spring Cloud Gateway 原生支持接口限流该怎么玩相关推荐

  1. Spring Cloud Gateway 原生的接口限流该怎么玩

    为什么80%的码农都做不了架构师?>>>    关于pig: 基于Spring Cloud.oAuth2.0开发基于Vue前后分离的开发平台,支持账号.短信.SSO等多种登录,提供配 ...

  2. spring gateway 限流持久化_Spring Cloud Gateway 扩展支持动态限流

    之前分享过 一篇 <Spring Cloud Gateway 原生的接口限流该怎么玩>, 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现 原生Request ...

  3. Spring Cloud Gateway自带RequestRateLimiter限流应用及扩展 | Spring Cloud 16

    一.限流算法 限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机. 在开发高并发系统时有三把利器用来保护系统: 缓存:缓存的目的是提升系统访问速 ...

  4. Spring Cloud入门-Sentinel实现服务限流、熔断与降级(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 Sentinel简介 安装Sentinel控制台 创建sentinel-service模块 限流功能 创建RateLimitController类 ...

  5. Spring自定义注解+redis实现接口限流

    在实际开发中,有时候我们需要对某些接口进行限流,防止有人恶意攻击或者是因为某些接口自身的原因,比如发短信接口,IO处理的接口. 这里我们通过自定义一个注解,并利用Spring的AOP拦截器功能来实现限 ...

  6. 实战 Spring Cloud Gateway 之限流篇

    来源:https://www.aneasystone.com/archives/2020/08/spring-cloud-gateway-current-limiting.html 话说在 Sprin ...

  7. Spring Cloud Gateway(限流)

    在高并发的应用中,限流是一个绕不开的话题.限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击. 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池.线程池).限制瞬时并 ...

  8. 【云原生微服务>SCG网关篇十二】Spring Cloud Gateway集成Sentinel API实现多种限流方式

    文章目录 一.前言 二.Gateway集成Sentinel API 0.集成Sentinel的核心概念 1)GatewayFlowRule 和 ApiDefinition 2)GatewayFlowR ...

  9. 这可能是全网Spring Cloud Gateway限流最完整的方案了!

        作者:aneasystone     https://www.aneasystone.com/ 话说在 Spring Cloud Gateway 问世之前,Spring Cloud 的微服务世 ...

最新文章

  1. 拉线自动行走机器人_煤矿机器人重点研发目录来了!
  2. 程序猿生存指南-35 王旭新巢
  3. 【存储知识学习】第六章-磁盘阵列-《大话存储》阅读笔记
  4. Pandas练习题-提高你的数据分析技能
  5. 3DSlicer相关资料汇总
  6. 一道多线程通信实例分析
  7. 分治法在求解“最近对”问题中的应用(JAVA)
  8. 2010/9/12学习历程
  9. TCP和UDP Socket
  10. 数据结构 - AVL木
  11. idea 自动定位类所在目录_中国自动化学会推荐的A类和B类学术期刊目录(包含国产和外文)...
  12. foobar2000后台运行
  13. 美丽世界的另一面!(请保护好你身边的亲朋好友)
  14. 自著——30天自制计算机语言解释器 目录
  15. php 鸟哥 配置文件,鸟哥:让PHP 7达到最高性能的几个Tips
  16. Sicily 1782. Knapsack
  17. 记录一次docker基础操作错误Error response from daemon: You cannot remove a running container
  18. 生活妙招:疏通蹲便器和地漏中的头发堵塞
  19. Qt常见make编译错误:/usr/bin/ld:cannot find -lxxx
  20. uniapp vue百度人脸实名认证(V4)接口

热门文章

  1. Http协议(2)—客户端的识别与cookie机制
  2. Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化
  3. RTP与RTCP协议介绍
  4. 在当今移动互联网时代_谁在提供当今最好的电子邮件体验?
  5. ovirt官方安装文档 第三章
  6. 《嵌入式设备驱动开发精解》——导读
  7. Python 日期格式相关
  8. 跟我学PHP第二篇- 配置Mysql以及PHP WampServer篇(1)
  9. python中loop函数_python + Django 的forloop功能试验讲解
  10. MySql的连接查询