真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringCloudGateway之限流-創(chuàng)新互聯(lián)

簡介

在高并發(fā)的系統(tǒng)中,往往需要在系統(tǒng)中做限流,一方面是為了防止大量的請求使服務器過載,導致服務不可用,另一方面是為了防止網(wǎng)絡(luò)***。

創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!專注中小微企業(yè)官網(wǎng)定制,網(wǎng)站設(shè)計、網(wǎng)站制作,塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應。

一般開發(fā)高并發(fā)系統(tǒng)常見的限流有:限制總并發(fā)數(shù)(比如數(shù)據(jù)庫連接池、線程池)、限制瞬時并發(fā)數(shù)(如 nginx 的 limit_conn 模塊,用來限制瞬時并發(fā)連接數(shù))、限制時間窗口內(nèi)的平均速率(如 Guava 的 RateLimiter、nginx 的 limit_req 模塊,限制每秒的平均速率);其他還有如限制遠程接口調(diào)用速率、限制 MQ 的消費速率。另外還可以根據(jù)網(wǎng)絡(luò)連接數(shù)、網(wǎng)絡(luò)流量、CPU 或內(nèi)存負載等來限流。

限流算法

計數(shù)器

簡單的做法是維護一個單位時間內(nèi)的 計數(shù)器,每次請求計數(shù)器加1,當單位時間內(nèi)計數(shù)器累加到大于設(shè)定的閾值,則之后的請求都被拒絕,直到單位時間已經(jīng)過去,再將 計數(shù)器 重置為零。此方式有個弊端:如果在單位時間1s內(nèi)允許100個請求,在10ms已經(jīng)通過了100個請求,那后面的990ms,只能眼巴巴的把請求拒絕,我們把這種現(xiàn)象稱為“突刺現(xiàn)象”。

常用的更平滑的限流算法有兩種:漏桶算法令牌桶算法。下面介紹下二者。

漏桶算法

漏桶算法思路很簡單,水(請求)先進入到漏桶里,漏桶以一定的速度出水(接口有響應速率),當水流入速度過大會直接溢出(訪問頻率超過接口響應速率),然后就拒絕請求,可以看出漏桶算法能強行限制數(shù)據(jù)的傳輸速率。

Spring Cloud Gateway 之 限流

可見這里有兩個變量,一個是桶的大小,支持流量突發(fā)增多時可以存多少的水(burst),另一個是水桶漏洞的大小(rate)。因為漏桶的漏出速率是固定的參數(shù),所以,即使網(wǎng)絡(luò)中不存在資源沖突(沒有發(fā)生擁塞),漏桶算法也不能使流突發(fā)(burst)到端口速率。因此,漏桶算法對于存在突發(fā)特性的流量來說缺乏效率。

令牌桶算法

令牌桶算法 和漏桶算法 效果一樣但方向相反的算法,更加容易理解。隨著時間流逝,系統(tǒng)會按恒定 1/QPS 時間間隔(如果 QPS=100,則間隔是 10ms)往桶里加入 Token(想象和漏洞漏水相反,有個水龍頭在不斷的加水),如果桶已經(jīng)滿了就不再加了。新請求來臨時,會各自拿走一個 Token,如果沒有 Token 可拿了就阻塞或者拒絕服務。

Spring Cloud Gateway 之 限流

令牌桶的另外一個好處是可以方便的改變速度。一旦需要提高速率,則按需提高放入桶中的令牌的速率。一般會定時(比如 100 毫秒)往桶中增加一定數(shù)量的令牌,有些變種算法則實時的計算應該增加的令牌的數(shù)量。

限流實現(xiàn)

在 Spring Cloud Gateway 上實現(xiàn)限流是個不錯的選擇,只需要編寫一個過濾器就可以了。有了前邊過濾器的基礎(chǔ),寫起來很輕松。

Spring Cloud Gateway 已經(jīng)內(nèi)置了一個RequestRateLimiterGatewayFilterFactory,我們可以直接使用。

目前RequestRateLimiterGatewayFilterFactory的實現(xiàn)依賴于 Redis,所以我們還要引入spring-boot-starter-data-redis-reactive。

pom.xml


    org.springframework.cloud
    spring-cloud-starter-gateway



    org.springframework.boot
    spring-boot-starter-data-redis-reactive

application.yml

server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
        - id: limit_route
          uri: http://httpbin.org:80/get
          predicates:
          - After=2019-02-26T00:00:00+08:00[Asia/Shanghai]
          filters:
          - name: RequestRateLimiter
            args:
              key-resolver: '#{@hostAddrKeyResolver}'
              redis-rate-limiter.replenishRate: 1
              redis-rate-limiter.burstCapacity: 3
  application:
    name: gateway-limiter
  redis:
    host: localhost
    port: 6379
    database: 0

在上面的配置文件,配置了 redis的信息,并配置了RequestRateLimiter的限流過濾器,該過濾器需要配置三個參數(shù):

  • burstCapacity:令牌桶總?cè)萘俊?/li>
  • replenishRate:令牌桶每秒填充平均速率。
  • key-resolver:用于限流的鍵的解析器的 Bean 對象的名字。它使用 SpEL 表達式根據(jù)#{@beanName}從 Spring 容器中獲取 Bean 對象。

IP限流

獲取請求用戶ip作為限流key。

@Bean
public KeyResolver hostAddrKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}

用戶限流

獲取請求用戶id作為限流key。

@Bean
public KeyResolver userKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
}

接口限流

獲取請求地址的uri作為限流key。

@Bean
KeyResolver apiKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getPath().value());
}

歡迎關(guān)注我的公眾號《程序員果果》,關(guān)注有驚喜~~
Spring Cloud Gateway 之 限流

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。


本文標題:SpringCloudGateway之限流-創(chuàng)新互聯(lián)
標題路徑:http://weahome.cn/article/djejoh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部