Spring Cloud Gateway 原生支持接口限流該怎么玩

關于pig:

基于Spring Cloud、oAuth2.0開發基于Vue前后分離的開發平臺,支持賬號、短信、SSO等多種登錄,提供配套視頻開發教程。

關于 Spring Cloud Gateway

SpringCloudGateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技術開發的網關,Spring云網關旨在提供一種簡單而有效的路由API的方法。Spring Cloud Gateway作為Spring Cloud生態系中的網關,目標是替代Netflix ZUUL,其不僅提供統一的路由方式,并且基于Filter鏈的方式提供了網關基本的功能,例如:安全,監控/埋點,和限流等。

zuul如何實現多維度限流請參考我的博客

[Zuul:構建高可用網關之多維度限流]

開始Gateway 限流

POM 依賴

<!--spring cloud gateway依賴-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--基于 reactive stream 的redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

配置按照請求IP 的限流

spring:cloud:gateway:routes:- id: requestratelimiter_routeuri: lb://pigx-upmsorder: 10000predicates:- Path=/admin/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 1  # 令牌桶的容積redis-rate-limiter.burstCapacity: 3  # 流速 每秒key-resolver: "#{@remoteAddrKeyResolver}" #SPEL表達式去的對應的bean- StripPrefix=1

配置bean,多維度限流量的入口

/**
* 自定義限流標志的key,多個維度可以從這里入手
* exchange對象中獲取服務ID、請求信息,用戶信息等
*/
@Bean
KeyResolver remoteAddrKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}

OK 完成。

壓力測試

并發5個線程。
image

Redis 數據變化

我們使用redis的monitor 命令,實時查看redis 的操作情況。
會發現在redis中會操作兩個key

  • request_rate_limiter.{xxx}.timestamp
  • request_rate_limiter.{xxx}.tokens
    image

實現原理

image

Spring Cloud Gateway 默認實現 Redis限流,如果擴展只需要實現ratelimter接口即可。

RedisRateLimter 的核心代碼,判斷是否取到令牌的實現,通過調用 redis的LUA 腳本。

