我是如何实现限流的?

本文讲述了作者在AUSTIN项目中实现限流的背景和原因,包括服务器性能限制和对接下游渠道的调用限制。限流策略分为按请求数和下发用户数两种。在实现上,作者选择了单机限流,利用Guava的RateLimiter,并通过Apollo配置中心动态调整限流值,简化了代码设计和维护成本。
摘要由CSDN通过智能技术生成

🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

我是3y,一年CRUD经验用十年的markdown程序员👨🏻‍💻常年被誉为职业八股文选手

今天继续来更新austin项目的内容,主要讲讲限流这块

01、为什么AUSTIN项目需要限流

众所周知,服务器能处理的请求数是有限的,如果请求量特别大,我们就可能需要做限流。

限流处理的姿势:要么就让请求等待,要么就把请求给扔了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRMqyfZl-1657773552333)(ht

Spring Cloud Gateway可以通过集成限流组件来实现限流功能。在Spring Cloud Gateway中,可以使用Redis、Guava、Bucket4j等组件进行限流。 下面以Redis实现限流为例,介绍一种实现方式: 1. 首先,需要引入相关的依赖,例如`spring-boot-starter-data-redis`和`spring-boot-starter-data-redis-reactive`。 2. 在配置文件中配置Redis的连接信息,例如: ``` spring: redis: host: localhost port: 6379 ``` 3. 创建一个限流过滤器类,实现`GlobalFilter`和`Ordered`接口。例如: ```java @Component public class RateLimitFilter implements GlobalFilter, Ordered { private final RedisTemplate<String, String> redisTemplate; public RateLimitFilter(RedisTemplate<String, String> redisTemplate) { this.redisTemplate = redisTemplate; } @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String key = exchange.getRequest().getPath().toString(); String limit = redisTemplate.opsForValue().get(key); if (limit != null && Integer.parseInt(limit) >= 100) { exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } @Override public int getOrder() { return -1; } } ``` 4. 在启动类中注入`RedisTemplate`,并将限流过滤器添加到过滤器链中。例如: ```java @SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } @Autowired private RedisTemplate<String, String> redisTemplate; @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("rate_limit_route", r -> r.path("/api/**") .filters(f -> f.filter(new RateLimitFilter(redisTemplate))) .uri("http://localhost:8080")) .build(); } } ``` 5. 在Redis中设置限流的阈值。例如,可以使用`redisTemplate.opsForValue().set(key, value)`方法设置限流阈值。 通过以上步骤,就可以在Spring Cloud Gateway中实现基于Redis的限流功能。根据实际需求,可以选择其他限流组件,并进行相应的配置和定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值