用 spring gateway 自带的 RequestRateLimiter 做网关路由限流配置(来自官网)

gateway 版本:

<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.1.RELEASE</version>

应用基本配置:

server.port = 8000
spring.application.name = gw

server.max-http-header-size = 1024
server.tomcat.uri-encoding = UTF-8
server.tomcat.max-http-post-size = 1MB

spring.servlet.multipart.enabled = true
spring.servlet.multipart.max-file-size = 20MB
spring.servlet.multipart.max-request-size = 1MB

management.endpoint.gateway.enabled = true
management.endpoints.web.exposure.include = gateway

api.request.appconfig.cachetime = 5


spring.cloud.gateway.routes[0].id = service-a
spring.cloud.gateway.routes[0].uri = lb://service-a
spring.cloud.gateway.routes[0].predicates[0] = Path=/gw/somepath/**

spring.cloud.gateway.routes[0].filters[0] = StripPrefix=2
spring.cloud.gateway.routes[0].filters[1] = PrefixPath=/somepath/gw

#针对限流的注要是这 4 行配置

spring.cloud.gateway.routes[0].filters[2].name=RequestRateLimiter

# 每个 requestedTokens 时间单位下发的令牌数
spring.cloud.gateway.routes[0].filters[2].args.redis-rate-limiter.replenishRate=10

# 令牌桶的最大容量,
spring.cloud.gateway.routes[0].filters[2].args.redis-rate-limiter.burstCapacity=20

# 每 1 秒, 如果2就是每 2 秒, 60 就是一分钟
spring.cloud.gateway.routes[0].filters[2].args.redis-rate-limiter.requestedTokens=1

注意下 name: RequestRateLimiter, 它其实还是 RequestRateLimiterGatewayFilterFactory 来工作的,会调用工厂的 apply 方法得到一个 GatewayFilter , 可参考 spring gateway 如何为请求路由到“路由策略”_爬上树顶的博客-CSDN博客

ymal 可参考:

https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/
 

spring:
  cloud:
    gateway:
      routes:
      - id: requestratelimiter_route
        uri: https://example.org
        filters:
        - name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 10
            redis-rate-limiter.burstCapacity: 20
            redis-rate-limiter.requestedTokens: 1

有朋友来问细节,所以补下 redis 的依赖和配置,因为 RequestRateLimiter 一般会依赖 ReactiveStringRedisTemplate, 而它又依赖到 ReactiveRedisConnectionFactory 的实现类LettuceConnectionFactory, 其底层还是 lettuce, 用下面这个依赖一键就可以了:

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
<version>2.2.5.RELEASE</version>

附上配置:

spring.redis.host = ip
spring.redis.port = 6379
spring.redis.password = pwd
spring.redis.database = 0

spring.redis.lettuce.pool.maxActive = 10
spring.redis.lettuce.pool.maxIdle = 10
spring.redis.lettuce.pool.minIdle = 2
spring.redis.lettuce.shutdown-timeout = 100
spring.redis.maxWaitMillis = 2000
spring.redis.minEvictableIdleTimeMillis = 20000
spring.redis.numTestsPerEvictionRun = 3
spring.redis.timeBetweenEvictionRunsMillis = 70000
spring.redis.testOnBorrow = true
spring.redis.testOnReturn = true
spring.redis.testWhileIdle = true
#spring.redis.timeout = 10000
spring.redis.mode = standalone

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爬上树顶

打赏可验证我能否靠此文财务自由

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值