Spring Cloud Gateway 原生支持接口限流该怎么玩
关于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 原生支持接口限流该怎么玩相关推荐
- Spring Cloud Gateway 原生的接口限流该怎么玩
为什么80%的码农都做不了架构师?>>> 关于pig: 基于Spring Cloud.oAuth2.0开发基于Vue前后分离的开发平台,支持账号.短信.SSO等多种登录,提供配 ...
- spring gateway 限流持久化_Spring Cloud Gateway 扩展支持动态限流
之前分享过 一篇 <Spring Cloud Gateway 原生的接口限流该怎么玩>, 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现 原生Request ...
- Spring Cloud Gateway自带RequestRateLimiter限流应用及扩展 | Spring Cloud 16
一.限流算法 限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机. 在开发高并发系统时有三把利器用来保护系统: 缓存:缓存的目的是提升系统访问速 ...
- Spring Cloud入门-Sentinel实现服务限流、熔断与降级(Hoxton版本)
文章目录 Spring Cloud入门系列汇总 摘要 Sentinel简介 安装Sentinel控制台 创建sentinel-service模块 限流功能 创建RateLimitController类 ...
- Spring自定义注解+redis实现接口限流
在实际开发中,有时候我们需要对某些接口进行限流,防止有人恶意攻击或者是因为某些接口自身的原因,比如发短信接口,IO处理的接口. 这里我们通过自定义一个注解,并利用Spring的AOP拦截器功能来实现限 ...
- 实战 Spring Cloud Gateway 之限流篇
来源:https://www.aneasystone.com/archives/2020/08/spring-cloud-gateway-current-limiting.html 话说在 Sprin ...
- Spring Cloud Gateway(限流)
在高并发的应用中,限流是一个绕不开的话题.限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击. 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池.线程池).限制瞬时并 ...
- 【云原生微服务>SCG网关篇十二】Spring Cloud Gateway集成Sentinel API实现多种限流方式
文章目录 一.前言 二.Gateway集成Sentinel API 0.集成Sentinel的核心概念 1)GatewayFlowRule 和 ApiDefinition 2)GatewayFlowR ...
- 这可能是全网Spring Cloud Gateway限流最完整的方案了!
作者:aneasystone https://www.aneasystone.com/ 话说在 Spring Cloud Gateway 问世之前,Spring Cloud 的微服务世 ...
最新文章
- 拉线自动行走机器人_煤矿机器人重点研发目录来了!
- 程序猿生存指南-35 王旭新巢
- 【存储知识学习】第六章-磁盘阵列-《大话存储》阅读笔记
- Pandas练习题-提高你的数据分析技能
- 3DSlicer相关资料汇总
- 一道多线程通信实例分析
- 分治法在求解“最近对”问题中的应用(JAVA)
- 2010/9/12学习历程
- TCP和UDP Socket
- 数据结构 - AVL木
- idea 自动定位类所在目录_中国自动化学会推荐的A类和B类学术期刊目录(包含国产和外文)...
- foobar2000后台运行
- 美丽世界的另一面!(请保护好你身边的亲朋好友)
- 自著——30天自制计算机语言解释器 目录
- php 鸟哥 配置文件,鸟哥:让PHP 7达到最高性能的几个Tips
- Sicily 1782. Knapsack
- 记录一次docker基础操作错误Error response from daemon: You cannot remove a running container
- 生活妙招:疏通蹲便器和地漏中的头发堵塞
- Qt常见make编译错误:/usr/bin/ld:cannot find -lxxx
- uniapp vue百度人脸实名认证(V4)接口