SpringBoot根據不同IP限制接口的QPS

根據對方IP地址來限制接口的QPS(每秒查詢率),你可以結合Spring Boot應用、Guava的RateLimiter或者自定義的并發控制邏輯來實現。以下是一個基于Guava RateLimiter和Spring Boot的示例,展示如何根據IP地址來限制接口的QPS:

  1. 添加Guava依賴

首先,確保你的pom.xml文件中包含了Guava的依賴。

  1. 創建RateLimiter存儲

你可以使用ConcurrentHashMap來存儲每個IP地址對應的RateLimiter。

import com.google.common.util.concurrent.RateLimiter;
import java.util.concurrent.ConcurrentHashMap;public class IpRateLimiter {private final ConcurrentHashMap<String, RateLimiter> ipRateLimiterMap = new ConcurrentHashMap<>();private final double rate; // 例如:每秒允許的請求數public IpRateLimiter(double rate) {this.rate = rate;}public synchronized RateLimiter getRateLimiter(String ip) {return ipRateLimiterMap.computeIfAbsent(ip, k -> RateLimiter.create(rate));}
}
  1. 在Controller中使用RateLimiter

在Controller中,你可以從請求中獲取IP地址,并使用IpRateLimiter來獲取對應的RateLimiter,然后檢查是否允許請求通過。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;@RestController
public class MyController {@Autowiredprivate IpRateLimiter ipRateLimiter;@GetMapping("/limited-endpoint")public String limitedEndpoint(HttpServletRequest request) {String ipAddress = request.getRemoteAddr(); // 簡化的IP獲取方式,可能需要根據實際情況調整RateLimiter rateLimiter = ipRateLimiter.getRateLimiter(ipAddress);if (!rateLimiter.tryAcquire()) {// 如果無法獲取許可,則返回錯誤信息或執行其他邏輯return "Too Many Requests from IP: " + ipAddress + ", please try again later.";}// 如果可以獲取許可,則處理請求并返回結果return "Success";}
}

注意:上面的request.getRemoteAddr()方法可能只返回內網IP(如果請求經過反向代理),你可能需要配置X-Forwarded-For頭來獲取真實的客戶端IP。

  1. 配置X-Forwarded-For

如果你的應用部署在反向代理(如Nginx)后面,你需要確保反向代理正確地設置了X-Forwarded-For頭,并且你的Spring Boot應用能夠解析這個頭來獲取真實的客戶端IP。

  1. 清理RateLimiter

由于RateLimiter實例在ipRateLimiterMap中會一直存在,直到應用重啟,你可能需要實現一種機制來清理長時間沒有活動的RateLimiter實例,以避免內存泄漏。這可以通過定期掃描并移除長時間未使用的RateLimiter來實現。

