自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:網(wǎng)關(guān)如何實(shí)現(xiàn)限流?

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

網(wǎng)關(guān)(Gateway)是微服務(wù)中不可缺少的一部分,它是微服務(wù)中提供了統(tǒng)一訪問地址的組件,充當(dāng)了客戶端和內(nèi)部微服務(wù)之間的中介。網(wǎng)關(guān)主要負(fù)責(zé)流量路由和轉(zhuǎn)發(fā),將外部請(qǐng)求引導(dǎo)到相應(yīng)的微服務(wù)實(shí)例上,同時(shí)提供一些功能,如身份認(rèn)證、授權(quán)、限流、監(jiān)控、日志記錄等。

網(wǎng)關(guān)的主要作用有以下幾個(gè):

  • 路由功能:網(wǎng)關(guān)可以根據(jù)目標(biāo)地址的不同,選擇最佳的路徑將數(shù)據(jù)包從源網(wǎng)絡(luò)路由到目標(biāo)網(wǎng)絡(luò)。它通過維護(hù)路由表來確定數(shù)據(jù)包的轉(zhuǎn)發(fā)方向,并選擇最優(yōu)的路徑。
  • 安全控制(統(tǒng)一認(rèn)證授權(quán)):網(wǎng)關(guān)可以實(shí)施網(wǎng)絡(luò)安全策略,對(duì)進(jìn)出的數(shù)據(jù)包進(jìn)行檢查和過濾。它可以驗(yàn)證和授權(quán)來自源網(wǎng)絡(luò)的數(shù)據(jù)包,并阻止未經(jīng)授權(quán)的訪問。防火墻是一種常見的網(wǎng)關(guān)設(shè)備,用于過濾和保護(hù)網(wǎng)絡(luò)免受惡意攻擊和未經(jīng)授權(quán)的訪問。
  • 協(xié)議轉(zhuǎn)換:不同網(wǎng)絡(luò)使用不同的通信協(xié)議,網(wǎng)關(guān)可以進(jìn)行協(xié)議轉(zhuǎn)換,使得不同網(wǎng)絡(luò)的設(shè)備可以互相通信。例如,例如將 HTTPS 協(xié)議轉(zhuǎn)換成 HTTP 協(xié)議。
  • 網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT):網(wǎng)關(guān)還可以執(zhí)行網(wǎng)絡(luò)地址轉(zhuǎn)換,將內(nèi)部網(wǎng)絡(luò)使用的私有 IP 地址轉(zhuǎn)換為外部網(wǎng)絡(luò)使用的公共 IP 地址,以實(shí)現(xiàn)多臺(tái)計(jì)算機(jī)共享一個(gè)公共 IP 地址出去上網(wǎng)。

1、關(guān)于限流

為了保護(hù)后端微服務(wù)免受突發(fā)高流量請(qǐng)求的影響,確保系統(tǒng)的穩(wěn)定和可靠性,所以在網(wǎng)關(guān)層必須“限流”操作。

限流是一種流量控制的策略,用于限制系統(tǒng)處理請(qǐng)求的速率或數(shù)量,以保護(hù)系統(tǒng)免受過載或攻擊的影響。通過限制請(qǐng)求的數(shù)量或速率,可以平衡系統(tǒng)和資源之間的壓力,確保系統(tǒng)在可接受的范圍內(nèi)運(yùn)行。

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

  • 請(qǐng)求速率限流:限制單位時(shí)間內(nèi)系統(tǒng)可以接受的最大請(qǐng)求數(shù)量。例如,每秒最多處理 100 個(gè)請(qǐng)求。當(dāng)請(qǐng)求超過限制時(shí),可以選擇拒絕或延遲處理這些請(qǐng)求。
  • 并發(fā)請(qǐng)求數(shù)限流:限制同時(shí)處理的請(qǐng)求數(shù)量。例如,限制系統(tǒng)只能同時(shí)處理100個(gè)并發(fā)請(qǐng)求。當(dāng)并發(fā)請(qǐng)求數(shù)超過限制時(shí),可以選擇拒絕或排隊(duì)等待。
  • 用戶級(jí)別限流:根據(jù)用戶進(jìn)行限流,限制每個(gè)用戶的請(qǐng)求頻率或數(shù)量。例如,限制每個(gè)用戶每分鐘只能發(fā)送 10 個(gè)請(qǐng)求。當(dāng)用戶請(qǐng)求超過限制時(shí),可以選擇拒絕或延遲處理。
  • API 級(jí)別限流:根據(jù) API 接口進(jìn)行限流,限制每個(gè)接口的請(qǐng)求頻率或數(shù)量。例如,限制某個(gè)接口每秒只能處理 50 個(gè)請(qǐng)求。當(dāng)接口請(qǐng)求超過限制時(shí),可以選擇拒絕或延遲處理。

當(dāng)然,我們也可以在程序中使用多種策略混合限流,以保證內(nèi)部微服務(wù)的穩(wěn)定性。

2、如何實(shí)現(xiàn)限流?

