本文介绍: 首先谈谈为什么要限流,有哪些限流方案?限流是指控制系统中的流量,以保护系统免于过载或崩溃。在高并发、大数据量和分布式场景下,限流可以保护系统稳定性,防止由于流量超负荷而导致的服务降级或崩溃。常见的限流方案包括:令牌桶算法:系统会根据一个固定速率往令牌桶(Token Bucket)中添加令牌,每次请求需要获取一个令牌,当没有令牌时则请求被拒绝。
首先谈谈为什么要限流,有哪些限流方案?
以上这些算法都可以通过在服务器端配置来实现限流,但不同的算法适用于不同的业务场景,需要根据实际情况做出选择。
为什么限流
是防止用户恶意刷新接口,因为部署在外部服务器,并且我们采用websocket的接口实现的,公司没有对硬件升级,导致程序时长崩溃,为了解决这个问题,请教公司的大佬,提出一个方案,限流操作。
但是最后找到原因所在,解决了,吞吐量1万6左右,用的测试服务器,进行测试的,我开发的笔记本进行压测,工具是Jmeter,结果我的电脑未响应,卡了,服务器还没有挂。
常见的限流:
说白了限流,为了处理高并发接口那些方式:队列,线程,线程池,消息队列、 kafka、中间件、sentinel:直接拒绝、Warm Up、匀速排队等
技术层面:
善于使用连接池。面试题整理好了,关注公众号后端面试那些事,回复:2022面经,即可获取
怎么实现令牌桶限流?
首先,是微服务项目,创建一个gateway服务,一个测试服务
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--声明SpringBoot的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 网关依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<!--redis gateway令牌桶依赖 监控依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!—redis令牌桶依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
/***
* IP限流
* @return
*/
@Bean(name="ipKeyResolver")
public KeyResolver userKeyResolver() {
return new KeyResolver() {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
//获取远程客户端IP
String hostName = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
System.out.println("hostName:"+hostName);
return Mono.just(hostName);
}
};
}
4. 在gateway服务里面的application.yml里面添加配置
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]': # 匹配所有请求
allowedOrigins: "*" #跨域处理 允许所有的域
allowedMethods: # 支持的方法
- GET
- POST
- PUT
- DELETE
routes:
- id: gateway1
uri: http://localhost:8080
predicates:
- Path=/abc/test/**
filters:
- StripPrefix=1
- name: RequestRateLimiter #请求数限流 名字不能随便写 ,使用默认的facatory
args:
key-resolver: "#{@ipKeyResolver}"
redis-rate-limiter.replenishRate: 1 #是你希望允许用户每秒执行多少请求,而不会丢弃任何请求。这是令牌桶填充的速率
redis-rate-limiter.burstCapacity: 3 #是指令牌桶的容量,允许在一秒钟内完成的最大请求数,将此值设置为零将阻止所有请求
application:
name: gateway-web
#Redis配置
redis:
host: 127.0.0.1
port: 6379
server:
port: 8001
management:
endpoint:
gateway:
enabled: true
web:
exposure:
include: true
5. 在测试服务
@RestController
@RequestMapping("test")
public class TestqController {
@GetMapping("getTest")
public String getTest(){
return "成功了!!!!";
}
}
原文地址:https://blog.csdn.net/r_ren97/article/details/130808453
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_13943.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。