可以利用Gateway中RequestRateLimiter實現限流
常見的限流算法
1、計數器算法
以QPS(每秒查詢率Queries-per-second)為100舉例。
從第一個請求開始計時。每個請求讓計數器加一。當到達100以后,其他的請求都拒絕。
如果1秒鍾內前200ms請求數量已經到達了100,后面800ms中500次請求都被拒絕了,這種情況稱為“突刺現象”
2、漏桶算法
和生活中漏桶一樣,有一個水桶,下面有一個”漏眼”往出漏水,不管桶里有多少水,漏水的速率都是一樣的。但是既然是一個桶,桶里裝的水都是有上限的。當到達了上限新進來的水就裝不了(主要出現在突然倒進來大量水的情況)。漏桶算法可以解決突刺現象。
3、令牌桶算法
令牌桶算法可以說是對漏桶算法的一種改進。
在桶中放令牌,請求獲取令牌后才能繼續執行。如果桶中沒有令牌,請求可以選擇進行等待或者直接拒絕。
由於桶中令牌是按照一定速率放置的,所以可以一定程度解決突發訪問。如果桶中令牌最多有100個,qps最大為100
案例:
Gateway中限流,RequestRateLimiter是基於Redis和Lua腳本實現的令牌桶算法
配置:
配置文件屬性參考:RequestRateLimiterGatewayFilterFactory及內部類 Config,RateLimiter,KeyResolver 的字段
spring: cloud: gateway: routes: - id: member-demo uri: lb://my-member predcates: - name: Path args: - patterns=/member/**,/my-member/** filters: # 配置令牌桶 - name: RequestRateLimiter args: # 配置類:RateLimiter 實現類 RedisRateLimiter 對象 redis-rate-limiter: defaultRateLimiter: defaultConfig: # 每秒生成令牌個數 replenishRate: 1 # 令牌桶上線容量 burstCapacity: 5 # 自定義一個 keyResolver 實現 KeyResolver MyKeyResolver,注入容器,使用Spring的EL表達式讀取值 defaultKeyResolver: '#{@myKeyResolver}' # 令牌桶使用到 Redis ,需要配置Redis連接屬性 redis: host: behelpful-redis port: 6379 password: behelpful@8888
自定義令牌桶規則:
just() 方法參數表示根據什么進行限流。實例中是根據主機名進行限流。參數值影響Redis
@Component public class MyKeyResolver implements KeyResolver { /** * <String> 字符串泛型,代表令牌分給誰,可以是IP地址也可以是數字字符串,如果返回 "1",表示所有客戶端一表只有一個令牌 * * @param exchange * @return */ @Override public Mono<String> resolve(ServerWebExchange exchange) { ServerHttpRequest request = exchange.getRequest(); String remoteAddr = request.getRemoteAddress().getAddress().getHostAddress(); // 對每個客戶端IP進行限流 return Mono.just(remoteAddr); } }
>>>>>>>>>>>>> 下一篇: https://www.cnblogs.com/Alay/p/15150554.html <<<<<<<<<<<<<<<<<<<<<<