java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringCloud限流

SpringCloud Gateway实现限流功能详解

作者:做一道光

SpringCloud Gateway 是 Spring Cloud 的一个全新项目,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。这篇文章主要介绍了SpringCloud Gateway实现限流,需要的朋友可以参考下

1 什么是限流

通俗的说,限流就是 限制一段时间内,用户访问资源的次数 ,减轻服务器压力,限流大致分为两种:

1. IP 限流(5s 内同一个 ip 访问超过 3 次,则限制不让访问,过一段时间才可继续访问)

2. 请求量限流(只要在一段时间内(窗口期),请求次数达到阀值,就直接拒绝后面来的访问了,过一段时间才可以继续访问)(粒度可以细化到一个 api(url),一个服务)

2 本次限流模型

限流模型 : 漏斗算法 ,令牌桶算法,窗口滑动算法 计数器算法

入不敷出

1)、所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;

2)、根据限流大小,设置按照一定的 速率 往桶里添加令牌;

3)、 桶设置最大的放置令牌限制 ,当桶满时、新添加的令牌就被丢弃或者拒绝;

4)、请求达到后首先要获取令牌桶中的令牌,拿着令牌才可以进行其他的业务逻辑,处理完业务逻辑之后,将令牌直接删除;

5)、令牌桶有最低限额,当桶中的令牌达到最低限额的时候,请求处理完之后将不会删除令牌,以此保证足够的限流;

3 Gateway结合redis实现请求量限流

Spring Cloud Gateway 已经内置了一个 RequestRateLimiterGatewayFilterFactory,我们可以直接使用。

目前 RequestRateLimiterGatewayFilterFactory 的实现依赖于 Redis,所以我们还要引入spring-boot-starter-data-redis-reactive。

3.1 添加依赖

<!--限流要引入 Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

3.2 修改配置文件

server :

     port: 80

spring:

     application:

            name: gateway-80

      cloud:

            gateway :

enabled: true

routes:

id: user-service

uri: lb: //consumer-user-service

predicates:

- Path=/info/**

filters:

- name : RequestRateLimiter

args:

key-resolver:'#{@hostAddrKeyResolver} '

redis-rate-limiter.replenishRate: 1

redis-rate-limiter . burstCapacity: 3

redis:#redis的配置

host: 192.168.226.128

port: 6379

database: 6

eureka :

instance:

instance-id: ${spring.application.name}:${server.port}

prefer-ip-address: true

client:

service-url:

defaultzone: http:/ / localhost:8761/eureka/

3.3 配置文件说明

在上面的配置文件,配置了 redis 的信息,并配置了 RequestRateLimiter 的限流过滤器,该过滤器需要配置三个参数:

burstCapacity:令牌桶总容量。

replenishRate:令牌桶每秒填充平均速率。

key-resolver:用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据

3.4 创建配置类RequestRateLimiterConfig

@Configuration
public class RequestRateLimiterConfig {
/**
* IP 限流
* 把用户的 IP 作为限流的 Key
*
* @return
*/
@Bean
@Primary
public KeyResolver hostAddrKeyResolver() {
return (exchange) -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
/**
* 用户 id 限流
* 把用户 ID 作为限流的 key
*
* @return
*/
@Bean
public KeyResolver userKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
}
/**
* 请求接口限流
* 把请求的路径作为限流 key
*
* @return
*/
@Bean
public KeyResolver apiKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getPath().value());
}
}

3.5 启动快速访问测试

http://localhost/info?token=asdad 快速访问后报 429

查看 redis

到此这篇关于springcloud gateway实现限流功能详解的文章就介绍到这了,更多相关springcloud限流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文