SpringCloud微服務(wù)網(wǎng)關(guān)限流方式
1.限流的兩種實(shí)現(xiàn)方式
nginx限流
在nginx中,通過(guò)限流可以規(guī)定一個(gè)一個(gè)地址映射每一秒可以被訪問(wèn)多少次,甚至是限制每一個(gè)用戶(這里的用戶指的是訪問(wèn)改地址映射的用戶的IP)在規(guī)定的時(shí)間內(nèi)可以訪問(wèn)的次數(shù),防止用戶多次操作或者是惡意請(qǐng)求攻擊服務(wù)。
網(wǎng)關(guān)限流
網(wǎng)關(guān)可以提供用戶統(tǒng)一的訪問(wèn)入口,在Nginx限流過(guò)后,依然會(huì)有很大一波流量會(huì)承載的網(wǎng)關(guān)上,那這個(gè)時(shí)候的限流是針對(duì)于網(wǎng)關(guān)甚至是針對(duì)于網(wǎng)關(guān)所掛在的微服務(wù),我們需要限定用戶在只能針對(duì)某個(gè)微服務(wù)在特定的時(shí)間段內(nèi)只能訪問(wèn)多少次,如果不加限制的會(huì),可能會(huì)因?yàn)椴l(fā)量的過(guò)大導(dǎo)致服務(wù)宕機(jī),甚至引起雪崩效應(yīng)。
2.架構(gòu)圖

3.為什么需要兩個(gè)限流
原因有以下幾點(diǎn):
- 1.Nginx限流過(guò)后流量仍然很大:為nginx限流只是針對(duì)于用戶訪問(wèn)的一個(gè)入口,這個(gè)入口直接開放給網(wǎng)關(guān),這個(gè)時(shí)候你不清楚用戶真正的訪問(wèn)意圖,如果在這里的限制力度過(guò)大,導(dǎo)致用戶能請(qǐng)求的次數(shù)過(guò)少,就會(huì)導(dǎo)致頁(yè)面加載緩慢的問(wèn)題,畢竟有時(shí)候一個(gè)頁(yè)面的請(qǐng)求甚至?xí)^(guò)100個(gè)(例如淘寶網(wǎng)等)
- 2.無(wú)法做到針對(duì)單個(gè)服務(wù)的限流:如果你Nginx開放了一秒一個(gè)用戶200r/s的請(qǐng)求,如果有人惡意的將所有的請(qǐng)求對(duì)準(zhǔn)你的一個(gè)服務(wù)的一個(gè)借口,很可能導(dǎo)致服務(wù)宕機(jī),所以需要網(wǎng)關(guān)這層針對(duì)每個(gè)服務(wù)進(jìn)行限流。
- 3.無(wú)法實(shí)現(xiàn)一些自定義的限流模型:單獨(dú)的Nginx限流過(guò)于單一,無(wú)法滿足特定的業(yè)務(wù)需求。
4.如何實(shí)現(xiàn)限流
具體的實(shí)現(xiàn)方式是令牌桶算法,就是某一時(shí)刻一個(gè)IP最多只能訪問(wèn)有效的次數(shù)。
創(chuàng)建令牌桶的實(shí)現(xiàn)
這里需要將其配置為bean,而且需要傳入一個(gè)唯一標(biāo)識(shí)作為令牌,這里的令牌最好是訪問(wèn)你的服務(wù)的IP,這樣就可以做到限制。
@Bean(name = "ipKeyResolver")
public KeyResolver userKeyResolver(){
return new KeyResolver() {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
String ip = exchange.getRequest().getRemoteAddress().getHostString();
System.out.println("你的IP地址是"+ip);
return Mono.just(ip);
}
};
}配置
這里是需要配置redis的,因?yàn)檫@個(gè)令牌桶是基于redis實(shí)現(xiàn)的。
spring:
application:
name: gateway-admin
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods:
- GET
- POST
- PUT
- DELETE
routes:
- id: file
#uri: http://localhost:8001
uri: lb://file
filters:
- StripPrefix=1
#固定配置
- name: RequestRateLimiter
args:
#上面配置的令牌桶的實(shí)現(xiàn)的bean的名稱
key-resolver: "#{@ipKeyResolver}"
#可以允許的一秒中的訪問(wèn)次數(shù)
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstcapacity: 1
predicates:
- Path=/brand/**
redis:
host: redis的ip地址
port: 6379
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java面試題 從源碼角度分析HashSet實(shí)現(xiàn)原理
這篇文章主要介紹了Java面試題 從源碼角度分析HashSet實(shí)現(xiàn)原理?,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
Spring單例類加載多例屬性問(wèn)題實(shí)例解析
本文給大家介紹Spring單例類加載多例屬性問(wèn)題實(shí)例解析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2026-03-03
java 中用split分割字符串,最后的空格等不被拆分的方法
下面小編就為大家?guī)?lái)一篇java 中用split分割字符串,最后的空格等不被拆分的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
MyBatis批量插入大量數(shù)據(jù)(1w以上)
MyBatis進(jìn)行批量插入數(shù)時(shí),一次性插入超過(guò)一千條的時(shí)候MyBatis開始報(bào)錯(cuò),本文主要介紹了MyBatis批量插入大量數(shù)據(jù)的解決方法,感興趣的可以了解一下2022-01-01
IDEA集成DeepSeek的詳細(xì)教程(保姆級(jí)教程)
DeepSeek作為一款強(qiáng)大的代碼搜索和分析工具,能夠幫助開發(fā)者快速定位代碼、理解項(xiàng)目結(jié)構(gòu)以及優(yōu)化代碼質(zhì)量,本文將詳細(xì)介紹如何在IntelliJ?IDEA中集成DeepSeek,并展示如何利用它來(lái)提升開發(fā)效率,感興趣的朋友一起看看吧2025-02-02
Java多線程通訊之wait,notify的區(qū)別詳解
這篇文章主要介紹了Java多線程通訊之wait,notify的區(qū)別詳解,非常不錯(cuò),具有一定的參考借鑒借鑒價(jià)值,需要的朋友可以參考下2018-07-07
SpringBoot 定制化返回?cái)?shù)據(jù)的實(shí)現(xiàn)示例
這篇文章主要介紹了SpringBoot 定制化返回?cái)?shù)據(jù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

