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è)入口直接開(kāi)放給網(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開(kāi)放了一秒一個(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)文章
Mybatis中Mapper標(biāo)簽總結(jié)大全
這篇文章主要介紹了Mybatis中Mapper標(biāo)簽總結(jié)大全,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06spring boot的健康檢查HealthIndicators實(shí)戰(zhàn)
這篇文章主要介紹了spring boot的健康檢查HealthIndicators實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10idea一招搞定同步所有配置(導(dǎo)入或?qū)С鏊信渲?
使用intellij idea很長(zhǎng)一段時(shí)間,軟件相關(guān)的配置也都按照自己習(xí)慣的設(shè)置好,如果需要重裝軟件,還得需要重新設(shè)置,本文就詳細(xì)的介紹了idea 同步所有配置,感興趣的可以了解一下2021-07-07簡(jiǎn)單了解Java的默認(rèn)和靜態(tài)方法
這篇文章主要介紹了簡(jiǎn)單了解Java的默認(rèn)和靜態(tài)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Spring?Security?過(guò)濾器注冊(cè)脈絡(luò)梳理
這篇文章主要介紹了Spring?Security過(guò)濾器注冊(cè)脈絡(luò)梳理,Spring?Security在Servlet的過(guò)濾鏈中注冊(cè)了一個(gè)過(guò)濾器FilterChainProxy,它會(huì)把請(qǐng)求代理到Spring?Security自己維護(hù)的多個(gè)過(guò)濾鏈,每個(gè)過(guò)濾鏈會(huì)匹配一些URL,如果匹配則執(zhí)行對(duì)應(yīng)的過(guò)濾器2022-08-08在Spring Boot中使用Spring-data-jpa實(shí)現(xiàn)分頁(yè)查詢
如何使用jpa進(jìn)行多條件查詢以及查詢列表分頁(yè)呢?下面我將介紹兩種多條件查詢方式。具體實(shí)例代碼大家參考下本文吧2017-07-07mybatis二級(jí)緩存默認(rèn)未開(kāi)啟源碼的問(wèn)題
這篇文章主要介紹了mybatis二級(jí)緩存默認(rèn)未開(kāi)啟源碼的問(wèn)題及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11