网关限流

博客介绍了多种限流实现方式。一是用Redis的incr加过期时间限流,给出代码示例;二是可通过Redis + Lua实现限流;还提到Hystrix线程池类似漏桶思路,以及Google Guava基于令牌桶实现限流,并给出相关demo链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、redis incr加过期时间来限流。

int current = jedis.incr(key);

if (current + 1 > limit) //如果超出限流大小

return 0;

else if (current == 1) //只有第一次访问需要设置2秒的过期时间

jedis.expire(key, “2”);

return 1

2、另外还有通过redis+lua来实现限流。

3、hystrix的线程池就类似漏桶的思路。
4、Google guava基于令牌桶实现限流  demo  https://www.jianshu.com/p/a7b6aeb30685

### 配置 Sentinel 网关进行流量限制 #### 启用 Sentinel 对网关的支持 为了使 Sentinel 正确工作于 API Gateway 上,需确保引入了 `Sentinel API Gateway Adapter Common` 模块。该模块提供了必要的组件来支持网关级别的限流功能[^2]。 对于基于 Spring Cloud Alibaba 的项目,在 pom.xml 文件中加入依赖: ```xml <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-apache-httpclient-adapter</artifactId> </dependency> <!-- 如果使用的是 Spring Cloud Gateway --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency> ``` #### 设置基础配置属性 在 application.yml 中添加如下配置以启用并调整基本行为: ```yaml spring: cloud: sentinel: filter: enabled: true # 开启过滤器,默认开启;如果看到URL资源,则应设为false gw-flow-rules: # 自定义网关流控规则的数据源路径(可选) source: classpath:/gateway-flow-rules.json ``` 注意当观察到 URL 资源而非预期的路由或API分组时,应当将 `filter.enabled` 设定为 `false` 来修正这一情况[^4]。 #### 创建自定义 API 分组 可以通过编码方式创建 ApiDefinition 实现更细粒度的控制。例如,假设希望把 `/api/v1/*` 下的所有请求视为同一个 API 分组来进行统一管理: ```java import com.alibaba.csp.sentinel.adapter.gateway.common.rule.ApiPredicateItem; import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayApiDefinitionManager; public void initCustomApis() { List<ApiPredicateItem> items = new ArrayList<>(); items.add(new SubPathMatchable().setPattern("/api/v1/**")); Set<String> apiNames = Collections.singleton("my_custom_api"); GatewayApiDefinitionManager.loadApiDefinitions(apiNames, items); } ``` 这段代码会注册一个新的名为 "my_custom_api" 的 API 分组,并将其映射至特定模式下的所有子路径上。 #### 定义网关限流规则 同样地,也可以编程化地设置 GatewayFlowRule 。这里给出一个简单的例子说明如何针对某个 Route 或者之前提到过的自定义 API 分组实施限流策略: ```java import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler; import org.springframework.context.annotation.Bean; import java.util.Collections; @Bean public BlockRequestHandler blockRequestHandler(){ return (serverWebExchange, throwable) -> serverWebExchange.getResponse() .writeWith(Mono.just( ServerHttpResponse.writeAndFlushWith(Flux.just( Mono.just(ResponseEntity.ok("{\"code\": \"429\", \"msg\":\"Too Many Requests\"}")))) )); } // 添加限流规则... List<GatewayFlowRule> rules = Arrays.asList( new GatewayFlowRule("some_route_id_or_api_group_name") .setCount(10)//每秒允许的最大访问次数 .setIntervalSec(1)); GatewayFlowRuleManager.loadRules(rules); ``` 上述片段展示了怎样设定最大 QPS (Queries Per Second)为 10 的速率限制,并指定了受影响的目标对象——这可以是一个具体的 route ID 或者前面所建立的那个叫做 “my_custom_api”的 API 分组名[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值