  1. 其他考慮
  • 如果有大量不同的IP地址訪問你的接口,ipRateLimiterMap可能會變得非常大。你可能需要考慮如何限制其大小或實現一種緩存淘汰策略。
  • 在生產環境中,你可能還需要考慮如何優雅地處理被限流的請求,例如返回特定的HTTP狀態碼、記錄日志等。

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

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

相關文章

鏡頭下的光學

說實話&#xff0c;當我看到幾何光學的內容全是初中的解析幾何的時候&#xff0c;我就覺得講的方式太原始了&#xff0c;而且太過復雜也看不懂。所以我嘗試做了數學建模&#xff0c;發現建模之后模型可以解釋一些物理現象&#xff0c;也不會有矛盾的地方&#xff0c;那就算過得…

【Python系列】探索 Python 環境管理工具:conda 與 pip 的比較

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

簡過網:專科生可以考的編制崗位有哪些?這5個鐵飯碗要抓住了!

專科生可以考的編制崗位有哪些&#xff1f;以下這幾種可以考的&#xff0c;尤其是應屆畢業生&#xff0c;一定要抓住機會哦&#xff01; ? 一、三支一扶&#xff1a;專科生可報考&#xff0c;期滿可轉編。 三支一扶&#xff1a;支農、支醫生、支教、扶貧 工作時間一般為2年&…

深入探索Postman:前置與后置腳本的編寫與應用

Postman是一款廣受歡迎的API開發和測試工具&#xff0c;它提供了豐富的功能來簡化接口測試過程。在Postman中&#xff0c;前置腳本&#xff08;Pre-request Script&#xff09;和后置腳本&#xff08;Tests Script&#xff09;是兩個強大的功能&#xff0c;允許用戶在發送請求之…

秋招Java后端開發沖刺——非關系型數據庫篇(Redis)

一、非關系型數據庫 1. 主要針對的是鍵值、文檔以及圖形類型數據存儲。 2. 特點&#xff1a; 特點說明靈活的數據模型支持多種數據模型&#xff08;文檔、鍵值、列族、圖&#xff09;&#xff0c;無需預定義固定的表結構&#xff0c;能夠處理各種類型的數據。高擴展性設計為水…

安全技術和防火墻(一)

安全技術和防火墻 安全技術 入侵檢測系統&#xff1a;特點是不阻斷網絡訪問&#xff0c;主要提供報警和事后監督 不主動介入 (監控) 入侵防御系統&#xff1a;透明模式工作 &#xff0c;數據包,網絡監控,服務攻擊,木馬,蠕蟲,系統漏洞 等 進行準確的分析判斷 判斷為攻擊行為后會…

高校心理咨詢管理系統

摘 要 隨著高校學生心理問題的增多&#xff0c;心理咨詢服務在高校中的重要性日益凸顯。然而&#xff0c;傳統的心理咨詢管理方式存在著諸多問題&#xff0c;如信息不透明、咨詢師資源不足等。為了解決這些問題&#xff0c;本文設計并實現了一種基于Java Web的高校心理咨詢管理…

model_json_schema

model_json_schema示列 from pydantic import BaseModel, Field, ValidationError, field_validatorclass User(BaseModel):id: int Field(default0, lt100, gt0)username: stremail: strfield_validator(username)def name_must_alpha(cls, v):assert v.isalpha(), name mus…

浸式冷卻設計參數

每天一篇行業發展資訊&#xff0c;讓大家更及時了解外面的世界。 更多資訊&#xff0c;請關注B站/公眾號【萊歌數字】&#xff0c;有視頻教程~~ 兩相被動浸入冷卻是指使用改變相的沸騰液體來去除一個或多個表面的熱量的冷卻系統。 然后蒸汽被移動到冷凝器&#xff0c;然后被…

LaTeX中添加矩陣分塊虛線并設置虛線疏密

對于大型矩陣&#xff0c;有時需要添加分塊虛線。 方法為使用arydshln宏包&#xff0c;然后在array環境中設置虛線。需要注意的是&#xff0c;使用矩陣環境需要搭配amsmath宏包使用&#xff0c;且需放在amsmath宏包之后。即導言區設置為 \usepackage{amsmath} \usepackage{ary…

日語培訓日語等級考試柯橋小語種學習語言學校

什么是外來語 外來語是指在日本的國語中使用的來源于外國語言的詞匯。但狹義上的外來語則是指來源于歐美國家語言的詞匯&#xff0c;其中大部分是來源于英美語系的詞匯。日語中的漢語詞匯很多&#xff0c;大多是自古以來從中國引進的&#xff0c;從外來語的定義看&#xff0c;漢…

NLP邏輯層次模型|跳出局限,站在更高維度認識自己

什么是NLP邏輯層次模型 N-Neuro&#xff1a;指神經系統&#xff0c;包括生理基礎&#xff08;大腦&#xff09;和思維運作過程 L-Linguistic&#xff1a;指語言&#xff0c;感覺信號輸出——構成意思的過程 P-Programming&#xff1a;指程序&#xff0c;大腦產生某結論后要具體…

【干貨】Vue3 組件通信方式詳解

前言 毫無疑問&#xff0c;組件通信是Vue中非常重要的技術之一&#xff0c;它的出現能夠使我們非常方便的在不同組件之間進行數據的傳遞&#xff0c;以達到數據交互的效果。所以&#xff0c;學習組件通信技術是非常有必要的&#xff0c;本文將總結Vue中關于組件通信的八種方式…

代碼隨想錄算法訓練營DAY49|300.最長遞增子序列、 674. 最長連續遞增序列、718. 最長重復子數組

300.最長遞增子序列 題目鏈接&#xff1a;300.最長遞增子序列dp初始化為1&#xff08;最小子序列長度為1&#xff09; class Solution(object):def lengthOfLIS(self, nums):""":type nums: List[int]:rtype: int"""dp [1]*len(nums)result …

leetcode-18- [669]修剪二叉搜索樹[108]將有序數組轉換為二叉搜索樹[538]把二叉搜索樹轉換為累加樹

重點&#xff1a;一般二叉樹多考慮遍歷順序&#xff0c; 二叉搜索樹多考慮特性&#xff0c;不用考慮遍歷順序。 一、[108]將有序數組轉換為二叉搜索樹 左閉右開 偶數取左邊 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return traversal(nums,0, nums…

ArcGIS定義1.5度帶坐標系與投影轉換

? 點擊下方全系列課程學習 點擊學習—>ArcGIS全系列實戰視頻教程——9個單一課程組合系列直播回放 點擊學習——>遙感影像綜合處理4大遙感軟件ArcGISENVIErdaseCognition 對于ArcGIS如何定義高斯克呂格3度帶、6度帶&#xff0c;我相信大部分人都是比較清楚的&#xff0…

OAuth 2.0資源授權機制與安全風險分析

文章目錄 前言OAuth2.01.1 OAuth應用1.2 OAuth基礎1.3 授權碼模式1.4 其它類模式1.5 openid連接 安全風險2.1 隱式授權劫持2.2 CSRF攻擊風險2.3 Url重定向漏洞2.4 scope校驗缺陷 總結 前言 OAuth 全稱為Open Authorization&#xff08;開放授權&#xff09;&#xff0c;OAuth …

為什么不推薦使用 UUID 作為主鍵

UUID 作為主鍵的討論背景 面試官提出問題時&#xff0c;應提供具體場景&#xff0c;例如 UUID 是由日志服務器還是客戶端生成。 UUID 的優點 獨立生成&#xff1a;可以在任何地方生成&#xff0c;無需與數據庫服務器往返。簡化邏輯&#xff1a;預先生成父表主鍵值&#xff0…

使用API有效率地管理Dynadot域名,為文件夾中的域名進行域名停放

關于Dynadot Dynadot是通過ICANN認證的域名注冊商&#xff0c;自2002年成立以來&#xff0c;服務于全球108個國家和地區的客戶&#xff0c;為數以萬計的客戶提供簡潔&#xff0c;優惠&#xff0c;安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引&#xff08;包括域名郵…

“RLC串聯正弦穩態電路的仿真研究”課程設計,高分資源,匠心制作,下載可用。強烈推薦!!!

1.設計目的 用 Multisim 電路仿真軟件&#xff0c;對一個 RLC 串聯電路進行正弦穩態電路分析。 2任務分析 2.1任務要求1 在 Multisim 中搭建一個 RLC 串聯電路&#xff0c;其中 R、 L、 C、正弦激勵源的振幅Vp和頻率 f 等所有參數均可自己任意設置&#xff08;不建議都采用…