spring boot结合redis实现限流

摘要: 网站访问量大,为了保障服务器不宕机,或者为了过滤频繁的恶意请求, 或者根据不同的业务请求设置不一样的限流标准。这些可以通过NGINX实现,但今天记录的是在应用程序中(或者微服务的网关层面)利用redis来实现限流

网站访问量大,为了保障服务器不宕机,或者为了过滤频繁的恶意请求, 或者根据不同的业务请求设置不一样的限流标准。这些可以通过NGINX实现,但今天记录的是在应用程序中(或者微服务的网关层面)利用redis来实现限流。

一. 限流的依据

可以是IP地址,可以是用户名,甚至可以是IP地址加用户名。 根据自己的业务规则制定。比如利用IP地址限流,定义如下类, 实现 KeyResolver 接口:

public class IPKeyLimit implements KeyResolver {

    /**
     * 加速用IP 作为限流标志.
     * @param exchange
     * @return
     */
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        ServerHttpRequest request = exchange.getRequest();
        String hostIp = request.getRemoteAddress().getAddress().getHostAddress();
        return Mono.just(hostIp);
    }

}

将这个类纳入spring的容器管理

@Configuration
public class BeanConfig {

    @Bean("ipKeyLimitResolver")
    public KeyResolver getIpLimit() {
        return new IPKeyLimit();
    }

}

用Bean注解,纳入容器管理,并定义名称为: ipKeyLimitResolver, 在后面的配置文件中会用到。

二. 引入限流依赖包redis

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

没写版本,因为版本是与parent的springboot 配套,我这里是用的2.2.10.RELEASE

三. 在spring cloud gateway 配置中配置限流(bootstrap.yml 文件)

spring:
  cloud:
    gateway:
      routes:
        - id: provider-router
          uri: lb://springcloud-alibaba-nacos-feign-provider
          predicates:
            - Path=/provider/**
          filters:
            - StripPrefix=1
            - name: RequestRateLimiter
              args:
                # 限流的key
                key-resolver: '#{@ipKeyLimitResolver}'
                redis-rate-limiter.replenishRate: 1
                redis-rate-limiter.burstCapacity: 2
  redis:
    host: 192.168.222.150
    port: 6379
    password:
    database: 0

上面配置的意思是:针对 springcloud-alibaba-nacos-feign-provider 这个应用下的请求进行限流,限流的标准是IP地址,每秒并发 1 个,队列里面最多有 2 个。超过这个现在就会报错。


这个错误就是超过限流标准,429错误,请求太多。到此利用redis进行限流测试完毕。

上一篇: maven工程多依赖情况下 程序包 不存在问题
下一篇: 利用redis实现分布式的布隆过滤器,过滤无效请求
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号