SpringCloud微服務(wù)網(wǎng)關(guān)限流方式
1.限流的兩種實現(xiàn)方式
nginx限流
在nginx中,通過限流可以規(guī)定一個一個地址映射每一秒可以被訪問多少次,甚至是限制每一個用戶(這里的用戶指的是訪問改地址映射的用戶的IP)在規(guī)定的時間內(nèi)可以訪問的次數(shù),防止用戶多次操作或者是惡意請求攻擊服務(wù)。
網(wǎng)關(guān)限流
網(wǎng)關(guān)可以提供用戶統(tǒng)一的訪問入口,在Nginx限流過后,依然會有很大一波流量會承載的網(wǎng)關(guān)上,那這個時候的限流是針對于網(wǎng)關(guān)甚至是針對于網(wǎng)關(guān)所掛在的微服務(wù),我們需要限定用戶在只能針對某個微服務(wù)在特定的時間段內(nèi)只能訪問多少次,如果不加限制的會,可能會因為并發(fā)量的過大導(dǎo)致服務(wù)宕機(jī),甚至引起雪崩效應(yīng)。
2.架構(gòu)圖
3.為什么需要兩個限流
原因有以下幾點(diǎn):
- 1.Nginx限流過后流量仍然很大:為nginx限流只是針對于用戶訪問的一個入口,這個入口直接開放給網(wǎng)關(guān),這個時候你不清楚用戶真正的訪問意圖,如果在這里的限制力度過大,導(dǎo)致用戶能請求的次數(shù)過少,就會導(dǎo)致頁面加載緩慢的問題,畢竟有時候一個頁面的請求甚至?xí)^100個(例如淘寶網(wǎng)等)
- 2.無法做到針對單個服務(wù)的限流:如果你Nginx開放了一秒一個用戶200r/s的請求,如果有人惡意的將所有的請求對準(zhǔn)你的一個服務(wù)的一個借口,很可能導(dǎo)致服務(wù)宕機(jī),所以需要網(wǎng)關(guān)這層針對每個服務(wù)進(jìn)行限流。
- 3.無法實現(xiàn)一些自定義的限流模型:單獨(dú)的Nginx限流過于單一,無法滿足特定的業(yè)務(wù)需求。
4.如何實現(xiàn)限流
具體的實現(xiàn)方式是令牌桶算法,就是某一時刻一個IP最多只能訪問有效的次數(shù)。
創(chuàng)建令牌桶的實現(xiàn)
這里需要將其配置為bean,而且需要傳入一個唯一標(biāo)識作為令牌,這里的令牌最好是訪問你的服務(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的,因為這個令牌桶是基于redis實現(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: #上面配置的令牌桶的實現(xiàn)的bean的名稱 key-resolver: "#{@ipKeyResolver}" #可以允許的一秒中的訪問次數(shù) redis-rate-limiter.replenishRate: 1 redis-rate-limiter.burstcapacity: 1 predicates: - Path=/brand/** redis: host: redis的ip地址 port: 6379
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis中Mapper標(biāo)簽總結(jié)大全
這篇文章主要介紹了Mybatis中Mapper標(biāo)簽總結(jié)大全,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06spring boot的健康檢查HealthIndicators實戰(zhàn)
這篇文章主要介紹了spring boot的健康檢查HealthIndicators實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10idea一招搞定同步所有配置(導(dǎo)入或?qū)С鏊信渲?
使用intellij idea很長一段時間,軟件相關(guān)的配置也都按照自己習(xí)慣的設(shè)置好,如果需要重裝軟件,還得需要重新設(shè)置,本文就詳細(xì)的介紹了idea 同步所有配置,感興趣的可以了解一下2021-07-07Spring?Security?過濾器注冊脈絡(luò)梳理
這篇文章主要介紹了Spring?Security過濾器注冊脈絡(luò)梳理,Spring?Security在Servlet的過濾鏈中注冊了一個過濾器FilterChainProxy,它會把請求代理到Spring?Security自己維護(hù)的多個過濾鏈,每個過濾鏈會匹配一些URL,如果匹配則執(zhí)行對應(yīng)的過濾器2022-08-08在Spring Boot中使用Spring-data-jpa實現(xiàn)分頁查詢
如何使用jpa進(jìn)行多條件查詢以及查詢列表分頁呢?下面我將介紹兩種多條件查詢方式。具體實例代碼大家參考下本文吧2017-07-07