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

gateway 版本:

org.springframework.cloud
spring-cloud-starter-gateway
2.2.1.RELEASE

应用基本配置:

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, 用下面这个依赖一键就可以了:

org.springframework.boot
spring-boot-starter-data-redis-reactive
2.2.5.RELEASE

附上配置:

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

你可能感兴趣的:(数据结构,架构,微服务)