了解了網(wǎng)關(guān)和限流的相關(guān)內(nèi)容之后,我們以目前主流的網(wǎng)關(guān)組件 Spring Cloud Gateway 為例,來實(shí)現(xiàn)一下限流功能。

Spring Cloud Gateway 實(shí)現(xiàn)限流的方式有兩種:

  • 使用內(nèi)置 Filter(過濾器)實(shí)現(xiàn)限流。
  • 使用限流組件 Spring Cloud Alibaba Sentinel 或者 Spring Cloud Netflix Hystrix 實(shí)現(xiàn)限流。

那既然 Spring Cloud Gateway 中已經(jīng)內(nèi)置了限流功能,那我們接下來就來看 Spring Cloud Gateway 內(nèi)置限流是如何實(shí)現(xiàn)的?

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

Spring Cloud Gateway 支持和 Redis 一起來實(shí)現(xiàn)限流功能,它的實(shí)現(xiàn)步驟如下:

  • 在網(wǎng)關(guān)項(xiàng)目中添加 Redis 框架依賴
  • 創(chuàng)建限流規(guī)則
  • 配置限流過濾器

具體實(shí)現(xiàn)如下。

(1)添加 Redis 框架依賴

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

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

(2)創(chuàng)建限流規(guī)則

接下來我們新建一個(gè)限流規(guī)則定義類,實(shí)現(xiàn)一下根據(jù) IP 進(jìn)行限流的功能,實(shí)現(xiàn)示例代碼如下:

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());
    }
}

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

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

(3)配置限流過濾器

在網(wǎng)關(guān)項(xiàng)目的配置文件中,添加以下配置信息:

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表達(dá)式
  data:
    redis:
      host: 127.0.0.1
      port: 16379
      database: 0

其中,name 必須等于“RequestRateLimiter”內(nèi)置限流過濾器,其他參數(shù)的含義如下:

  • redis-rate-limiter.replenishRate:令牌填充速度:每秒允許請(qǐng)求數(shù)。
  • redis-rate-limiter.burstCapacity:令牌桶容量:最大令牌數(shù)。
  • keyResolver:根據(jù)哪個(gè) key 進(jìn)行限流,它的值是 spEL 表達(dá)式。

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

注意事項(xiàng)

當(dāng) Spring Cloud Gateway 配合 Redis 實(shí)現(xiàn)限流的時(shí)候,它對(duì)于 Redis 的版本是有要求的,因?yàn)樗谙蘖鲿r(shí)調(diào)用了一個(gè) Redis 高版本的函數(shù),所以 Redis Server 版本太低,限流無效,Redis Server 最好是 5.X 以上。

(4)限流測試

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

3、限流實(shí)現(xiàn)算法

Spring Cloud Gateway 內(nèi)置限流功能使用的算法是令牌桶限流算法。

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

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

4、限流實(shí)現(xiàn)原理

Spring Cloud Gateway 執(zhí)行過程如下圖所示:

從圖中可以看出,所有的請(qǐng)求來了之后,會(huì)先走過濾器,只有過濾器通過之后,才能調(diào)用后續(xù)的內(nèi)部微服務(wù),這樣我們就可以通過過濾器來控制微服務(wù)的調(diào)用,從而實(shí)現(xiàn)限流功能了。

Spring Cloud Gateway 過濾器是基于令牌桶算法來限制請(qǐng)求的速率,該過濾器根據(jù)配置的限流規(guī)則,在指定的時(shí)間窗口內(nèi)分配一定數(shù)量的令牌,每個(gè)令牌代表一個(gè)允許通過的請(qǐng)求,當(dāng)一個(gè)請(qǐng)求到達(dá)時(shí),如果沒有可用的令牌,則請(qǐng)求將被阻塞或拒絕。

令牌桶的執(zhí)行過程如下:

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

小結(jié)

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

責(zé)任編輯:姜華 來源: Java中文社群
相關(guān)推薦

2024-12-25 15:44:15

2024-02-04 10:08:34

2024-02-26 14:07:18

2023-02-20 08:08:48

限流算法計(jì)數(shù)器算法令牌桶算法

2024-09-11 22:51:19

線程通訊Object

2024-02-20 14:10:55

系統(tǒng)緩存冗余

2024-04-19 00:00:00

計(jì)數(shù)器算法限流算法

2024-10-22 16:39:07

2024-01-19 14:03:59

Redis緩存系統(tǒng)Spring

2024-01-26 13:16:00

RabbitMQ延遲隊(duì)列docker

2024-04-09 10:40:04

2015-08-13 10:29:12

面試面試官

2021-05-20 08:34:03

CDN原理網(wǎng)絡(luò)

2021-10-26 10:29:45

掃碼登錄功能

2024-09-09 15:09:30

2021-05-19 06:07:21

CSS 斜線效果技巧

2021-05-20 08:54:16

Go面向對(duì)象

2021-12-15 06:58:13

List 集合LinkedHashS

2023-02-16 08:10:40

死鎖線程

2021-11-02 09:05:25

Redis
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)