数据库
首页 > 数据库> > SpringCloudGateway基于redis令牌桶限流

SpringCloudGateway基于redis令牌桶限流

作者:互联网

令牌桶算法:

令牌桶算法是对漏桶算法的一种改进,桶算法能够限制请求调用的速率,而令牌桶算法能够在限制调用 的平均速率的同时还允许一定程度的突发调用。在令牌桶算法中,存在一个桶,用来存放固定数量的令 牌。算法中存在一种机制,以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令 牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。放令牌这个动作是持续不断的 进行,如果桶中令牌数达到上限,就丢弃令牌,所以就存在这种情况,桶中一直有大量的可用令牌,这 时进来的请求就可以直接拿到令牌执行,比如设置qps为100,那么限流器初始化完成一秒后,桶中就 已经有100个令牌了,这时服务还没完全启动好,等启动完成对外提供服务时,该限流器可以抵挡瞬时 的100个请求。所以,只有桶中没有令牌时,请求才会进行等待,最后相当于以一定的速率执行

 

 


在SpringCloudGateway中提供了基于令牌桶的限流支持,基于其内置的过滤器工厂RequestRateLimiterGatewayFilterFactory 实现。

在过滤器工厂中是通过Redis和lua脚本结合的方式进行流量控制。

    (1)环境搭建
 <!-- 网关依赖 -->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!-- eureka网关-->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<!-- Lombok -->
<dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <version>1.18.4</version>
       <scope>provided</scope>
</dependency>

<!--redis gateway令牌桶依赖 监控依赖-->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

 <!--redis gateway令牌桶依赖 -->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

 

(2)修改application.yml配置文件
server:
  port: 8001

spring:
  application:
    name: server-gateway #服务名称
  cloud:
    gateway:
      routes:
      - id: category-service
        uri: lb://service-category
        predicates:
        - Path=/category/**,/admin/category/**
        filters: #redis令牌桶限流功能
        - RewritePath=/admin/category/(?<segment>.*), /admin/category/$\{segment}
        - name: RequestRateLimiter
          args:
            # 使用SpEL从容器中获取对象
            key-resolver: '#{@pathKeyResolver}' #当需要用到这里的对象时需要去filter包下的KeyResolverConfiguration类中开启对应的限流bean
            # 令牌桶每秒填充平均速率
            redis-rate-limiter.replenishRate: 1
            # 令牌桶的总容量
            redis-rate-limiter.burstCapacity: 3
      - id: headline-service
        uri:  lb://service-headline
        predicates:
        - Path=/headline/**,/admin/headline/**
      - id: item-service
        uri:  lb://service-item
        predicates:
        - Path=/item/**,/admin/item/**
      - id: user-service
        uri:  lb://service-user
        predicates:
        - Path=/user/**,/admin/user/**
  redis:  #当需要用到redis令牌桶限流的时候开启该
    port: 6379
    host: localhost
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8000/eureka #,http://127.0.0.1:8999/eureka/
      registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s
  instance:
    prefer-ip-address: true #使用ip注册
    ip-address: 127.0.0.1

 

 

标签:category,令牌,service,admin,SpringCloudGateway,redis,限流
来源: https://www.cnblogs.com/zcl1116/p/16168295.html