Spring Cloud Gateway限流极速部署:3步搞定,秒级防护微服务!
Spring Cloud Gateway限流极速部署:3步搞定,秒级防护微服务!
想要快速为Spring Cloud Gateway集成限流功能?本文提供最简方案,无需复杂配置,三步即可完成!通过内置的RequestRateLimiter过滤器,结合Redis实现高并发场景下的精准流量控制。
一、环境准备
- 添加核心依赖
在pom.xml中引入Spring Cloud Gateway和Redis Reactive依赖(Redis用于分布式限流):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
- 配置Redis连接
在application.yml中配置Redis地址:
spring:
redis:
host: localhost
port: 6379
二、基础限流配置
令牌桶算法实现
Spring Cloud Gateway默认采用令牌桶算法,通过
RequestRateLimiter过滤器实现:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- name: RequestRateLimiter
args:
# 令牌桶每秒填充速率(req/s)
redis-rate-limiter.replenishRate: 10
# 突发流量容量(令牌桶大小)
redis-rate-limiter.burstCapacity: 20
# 限流维度解析器(按IP限流)
key-resolver: "#{@ipKeyResolver}"
定义限流维度解析器
创建
KeyResolverBean决定限流维度(如IP、用户ID等):
@Bean
public KeyResolver ipKeyResolver() {
return exchange -> Mono.just(
exchange.getRequest().getRemoteAddress().getHostString()
);
}
三、高级限流策略
多维度组合限流
支持同时配置路径和IP限流:
filters:
- name: RequestRateLimiter
args:
rate-limiter: "compoundRateLimiter"
key-resolver: "#{@pathAndIpKeyResolver}"
自定义组合限流解析器(如将路径和IP拼接为Key):
@Bean
public KeyResolver pathAndIpKeyResolver() {
return exchange -> {
String ip = exchange.getRequest().getRemoteAddress().getHostString();
String path = exchange.getRequest().getURI().getPath();
return Mono.just(ip + ":" + path); // 组合维度生成唯一key
};
}
自定义限流算法
若需替换默认算法(如改用漏桶算法)
实现
RateLimiter接口,重写isAllowed方法
public class CustomRateLimiter extends AbstractRateLimiter<CustomRateLimiter.Config> {
@Override
public Mono<Response> isAllowed(String routeId, String id) {
// 自定义算法逻辑
// 返回Mono.just(Response.of(allowed, remainingTokens))
}
}
在配置中通过SpEL指定自定义类:
args:
rate-limiter: "#{@customRateLimiter}"
四、验证与测试
触发限流
- 使用工具(如JMeter)发送超过
burstCapacity的请求,观察返回429 Too Many Requests状态码
- 使用工具(如JMeter)发送超过
监控Redis数据
- 限流计数器存储在Redis中,键名格式为
request_rate_limiter.{key}.tokens,可通过redis-cli查看实时令牌数量
- 限流计数器存储在Redis中,键名格式为
五、注意事项
- 算法选择
- 令牌桶:允许突发流量,适合应对短时高峰(默认方案)
- 漏桶:平滑流量,强制恒定速率(需自定义实现)
- 分布式一致性
- 生产环境建议使用Redis集群,避免单点故障导致限流失效
- 动态配置
- 结合Nacos可实现限流规则热更新
通过以上步骤,可快速实现基于Spring Cloud Gateway的限流控制。实际项目中建议结合监控系统(如Prometheus)实时观察限流效果,并根据业务需求调整参数。
Spring Cloud Gateway限流极速部署:3步搞定,秒级防护微服务!的更多相关文章
- Spring Cloud Gateway限流实战
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Spring Cloud 微服务五:Spring cloud gateway限流
前言:在互联网应用中,特别是电商,高并发的场景非常多,比如:秒杀.抢购.双11等,在开始时间点会使流量爆发式地涌入,如果对网络流量不加控制很有可能造成后台实例资源耗尽.限流是指通过指定的策略削减流量, ...
- 深入学习spring cloud gateway 限流熔断
前言 Spring Cloud Gateway 目前,Spring Cloud Gateway是仅次于Spring Cloud Netflix的第二个最受欢迎的Spring Cloud项目(就GitH ...
- spring cloud gateway 限流做法
标题 随风倒十分 反对法
- Spring Cloud Zuul 限流详解(附源码)(转)
在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...
- Spring Cloud(十二):Spring Cloud Zuul 限流详解(附源码)(转)
前面已经介绍了很多zuul的功能,本篇继续介绍它的另一大功能.在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选 ...
- spring cloud gateway 之限流篇
转载请标明出处: https://www.fangzhipeng.com 本文出自方志朋的博客 在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方 ...
- Spring Cloud Gateway 网关限流
Spring Cloud Gateway 限流 一.背景 二.实现功能 三.网关层限流 1.使用默认的redis来限流 1.引入jar包 2.编写配置文件 3.网关正常响应 4.网关限流响应 2.自定 ...
- 快速突击 Spring Cloud Gateway
认识 Spring Cloud Gateway Spring Cloud Gateway 是一款基于 Spring 5,Project Reactor 以及 Spring Boot 2 构建的 API ...
- Spring Cloud Alibaba学习笔记(16) - Spring Cloud Gateway 内置的路由谓词工厂
Spring Cloud Gateway路由配置的两种形式 Spring Cloud Gateway的路由配置有两种形式,分别是路由到指定的URL以及路由到指定的微服务,在上文博客的示例中我们就已经使 ...
随机推荐
- 在 .NET Core中如何使用 Redis 创建分布式锁
在 .NET Core WebApi 中使用 Redis 创建分布式锁可以通过 StackExchange.Redis 库来实现.分布式锁用于确保在分布式系统中,同一时间只有一个进程可以执行某段代码. ...
- c# 获取用户桌面选择的文件
引用COM组件 Shell32 Shell32.ShellFolderView desktopFolderView; int hwnd; Shell32.Shell iShell = new Shel ...
- 第八章 AtomicInteger源码解析
1.原子类 可以实现一些原子操作 基于CAS 下面就以AtomicInteger为例. 2.AtomicInteger 在没有AtomicInteger之前,对于一个Integer的线程安全操作,是需 ...
- Android性能测试(内存、cpu、fps、流量、GPU、电量)——adb篇
adb 常用命令 获取连接设备号:adb devices 列出设备所有已安装的包名 (不需root权限) adb shell "pm list packages",可以加上 ...
- 分圆多项式(cyclotomic polynomial)
最近论文中经常遇到分圆多项式,现在系统的学习一下! 本原单位根 之前介绍n次单位根,现在详细学习一下n次本原单位根(n-th primitive unit root) 一个复数是n次单位根,当且仅当具 ...
- JVM:方法区、堆
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.6.2
- Synchronized的各场景使用方法(多窗口售票例子接上篇)
同步锁机制:在<Thinking in Java>中,是这么说的:对于并发工作,你需要某种方式来防止两个任务访问相同的资源(其实就是共享资源竞争). 防止这种冲突的方法就是当资源被一个 ...
- 一镜到底,通过Llama大模型架构图看透transformers原理
一镜到底,通过Llama大模型架构图看透transformers原理 Llama Nuts and Bolts是Github上使用Go语言从零重写Llama3.1 8B-Instruct模型推理过程( ...
- mysl 修改数据存储位置后服务启动后停止
在 Windows 系统中安装完 mysql 后,如果是生产用的机器,通常会修改数据存储位置.基本步骤: 1. 停止 mysql 服务: 2. 修改 my.ini 文件中的 datadir=" ...
- SQL SERVER日常运维(二)
以下语句请使用SA用户或者有DBA权限的用户进行执行,否则可能会出现权限不足报错. 查看当前用户查看当前用户 select system_user; 检查SQL Agent是否开启 IF EXISTS ...