" />

亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringCloud Gateway實現(xiàn)限流功能詳解

 更新時間:2022年11月17日 14:38:15   作者:做一道光  
SpringCloud Gateway 是 Spring Cloud 的一個全新項目,它旨在為微服務架構提供一種簡單有效的統(tǒng)一的 API 路由管理方式。這篇文章主要介紹了SpringCloud Gateway實現(xiàn)限流,需要的朋友可以參考下

1 什么是限流

通俗的說,限流就是 限制一段時間內(nèi),用戶訪問資源的次數(shù) ,減輕服務器壓力,限流大致分為兩種:

1. IP 限流(5s 內(nèi)同一個 ip 訪問超過 3 次,則限制不讓訪問,過一段時間才可繼續(xù)訪問)

2. 請求量限流(只要在一段時間內(nèi)(窗口期),請求次數(shù)達到閥值,就直接拒絕后面來的訪問了,過一段時間才可以繼續(xù)訪問)(粒度可以細化到一個 api(url),一個服務)

2 本次限流模型

限流模型 : 漏斗算法 ,令牌桶算法,窗口滑動算法 計數(shù)器算法

入不敷出

1)、所有的請求在處理之前都需要拿到一個可用的令牌才會被處理;

2)、根據(jù)限流大小,設置按照一定的 速率 往桶里添加令牌;

3)、 桶設置最大的放置令牌限制 ,當桶滿時、新添加的令牌就被丟棄或者拒絕;

4)、請求達到后首先要獲取令牌桶中的令牌,拿著令牌才可以進行其他的業(yè)務邏輯,處理完業(yè)務邏輯之后,將令牌直接刪除;

5)、令牌桶有最低限額,當桶中的令牌達到最低限額的時候,請求處理完之后將不會刪除令牌,以此保證足夠的限流;

3 Gateway結合redis實現(xiàn)請求量限流

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

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

3.1 添加依賴

<!--限流要引入 Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

3.2 修改配置文件

server :

     port: 80

spring:

     application:

            name: gateway-80

      cloud:

            gateway :

enabled: true

routes:

id: user-service

uri: lb: //consumer-user-service

predicates:

- Path=/info/**

filters:

- name : RequestRateLimiter

args:

key-resolver:'#{@hostAddrKeyResolver} '

redis-rate-limiter.replenishRate: 1

redis-rate-limiter . burstCapacity: 3

redis:#redis的配置

host: 192.168.226.128

port: 6379

database: 6

eureka :

instance:

instance-id: ${spring.application.name}:${server.port}

prefer-ip-address: true

client:

service-url:

defaultzone: http:/ / localhost:8761/eureka/

3.3 配置文件說明

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

burstCapacity:令牌桶總容量。

replenishRate:令牌桶每秒填充平均速率。

key-resolver:用于限流的鍵的解析器的 Bean 對象的名字。它使用 SpEL 表達式根據(jù)

3.4 創(chuàng)建配置類RequestRateLimiterConfig

@Configuration
public class RequestRateLimiterConfig {
/**
* IP 限流
* 把用戶的 IP 作為限流的 Key
*
* @return
*/
@Bean
@Primary
public KeyResolver hostAddrKeyResolver() {
return (exchange) -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
/**
* 用戶 id 限流
* 把用戶 ID 作為限流的 key
*
* @return
*/
@Bean
public KeyResolver userKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
}
/**
* 請求接口限流
* 把請求的路徑作為限流 key
*
* @return
*/
@Bean
public KeyResolver apiKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getPath().value());
}
}

3.5 啟動快速訪問測試

http://localhost/info?token=asdad 快速訪問后報 429

查看 redis

到此這篇關于springcloud gateway實現(xiàn)限流功能詳解的文章就介紹到這了,更多相關springcloud限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論