成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:網關如何實現限流?

開發 架構
主流網關組件 Spring Cloud Gateway 實現限流的方式主要有兩種:內置限流過濾器和外部限流組件,如 Sentinel、Hystrix 等。而最簡單的限流功能,我們只需要使用 Spring Cloud Gateway 過濾器 + Redis 即可(實現),其使用的是令牌桶的限流算法來實現限流功能的。

網關(Gateway)是微服務中不可缺少的一部分,它是微服務中提供了統一訪問地址的組件,充當了客戶端和內部微服務之間的中介。網關主要負責流量路由和轉發,將外部請求引導到相應的微服務實例上,同時提供一些功能,如身份認證、授權、限流、監控、日志記錄等。

網關的主要作用有以下幾個:

  • 路由功能:網關可以根據目標地址的不同,選擇最佳的路徑將數據包從源網絡路由到目標網絡。它通過維護路由表來確定數據包的轉發方向,并選擇最優的路徑。
  • 安全控制(統一認證授權):網關可以實施網絡安全策略,對進出的數據包進行檢查和過濾。它可以驗證和授權來自源網絡的數據包,并阻止未經授權的訪問。防火墻是一種常見的網關設備,用于過濾和保護網絡免受惡意攻擊和未經授權的訪問。
  • 協議轉換:不同網絡使用不同的通信協議,網關可以進行協議轉換,使得不同網絡的設備可以互相通信。例如,例如將 HTTPS 協議轉換成 HTTP 協議。
  • 網絡地址轉換(NAT):網關還可以執行網絡地址轉換,將內部網絡使用的私有 IP 地址轉換為外部網絡使用的公共 IP 地址,以實現多臺計算機共享一個公共 IP 地址出去上網。

1、關于限流

為了保護后端微服務免受突發高流量請求的影響,確保系統的穩定和可靠性,所以在網關層必須“限流”操作。

限流是一種流量控制的策略,用于限制系統處理請求的速率或數量,以保護系統免受過載或攻擊的影響。通過限制請求的數量或速率,可以平衡系統和資源之間的壓力,確保系統在可接受的范圍內運行。

限流的常見策略通常有以下幾種:

  • 請求速率限流:限制單位時間內系統可以接受的最大請求數量。例如,每秒最多處理 100 個請求。當請求超過限制時,可以選擇拒絕或延遲處理這些請求。
  • 并發請求數限流:限制同時處理的請求數量。例如,限制系統只能同時處理100個并發請求。當并發請求數超過限制時,可以選擇拒絕或排隊等待。
  • 用戶級別限流:根據用戶進行限流,限制每個用戶的請求頻率或數量。例如,限制每個用戶每分鐘只能發送 10 個請求。當用戶請求超過限制時,可以選擇拒絕或延遲處理。
  • API 級別限流:根據 API 接口進行限流,限制每個接口的請求頻率或數量。例如,限制某個接口每秒只能處理 50 個請求。當接口請求超過限制時,可以選擇拒絕或延遲處理。

當然,我們也可以在程序中使用多種策略混合限流,以保證內部微服務的穩定性。

2、如何實現限流?

了解了網關和限流的相關內容之后,我們以目前主流的網關組件 Spring Cloud Gateway 為例,來實現一下限流功能。

Spring Cloud Gateway 實現限流的方式有兩種:

  • 使用內置 Filter(過濾器)實現限流。
  • 使用限流組件 Spring Cloud Alibaba Sentinel 或者 Spring Cloud Netflix Hystrix 實現限流。

那既然 Spring Cloud Gateway 中已經內置了限流功能,那我們接下來就來看 Spring Cloud Gateway 內置限流是如何實現的?

Spring Cloud Gateway 內置的限流器為 RequestRateLimiter GatewayFilter Factory,官網說明文檔:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-requestratelimiter-gatewayfilter-factory

Spring Cloud Gateway 支持和 Redis 一起來實現限流功能,它的實現步驟如下:

  • 在網關項目中添加 Redis 框架依賴
  • 創建限流規則
  • 配置限流過濾器

具體實現如下。

(1)添加 Redis 框架依賴

在項目的 pom.xml 中,添加以下配置信息(添加 Redis 框架依賴支持):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

(2)創建限流規則

接下來我們新建一個限流規則定義類,實現一下根據 IP 進行限流的功能,實現示例代碼如下:

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class IpAddressKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(exchange.getRequest().getRemoteAddress().
                         getHostString());
    }
}

這一步其實是在配置限流器的限流參數 KeyResolver,也就是限流功能的依賴“憑證”。

PS:當然,我們還可以通過 URL、方法名、用戶等進行限流操作,只需要修改此步驟中的限流憑證,也就是 KeyResolver 即可。

(3)配置限流過濾器

在網關項目的配置文件中,添加以下配置信息:

spring:
  cloud:
    gateway:
      routes:
        - id: retry
          uri: lb://nacos-discovery-demo
          predicates:
            - Path=/retry/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 1
                redis-rate-limiter.burstCapacity: 1
                keyResolver: '#{@ipAddressKeyResolver}' # spEL表達式
  data:
    redis:
      host: 127.0.0.1
      port: 16379
      database: 0

其中,name 必須等于“RequestRateLimiter”內置限流過濾器,其他參數的含義如下:

  • redis-rate-limiter.replenishRate:令牌填充速度:每秒允許請求數。
  • redis-rate-limiter.burstCapacity:令牌桶容量:最大令牌數。
  • keyResolver:根據哪個 key 進行限流,它的值是 spEL 表達式。

