SpringCloud Gateway實(shí)現(xiàn)限流功能詳解
1 什么是限流
通俗的說,限流就是 限制一段時(shí)間內(nèi),用戶訪問資源的次數(shù) ,減輕服務(wù)器壓力,限流大致分為兩種:
1. IP 限流(5s 內(nèi)同一個(gè) ip 訪問超過 3 次,則限制不讓訪問,過一段時(shí)間才可繼續(xù)訪問)
2. 請(qǐng)求量限流(只要在一段時(shí)間內(nèi)(窗口期),請(qǐng)求次數(shù)達(dá)到閥值,就直接拒絕后面來的訪問了,過一段時(shí)間才可以繼續(xù)訪問)(粒度可以細(xì)化到一個(gè) api(url),一個(gè)服務(wù))
2 本次限流模型
限流模型 : 漏斗算法 ,令牌桶算法,窗口滑動(dòng)算法 計(jì)數(shù)器算法
入不敷出
1)、所有的請(qǐng)求在處理之前都需要拿到一個(gè)可用的令牌才會(huì)被處理;
2)、根據(jù)限流大小,設(shè)置按照一定的 速率 往桶里添加令牌;
3)、 桶設(shè)置最大的放置令牌限制 ,當(dāng)桶滿時(shí)、新添加的令牌就被丟棄或者拒絕;
4)、請(qǐng)求達(dá)到后首先要獲取令牌桶中的令牌,拿著令牌才可以進(jìn)行其他的業(yè)務(wù)邏輯,處理完業(yè)務(wù)邏輯之后,將令牌直接刪除;
5)、令牌桶有最低限額,當(dāng)桶中的令牌達(dá)到最低限額的時(shí)候,請(qǐng)求處理完之后將不會(huì)刪除令牌,以此保證足夠的限流;
3 Gateway結(jié)合redis實(shí)現(xiàn)請(qǐng)求量限流
Spring Cloud Gateway 已經(jīng)內(nèi)置了一個(gè) RequestRateLimiterGatewayFilterFactory,我們可以直接使用。
目前 RequestRateLimiterGatewayFilterFactory 的實(shí)現(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 的限流過濾器,該過濾器需要配置三個(gè)參數(shù):
burstCapacity:令牌桶總?cè)萘俊?/p>
replenishRate:令牌桶每秒填充平均速率。
key-resolver:用于限流的鍵的解析器的 Bean 對(duì)象的名字。它使用 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")); } /** * 請(qǐng)求接口限流 * 把請(qǐng)求的路徑作為限流 key * * @return */ @Bean public KeyResolver apiKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getPath().value()); } }
3.5 啟動(dòng)快速訪問測(cè)試
http://localhost/info?token=asdad 快速訪問后報(bào) 429
查看 redis
到此這篇關(guān)于springcloud gateway實(shí)現(xiàn)限流功能詳解的文章就介紹到這了,更多相關(guān)springcloud限流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入探究Java線程的創(chuàng)建與構(gòu)造方法
這篇文章主要給大家分享的是java線程的創(chuàng)建以及構(gòu)造方法,想了解具體方式的小伙伴可以參考下面文章內(nèi)容,希望對(duì)你有所幫助2022-04-04初次使用IDEA創(chuàng)建maven項(xiàng)目的教程
這篇文章主要介紹了初次使用IDEA創(chuàng)建maven項(xiàng)目的教程講解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01Java的Hibernate框架中的組合映射學(xué)習(xí)教程
組合映射即是指主對(duì)象和子對(duì)象關(guān)聯(lián)且擁有相同的生命周期的映射關(guān)系,這里我們將舉一些數(shù)據(jù)操作的實(shí)例,來講解Java的Hibernate框架中的組合映射學(xué)習(xí)教程2016-07-07springboot啟動(dòng)feign項(xiàng)目報(bào)錯(cuò):Service id not legal hostnam的解決
這篇文章主要介紹了springboot啟動(dòng)feign項(xiàng)目報(bào)錯(cuò):Service id not legal hostnam的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java接口的作用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java接口的作用,涉及到接口的規(guī)范相關(guān)知識(shí),需要的的朋友參考下2017-04-04Java JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)(Run-Time Data Areas)
運(yùn)行時(shí)數(shù)據(jù)區(qū),是java虛擬機(jī)定義的在程序執(zhí)行期間使用的各種運(yùn)行時(shí)的數(shù)據(jù)區(qū),通過JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)圖例給大家展示的很詳細(xì),對(duì)JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2021-06-06springboot整合freemarker代碼自動(dòng)生成器
最近做了一個(gè)工具,可以實(shí)現(xiàn)代碼自動(dòng)生成,今天整理出來分享給大家,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05spring boot(三)之Spring Boot中Redis的使用
這篇文章主要介紹了spring boot(三)之Spring Boot中Redis的使用,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05MyBatis通用Mapper實(shí)現(xiàn)原理及相關(guān)內(nèi)容
今天小編就為大家分享一篇關(guān)于MyBatis通用Mapper實(shí)現(xiàn)原理及相關(guān)內(nèi)容,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12java獲取redis日志信息與動(dòng)態(tài)監(jiān)控信息的方法
這篇文章主要給大家介紹了關(guān)于java如何獲取redis日志信息與動(dòng)態(tài)監(jiān)控信息的方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-04-04