SpringCloud Gateway實現(xiàn)限流功能詳解
1 什么是限流
通俗的說,限流就是 限制一段時間內(nèi),用戶訪問資源的次數(shù) ,減輕服務(wù)器壓力,限流大致分為兩種:
1. IP 限流(5s 內(nèi)同一個 ip 訪問超過 3 次,則限制不讓訪問,過一段時間才可繼續(xù)訪問)
2. 請求量限流(只要在一段時間內(nèi)(窗口期),請求次數(shù)達(dá)到閥值,就直接拒絕后面來的訪問了,過一段時間才可以繼續(xù)訪問)(粒度可以細(xì)化到一個 api(url),一個服務(wù))
2 本次限流模型
限流模型 : 漏斗算法 ,令牌桶算法,窗口滑動算法 計數(shù)器算法

入不敷出
1)、所有的請求在處理之前都需要拿到一個可用的令牌才會被處理;
2)、根據(jù)限流大小,設(shè)置按照一定的 速率 往桶里添加令牌;
3)、 桶設(shè)置最大的放置令牌限制 ,當(dāng)桶滿時、新添加的令牌就被丟棄或者拒絕;
4)、請求達(dá)到后首先要獲取令牌桶中的令牌,拿著令牌才可以進(jìn)行其他的業(yè)務(wù)邏輯,處理完業(yè)務(wù)邏輯之后,將令牌直接刪除;
5)、令牌桶有最低限額,當(dāng)桶中的令牌達(dá)到最低限額的時候,請求處理完之后將不會刪除令牌,以此保證足夠的限流;
3 Gateway結(jié)合redis實現(xiàn)請求量限流
Spring Cloud Gateway 已經(jīng)內(nèi)置了一個 RequestRateLimiterGatewayFilterFactory,我們可以直接使用。
目前 RequestRateLimiterGatewayFilterFactory 的實現(xiàn)依賴于 Redis,所以我們還要引入spring-boot-starter-data-redis-reactive。
3.1 添加依賴
<!--限流要引入 Redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency>
3.2 修改配置文件
server :
port: 80
spring:
application:
name: gateway-80
cloud:
gateway :
enabled: true
routes:
id: user-service
uri: lb: //consumer-user-service
predicates:
- Path=/info/**
filters:
- name : RequestRateLimiter
args:
key-resolver:'#{@hostAddrKeyResolver} '
redis-rate-limiter.replenishRate: 1
redis-rate-limiter . burstCapacity: 3
redis:#redis的配置
host: 192.168.226.128
port: 6379
database: 6
eureka :
instance:
instance-id: ${spring.application.name}:${server.port}
prefer-ip-address: true
client:
service-url:
defaultzone: http:/ / localhost:8761/eureka/
3.3 配置文件說明
在上面的配置文件,配置了 redis 的信息,并配置了 RequestRateLimiter 的限流過濾器,該過濾器需要配置三個參數(shù):
burstCapacity:令牌桶總?cè)萘俊?/p>
replenishRate:令牌桶每秒填充平均速率。
key-resolver:用于限流的鍵的解析器的 Bean 對象的名字。它使用 SpEL 表達(dá)式根據(jù)
3.4 創(chuàng)建配置類RequestRateLimiterConfig
@Configuration
public class RequestRateLimiterConfig {
/**
* IP 限流
* 把用戶的 IP 作為限流的 Key
*
* @return
*/
@Bean
@Primary
public KeyResolver hostAddrKeyResolver() {
return (exchange) -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
/**
* 用戶 id 限流
* 把用戶 ID 作為限流的 key
*
* @return
*/
@Bean
public KeyResolver userKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
}
/**
* 請求接口限流
* 把請求的路徑作為限流 key
*
* @return
*/
@Bean
public KeyResolver apiKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getPath().value());
}
}3.5 啟動快速訪問測試
http://localhost/info?token=asdad 快速訪問后報 429

查看 redis

到此這篇關(guān)于springcloud gateway實現(xiàn)限流功能詳解的文章就介紹到這了,更多相關(guān)springcloud限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java開發(fā)學(xué)習(xí)之Bean的生命周期詳解
從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個過程就是一個生命周期。本文將通過示例為大家詳細(xì)講講Bean的生命周期,感興趣的可以學(xué)習(xí)一下2022-06-06
Java日常練習(xí)題,每天進(jìn)步一點點(17)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07
Java編程實現(xiàn)判斷網(wǎng)上鄰居文件是否存在的方法
這篇文章主要介紹了Java編程實現(xiàn)判斷網(wǎng)上鄰居文件是否存在的方法,涉及Java針對路徑轉(zhuǎn)換及字符串操作的相關(guān)技巧,需要的朋友可以參考下2015-10-10
如何修改HttpServletRequest中header中的信息
這篇文章主要介紹了如何修改HttpServletRequest中header中的信息,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
spring cloud gateway整合sentinel實現(xiàn)網(wǎng)關(guān)限流
這篇文章主要介紹了spring cloud gateway整合sentinel實現(xiàn)網(wǎng)關(guān)限流,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01
深入解析面向?qū)ο缶幊淘贘ava中的應(yīng)用小結(jié)
本文詳細(xì)介紹了面向?qū)ο缶幊痰幕靖拍?包括類和對象、封裝、繼承和多態(tài),通過具體的Java代碼示例,展示了如何在Java中應(yīng)用這些面向?qū)ο缶幊痰暮诵乃枷?感興趣的朋友跟隨小編一起看看吧2025-01-01
sqlserver和java將resultSet中的記錄轉(zhuǎn)換為學(xué)生對象
這篇文章主要介紹了如何利用sqlserver和java將resultSet中的記錄轉(zhuǎn)換為學(xué)生對象,附有超詳細(xì)的代碼,需要的朋友可以參考一下,希望對你有所幫助2021-12-12
Spring AOP 對象內(nèi)部方法間的嵌套調(diào)用方式
這篇文章主要介紹了Spring AOP 對象內(nèi)部方法間的嵌套調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