SpEL(Spring Expression Language,Spring 表達式語言)是 Spring 框架中用于提供靈活、強大的表達式解析和求值功能的統一表達式語言。它可以在運行時動態地解析和求值字符串表達式,通常用于配置文件中的屬性值、注解、XML 配置等地方。

注意事項

當 Spring Cloud Gateway 配合 Redis 實現限流的時候,它對于 Redis 的版本是有要求的,因為它在限流時調用了一個 Redis 高版本的函數,所以 Redis Server 版本太低,限流無效,Redis Server 最好是 5.X 以上。

(4)限流測試

最后,我們頻繁的訪問:http://localhost:10086/retry/test 就會看到如下限流信息:

3、限流實現算法

Spring Cloud Gateway 內置限流功能使用的算法是令牌桶限流算法

令牌桶限流算法:令牌按固定的速率被放入令牌桶中,桶中最多存放 N 個令牌(Token),當桶裝滿時,新添加的令牌被丟棄或拒絕。當請求到達時,將從桶中刪除 1 個令牌。令牌桶中的令牌不僅可以被移除,還可以往里添加,所以為了保證接口隨時有數據通過,必須不停地往桶里加令牌。由此可見,往桶里加令牌的速度就決定了數據通過接口的速度。我們通過控制往令牌桶里加令牌的速度從而控制接口的流量。 令牌桶執行流程如下圖所示:

常見的限流算法還有:計數器算法、滑動計數器算法、漏桶算法等,更多介紹參考我之前寫個的文章:https://www.javacn.site/interview/springcloud/loadbalancer.html。

4、限流實現原理

Spring Cloud Gateway 執行過程如下圖所示:

從圖中可以看出,所有的請求來了之后,會先走過濾器,只有過濾器通過之后,才能調用后續的內部微服務,這樣我們就可以通過過濾器來控制微服務的調用,從而實現限流功能了。

Spring Cloud Gateway 過濾器是基于令牌桶算法來限制請求的速率,該過濾器根據配置的限流規則,在指定的時間窗口內分配一定數量的令牌,每個令牌代表一個允許通過的請求,當一個請求到達時,如果沒有可用的令牌,則請求將被阻塞或拒絕。

令牌桶的執行過程如下:

  • 初始化:在加載過濾器工廠時,會基于給定的限流規則創建一個限流器,該限流器包含了令牌桶算法的邏輯。默認情況下,令牌桶是按照固定速率進行填充,也可以配置為令牌桶按照令牌令牌的方式進行填充。
  • 請求處理:每當有請求進來時,限流器會檢查當前令牌桶中是否有可用的令牌。如果有可用的令牌,則請求會被放行,令牌桶中的令牌數量減少;如果沒有可用的令牌,則請求會被阻塞或拒絕。
  • 令牌桶填充:限流器會定期填充令牌桶,即向令牌桶中添加新的令牌。填充的速率取決于限流規則中配置的速率值。
  • 令牌桶容量控制:限流器還會根據限流規則中配置的令牌桶容量,控制令牌桶中的令牌數量。如果令牌桶已滿,則多余的令牌會被丟棄。

小結

主流網關組件 Spring Cloud Gateway 實現限流的方式主要有兩種:內置限流過濾器和外部限流組件,如 Sentinel、Hystrix 等。而最簡單的限流功能,我們只需要使用 Spring Cloud Gateway 過濾器 + Redis 即可(實現),其使用的是令牌桶的限流算法來實現限流功能的。

責任編輯:姜華 來源: Java中文社群
相關推薦

2024-02-04 10:08:34

2024-12-25 15:44:15

2024-02-26 14:07:18

2023-02-20 08:08:48

限流算法計數器算法令牌桶算法

2024-02-20 14:10:55

系統緩存冗余

2024-09-11 22:51:19

線程通訊Object

2024-04-19 00:00:00

計數器算法限流算法

2024-04-09 10:40:04

2024-01-19 14:03:59

Redis緩存系統Spring

2024-01-26 13:16:00

RabbitMQ延遲隊列docker

2024-10-22 16:39:07

2015-08-13 10:29:12

面試面試官

2021-05-20 08:54:16

Go面向對象

2021-12-15 06:58:13

List 集合LinkedHashS

2023-02-16 08:10:40

死鎖線程

2021-05-20 08:34:03

CDN原理網絡

2024-09-09 15:09:30

2021-10-26 10:29:45

掃碼登錄功能

2021-05-19 06:07:21

CSS 斜線效果技巧

2021-11-02 09:05:25

Redis
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜精品久久久 | 美美女高清毛片视频免费观看 | 一区二区三区四区视频 | 偷拍亚洲色图 | 日韩精品久久久 | 亚洲精品二区 | 成人国产精品久久 | 久久久精品一区二区三区 | 亚洲www啪成人一区二区麻豆 | 亚洲一区二区三区免费观看 | 久久机热 | 国产成人综合亚洲欧美94在线 | 亚洲一区欧美一区 | 成人亚洲综合 | 久久91精品国产一区二区 | 在线免费国产视频 | 亚洲男人天堂 | 暖暖日本在线视频 | 超碰精品在线 | 国产综合av | 日韩中文字幕在线观看视频 | 亚洲一二三区av | 四虎影院欧美 | 欧美日韩中文字幕在线 | 激情久久久久 | 成人国产精品久久 | 妞干网视频| 成人伊人| 在线观看亚洲 | 欧美片网站免费 | 欧美日本韩国一区二区 | 中文字幕一区二区三区在线观看 | 韩日在线 | 久久久久久中文字幕 | 亚洲精品久久久久久久久久久久久 | 亚洲成av | 亚洲一区二区三区四区五区中文 | 国产精品国产三级国产aⅴ中文 | 久久成人免费观看 | 午夜影院在线 | 99亚洲|