public Mono<Response> isAllowed(String routeId, String id) {Config routeConfig = getConfig().getOrDefault(routeId, defaultConfig);int replenishRate = routeConfig.getReplenishRate();int burstCapacity = routeConfig.getBurstCapacity();try {List<String> keys = getKeys(id);returns unixtime in seconds.List<String> scriptArgs = Arrays.asList(replenishRate + "", burstCapacity + "",Instant.now().getEpochSecond() + "", "1");// 這里是核心,執行redis 的LUA 腳本。Flux<List<Long>> flux =this.redisTemplate.execute(this.script, keys, scriptArgs);return flux.onErrorResume(throwable -> Flux.just(Arrays.asList(1L, -1L))).reduce(new ArrayList<Long>(), (longs, l) -> {longs.addAll(l);return longs;}) .map(results -> {boolean allowed = results.get(0) == 1L;Long tokensLeft = results.get(1);Response response = new Response(allowed, getHeaders(routeConfig, tokensLeft));if (log.isDebugEnabled()) {log.debug("response: " + response);}return response;});}catch (Exception e) {log.error("Error determining if user allowed from redis", e);}return Mono.just(new Response(true, getHeaders(routeConfig, -1L)));
}

LUA 腳本

image

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282854.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282854.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282854.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我的手機 不支持箭頭函數

不支持&#xff0c;要換成function的形式 轉載于:https://www.cnblogs.com/web-fusheng/p/7295901.html

中標麒麟linux卸載qt,國產化 銀河麒麟編譯Qt程序的問題匯總 | 阿拉燈

Run in terminal莫名奇妙軟件無法在QtCreator中運行或者調試&#xff0c;main函數都無法進入&#xff0c;QtCreator中一運行就崩潰&#xff0c;并跳到匯編界面&#xff0c;這多半和代碼沒什么關系&#xff0c;我這里是將項目->運行中的“Run in terminal”去掉勾選&#xff…

css3-13 如何改變文本框的輪廓顏色

css3-13 如何改變文本框的輪廓顏色 一、總結 一句話總結&#xff1a;outline使用和border很像&#xff0c;幾乎一模一樣&#xff0c;多了一個offset屬性 1、輪廓outline如何使用&#xff1f; 使用和border很像&#xff0c;幾乎一模一樣&#xff0c;多了一個offset屬性 18 …

ios添加設備真機測試,以及Undefined symbols for architecture x86_64:''錯誤

問題今天坑了好久&#xff0c;然后找了各種資料 添加設備這個直接去開發者中心添加一個設備進去就好&#xff0c;具體流程百度&#xff0c;第二個問題是屬于路徑不對或者是靜態庫沒有添加成功&#xff0c;項目可以看到&#xff0c;到時路徑找不到&#xff0c;你把靜態庫拖到桌面…

linux NF NR實例,awk內建變量示例詳解之NR、FNR、NF

NR表示從awk開始執行后&#xff0c;按照記錄分隔符讀取的數據次數&#xff0c;默認的記錄分隔符為換行符&#xff0c;因此默認的就是讀取的數據行數&#xff0c;NR可以理解為Number of Record的縮寫。在awk處理多個輸入文件的時候&#xff0c;在處理完第一個文件后&#xff0c;…

迷宮探索

/* 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3 */#include<iostream>using namespace std;struct node {int x;//橫坐標int y;//縱坐標int f;//父親在隊列中的編號int s;//步數 };int main() {node que[2051];int a[51][51]{0};int book[51][51]{0};//定義一…

Kinect2.0獲取數據

最近事情真是多&#xff0c;今天抽空研究一下Kinec2.0的數據獲取&#xff01; 系統要求 https://developer.microsoft.com/en-us/windows/kinect/hardware-setup 系統環境 聯想Y430P&#xff0c;Windows10 首先安裝了Kinect for Windows SDK &#xff08;KinectSDK-v2.0_1409-S…

linux超級工具,linux運維超級工具--sysdig

sysdig 是一個超級系統工具,它可以用來捕獲系統狀態信息&#xff0c;在運維工作中sysdig能很方便的排查異常、定位故障&#xff0c;它還能保存數據進行分析&#xff0c;并且提供強大的命令接口。在了解sysdig強大之處之前,首先得安裝sysdig&#xff0c;我這里是環境是centos6.7…

《sql語句練習1》

Oracle系列《一》&#xff1a;簡單SQL與單行函數 使用scott/tiger用戶下的emp表和dept表完成下列練習&#xff0c;表的結構說明如下 emp員工表(empno員工號/ename員工姓名/job工作/mgr上級編號/hiredate受雇日期/sal薪金/comm傭金/deptno部門編號) dept部門表(deptno部門編號…

Asp.net mvc 知多少(一)

本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan&#xff0c;想看英文原版的可訪問http://www.dotnettricks.com/free-ebooks自行下載。該書主要分為兩部分&#xff0c;ASP.NET MVC 5、ASP.NET WEB API2。本書最大的特點是以面試問答…

stm32h7能跑linux,STM32H7榨干了Cortex-M7的最后一滴血

原標題&#xff1a;STM32H7榨干了Cortex-M7的最后一滴血有個非常重磅的消息ST給自己的STM32家族又新增了一條新的產品線—— H7H 代表的是High Pefrmance之意 (此為筆者臆測)7 則表示這是基于ARM Cortex-M7架構修改而來熟悉的工程師可能會問&#xff0c;不是已經有基于M7架構的…

通過PowerShell進行網絡分析

好久沒有寫文章&#xff0c;因為確實工作也比較忙。今天周末&#xff0c;稍微有些時間&#xff0c;在解決一個問題時&#xff0c;用到了一點抓取和處理網絡數據的小技巧&#xff0c;摘錄分享如下。問題描述我有一個需求&#xff0c;就是要研究某個網頁加載過程中具體發起了多少…

jvm監控調優常用命令

jvm監控調優常用命令 轉載于:https://www.cnblogs.com/likun10579/p/6403324.html

【BZOJ】1013 球形空間產生器

【解析】代數變形高斯消元 [分析] 依據題目以下的提示。設x[i][j]表示第i個點在第j維的坐標。r[j]為圓心在第j維的坐標 能夠知道&#xff1a; dis根號(∑(x[i][j]-r[j])^2)。 因為平方的非負性。所以能夠推出 dis^2∑(x[i][j]-r[j])^2。 依據平方和公式&#xff0c;(x[i][j]-r[…

c語言不規則窗口,C語言不規則數組和指針

不規則數組是每一行的列數不一樣的二維數組&#xff0c;其原理如下圖所示&#xff0c;圖中的數組有3行&#xff0c;每行有不同的列數。在了解如何創建不規則數組之前&#xff0c;讓我們先看一下用復合字面量創建的二維數組。復合字面量是一種C構造&#xff0c;前面看起來像類型…

php spl_autoload_register() 函數

spl_autoload_register()的用法&#xff1a; 其中$this表示當前類&#xff0c;autoload()是我注冊的自動加載函數&#xff0c;當然這個只是一個函數名&#xff0c;只要不與php的關鍵字重復&#xff0c;符合一般函數名的命名規范即可。 使用自動加載之后&#xff0c;當我們在一個…

C語言中遞歸什么時候能夠省略return引發的思考:通過內聯匯編解讀C語言函數return的本質...

C語言中遞歸什么時候能夠省略return引發的思考&#xff1a;通過內聯匯編解讀C語言函數return的本質 事情的經過是這種&#xff0c;博主在用C寫一個簡單的業務時使用遞歸&#xff0c;因為粗心而忘了寫return。結果發現返回的結果依舊是正確的。經過半小時的反匯編調試。證明了我…

C# 為什么說CM+Fody+HC是WPF開發的最強組合?

01—名詞解析CM&#xff1a;Caliburn.Micro(簡稱CM)一經推出便備受推崇&#xff0c;作為一款MVVM開發模式的經典框架&#xff0c;越來越多的受到wpf開發者的青睞.我們看一下官方的描述&#xff1a;Caliburn是一個為Xaml平臺設計的小型但功能強大的框架。Micro實現了各種UI模式&…

c語言邏輯運算符兩側運算對象,邏輯運算符兩側運算對象的數據類型是什么?...

邏輯運算符兩側運算對象的數據類型&#xff1a;可以是任何合法的類型數據&#xff1b;因為邏輯運算符兩邊的運算對象&#xff0c;最終都被轉換成bool值(邏輯值)操作。0、null轉換為false&#xff0c;而所有非零、非false、非null值轉換為true&#xff1b;然后進行運算。邏輯運算…

python-list:列表-元組-字符串

列表 “列表”是一個值&#xff0c;它包含多個字構成的序列。術語“列表值”指的是列表本身&#xff08;它作為一個值&#xff0c;可以保存在變量中、傳遞給函數&#xff09;--&#xff1a;按下標取值、切片、for循環、用于len()以及in not in等 list [aa,bb,cc,dd]是一個簡單的…