SpringCloud微服務網(wǎng)關(guān)限流方式
1.限流的兩種實現(xiàn)方式
nginx限流
在nginx中,通過限流可以規(guī)定一個一個地址映射每一秒可以被訪問多少次,甚至是限制每一個用戶(這里的用戶指的是訪問改地址映射的用戶的IP)在規(guī)定的時間內(nèi)可以訪問的次數(shù),防止用戶多次操作或者是惡意請求攻擊服務。
網(wǎng)關(guān)限流
網(wǎng)關(guān)可以提供用戶統(tǒng)一的訪問入口,在Nginx限流過后,依然會有很大一波流量會承載的網(wǎng)關(guān)上,那這個時候的限流是針對于網(wǎng)關(guān)甚至是針對于網(wǎng)關(guān)所掛在的微服務,我們需要限定用戶在只能針對某個微服務在特定的時間段內(nèi)只能訪問多少次,如果不加限制的會,可能會因為并發(fā)量的過大導致服務宕機,甚至引起雪崩效應。
2.架構(gòu)圖
3.為什么需要兩個限流
原因有以下幾點:
- 1.Nginx限流過后流量仍然很大:為nginx限流只是針對于用戶訪問的一個入口,這個入口直接開放給網(wǎng)關(guān),這個時候你不清楚用戶真正的訪問意圖,如果在這里的限制力度過大,導致用戶能請求的次數(shù)過少,就會導致頁面加載緩慢的問題,畢竟有時候一個頁面的請求甚至會超過100個(例如淘寶網(wǎng)等)
- 2.無法做到針對單個服務的限流:如果你Nginx開放了一秒一個用戶200r/s的請求,如果有人惡意的將所有的請求對準你的一個服務的一個借口,很可能導致服務宕機,所以需要網(wǎng)關(guān)這層針對每個服務進行限流。
- 3.無法實現(xiàn)一些自定義的限流模型:單獨的Nginx限流過于單一,無法滿足特定的業(yè)務需求。
4.如何實現(xiàn)限流
具體的實現(xiàn)方式是令牌桶算法,就是某一時刻一個IP最多只能訪問有效的次數(shù)。
創(chuàng)建令牌桶的實現(xiàn)
這里需要將其配置為bean,而且需要傳入一個唯一標識作為令牌,這里的令牌最好是訪問你的服務的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)文章
spring boot的健康檢查HealthIndicators實戰(zhàn)
這篇文章主要介紹了spring boot的健康檢查HealthIndicators實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10在Spring Boot中使用Spring-data-jpa實現(xiàn)分頁查詢
如何使用jpa進行多條件查詢以及查詢列表分頁呢?下面我將介紹兩種多條件查詢方式。具體實例代碼大家參考下本文吧2017-07-07