基于JAVA的Dubbo 實現的各種限流算法

在基于 Java 的 Dubbo 實現中,限流(Rate Limiting)同樣是一個關鍵的需求。Dubbo 是阿里巴巴開源的一款高性能 Java RPC 框架,廣泛應用于分布式服務架構中。實現限流可以幫助服務在高并發場景下保持穩定性和可靠性。以下是幾種常見的限流算法及其在 Dubbo 中的實現方法:

?

1. 固定窗口算法 (Fixed Window Algorithm)

固定窗口算法將時間劃分為固定長度的窗口,并在每個窗口內限制請求數。

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;public class FixedWindowRateLimiter {private final ConcurrentHashMap<Long, AtomicInteger> windows = new ConcurrentHashMap<>();private final int limit;private final long windowSizeInMillis;public FixedWindowRateLimiter(int limit, long windowSizeInMillis) {this.limit = limit;this.windowSizeInMillis = windowSizeInMillis;}public boolean allowRequest() {long currentWindow = System.currentTimeMillis() / windowSizeInMillis;windows.putIfAbsent(currentWindow, new AtomicInteger(0));return windows.get(currentWindow).incrementAndGet() <= limit;}
}

2. 滑動窗口算法 (Sliding Window Algorithm)

滑動窗口算法將固定窗口進一步劃分為更小的時間片,從而更精確地控制流量。
?

import java.util.LinkedList;
import java.util.Queue;public class SlidingWindowRateLimiter {private final Queue<Long> requestTimestamps = new LinkedList<>();private final int limit;private final long windowSizeInMillis;public SlidingWindowRateLimiter(int limit, long windowSizeInMillis) {this.limit = limit;this.windowSizeInMillis = windowSizeInMillis;}public synchronized boolean allowRequest() {long now = System.currentTimeMillis();while (!requestTimestamps.isEmpty() && requestTimestamps.peek() <= now - windowSizeInMillis) {requestTimestamps.poll();}if (requestTimestamps.size() < limit) {requestTimestamps.add(now);return true;}return false;}
}

3. 令牌桶算法 (Token Bucket Algorithm)

令牌桶算法允許突發流量,并在平穩流量時重新填充令牌。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;public class TokenBucketRateLimiter {private final int maxTokens;private final int refillRate;private final AtomicInteger tokens;private final ScheduledExecutorService scheduler;public TokenBucketRateLimiter(int maxTokens, int refillRate) {this.maxTokens = maxTokens;this.refillRate = refillRate;this.tokens = new AtomicInteger(maxTokens);this.scheduler = Executors.newScheduledThreadPool(1);scheduler.scheduleAtFixedRate(this::refill, 1, 1, TimeUnit.SECONDS);}public boolean allowRequest() {if (tokens.get() > 0) {tokens.decrementAndGet();return true;}return false;}private void refill() {if (tokens.get() < maxTokens) {tokens.incrementAndGet();}}
}

4. 漏桶算法 (Leaky Bucket Algorithm)

漏桶算法以恒定速率處理請求,適用于平滑流量,防止流量突發。

import java.util.concurrent.atomic.AtomicInteger;public class LeakyBucketRateLimiter {private final int capacity;private final long leakRateInMillis;private final AtomicInteger waterLevel;private long lastLeakTime;public LeakyBucketRateLimiter(int capacity, long leakRateInMillis) {this.capacity = capacity;this.leakRateInMillis = leakRateInMillis;this.waterLevel = new AtomicInteger(0);this.lastLeakTime = System.currentTimeMillis();}public synchronized boolean allowRequest() {leak();if (waterLevel.get() < capacity) {waterLevel.incrementAndGet();return true;}return false;}private void leak() {long now = System.currentTimeMillis();long elapsedTime = now - lastLeakTime;int leaked = (int) (elapsedTime / leakRateInMillis);if (leaked > 0) {waterLevel.addAndGet(-leaked);if (waterLevel.get() < 0) {waterLevel.set(0);}lastLeakTime = now;}}
}

在 Dubbo 中集成限流器

要在 Dubbo 中集成限流器,可以通過實現自定義的過濾器。以下是一個簡單的示例,展示如何將限流器集成到 Dubbo 過濾器中:

自定義過濾器
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;@Activate(group = {"provider"})
public class RateLimitingFilter implements Filter {private final FixedWindowRateLimiter rateLimiter = new FixedWindowRateLimiter(100, 1000);@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {if (rateLimiter.allowRequest()) {return invoker.invoke(invocation);} else {throw new RpcException(RpcException.LIMIT_EXCEEDED, "Rate limit exceeded");}}
}
配置 Dubbo 使用自定義過濾器

在 Dubbo 的配置文件中添加自定義過濾器:

<dubbo:provider filter="rateLimitingFilter" />

或者在 Spring 配置文件中添加:

<dubbo:provider><dubbo:parameter key="filter" value="rateLimitingFilter" />
</dubbo:provider>

通過以上方式,可以在 Dubbo 中實現各種限流算法,從而有效控制請求流量,保護服務穩定性。根據具體的業務需求,選擇合適的限流算法,確保系統的性能和可靠性。

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

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

相關文章

Linux進程調度與切換、環境變量

文章目錄 Linux優先級Linux的調度與切換**進程切換**&#xff1a;**進程調度**&#xff1a;優先級活動隊列過期隊列active指針和expired指針 環境變量main函數參數 int main(int argc, char *argv[], char *envp[]) 環境變量環境變量和本地變量echo查看單個環境變量的方法expor…

藍牙模塊在無人機 ID識別、標準制定發揮的作用及其應用優勢和面臨的挑戰

隨著科技的飛速發展&#xff0c;無人機已經廣泛應用于航拍、農業、救援、物流等多個領域。而在無人機的通信與控制系統中&#xff0c;藍牙模塊扮演著重要的角色。本文將探討藍牙模塊在無人機Remote ID識別和標準制定執行中發揮的作用&#xff0c;并分析其應用優勢和面臨的挑戰。…

裝飾器模式在JS中的應用

裝飾器模式在JavaScript中的應用主要是通過修飾函數或類來添加額外的功能或行為。 在ES6中&#xff0c;裝飾器模式可以通過使用語法糖來實現。我們可以將裝飾器應用于函數、類、方法或屬性等。下面是一些在JavaScript中使用裝飾器模式的示例&#xff1a; 修飾函數&#xff1a…

2.Spring中用到的設計模式

Spring框架中使用了多種設計模式來構建其強大且靈活的功能&#xff0c;這里舉例說明Spring中的一些功能使用到的設計模式。 工廠模式&#xff1a;Spring容器本質是一個大工廠&#xff0c;使用工廠模式通過BeanFactory和ApplicationContext這兩個核心接口來創建和管理bean對象。…

Java讀取串口及端口調試

本篇主要講述使用Java對串口進行讀取和發送操作 準備 在項目中導入第三方Jar包 Jar包已經在資源中綁定&#xff0c;或者去官網上自行下載jSerialComm 注意當前jar包是配合JDK1.8環境使用&#xff0c;如果是1.8以下程序將直接中斷 安裝虛擬串口的軟件 Configure Virtual Seri…

一款功能強大的安卓虛擬機應用——VMOS Pro使用分享

前段時間我剛剛分享一個WeChat平板模塊能夠允許用戶自由修改系統設置&#xff0c;讓你的Android備用手機煥發新生&#xff0c;實現手機PAD化&#xff0c;實現兩臺設備同時登錄微信號。今天我分享的這個相比WeChat更為簡單&#xff0c;因為它可以通過虛擬機的方式進行多種androi…

分類和品牌關聯

文章目錄 1.數據庫表設計1.多表關聯設計2.創建表 2.使用renren-generator生成CRUD1.基本配置檢查1.generator.properties2.application.yml 2.生成代碼1.進入localhost:81生成代碼2.將main目錄覆蓋sunliving-commodity模塊的main目錄 3.代碼檢查1.注釋掉CategoryBrandRelationC…

Tencent : TBDS簡介

Tencent TBDS&#xff08;Tencent Big Data Suite&#xff09;是騰訊公司推出的大數據處理套件&#xff0c;它基于騰訊多年海量數據處理經驗&#xff0c;依托云原生技術和泛Hadoop生態開源技術&#xff0c;為用戶提供可靠、安全、易用的大數據處理平臺。 TBDS可以在公有云、私…

JavaWeb基礎(HTML,CSS,JS)

這些知識用了三四天左右學完&#xff0c;因為是JavaWeb&#xff0c;并不是前端&#xff0c;所以只是夠用&#xff0c;不是深入&#xff0c;但是這確實是學校一個學期交的東西&#xff08;JavaWeb課程&#xff09;。 總結一下網頁分為三部分&#xff1a;HTML(內容結構),CSS&…

MySql--SQL語言

目錄 SQl---DDL 結構定義 創建、刪除 數據庫 代碼 運行 設計表 數據類型 整數 浮點數 主鍵 約束 主鍵自增長 默認值 字段注釋 創建、刪除 表 代碼 運行 代碼 代碼 運行 SQL---DML 數據操縱 插入數據 代碼 運行 代碼 運行 代碼 運行 代碼 …

【實戰教程】使用Spring AOP和自定義注解監控接口調用

一、背景 隨著項目的長期運行和迭代&#xff0c;積累的功能日益繁多&#xff0c;但并非所有功能都能得到用戶的頻繁使用或實際上根本無人問津。 為了提高系統性能和代碼質量&#xff0c;我們往往需要對那些不常用的功能進行下線處理。 那么&#xff0c;該下線哪些功能呢&…

貪心算法: 單調遞增的數字

參考資料&#xff1a;代碼隨想錄 題目鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 倒序遍歷每個數字&#xff0c;遇到前一個比后一個大的就減一&#xff0c;最后統一把后面幾位置為9 String str n"";char[] chars str.toCharArray();int flag c…

docker部署kafka實戰

目錄 一、部署kafaka、zookeeper 二、測試信息發送與接收 三、kafka進階 一、部署kafaka、zookeeper 請提前安裝docker、docker-compose 安裝docker&#xff1a;docker--安裝docker-ce-CSDN博客 安裝docker-compose&#xff1a; 安裝docker-compose_安裝 docker-compose-CSD…

云下到云上,麗迅物流如何實現數據庫降本50% | OceanBase案例

在2024年3月20日的首場OceanBase數據庫城市行活動中&#xff0c;專注于物流及供應鏈解決方案的麗迅物流的架構師陽磊&#xff0c;圍繞“OB Cloud在麗迅物流的實踐”這一主題&#xff0c;進行了精彩的演講。本文為此次演講的內容回顧。 在麗迅物流&#xff08;Lesoon Logistics…

小demo - 列表hide or not (含代碼)

直接上代碼 <!DOCTYPE html> <html><head><style>.menu {width: 220px;height: 800px;border: 1px solid #dddddd;}.item {cursor: pointer;}.menu .header {padding: 10px 5px;background-color: goldenrod;}.menu .content a {display: block;paddi…

線程安全-1 synchronized鎖升級

一.說一下synchronized關鍵字的底層原理 1.synchronized又叫同步鎖&#xff0c;采用互斥的方式使同一時刻只能有一個線程持有鎖。 2.jdk1.6及以前&#xff0c;synchronized底層是用monitor實現的。monitor是jvm級別的對象&#xff0c;由c實現。每一個對象對應一個monitor&…

9.1 Go語言入門(環境篇)

Go語言入門&#xff08;環境篇&#xff09; 目錄一、什么是Go語言二、下載安裝配置Go語言開發環境1. 下載2. 安裝3. 配置環境變量4. 安裝環境驗證 三、 開發工具1. 下載2. 安裝3. 激活4. 配置SDK 四、 創建go工程文件并運行1. 創建go工程2. 示例代碼3. 運行代碼 目錄 一、什么…

軟件開源協議與QT的開源協議介紹

一.常見的六種開源協議 1.BSD協議 BSD協議全稱為“Berkely Software Distribution”&#xff0c;中文譯為“伯克利軟件發行版”。其最早用于伯克利UNIX操作系統上的開源貢獻。 主要特點&#xff1a; 允許修改源碼 允許源碼再發布 允許商業軟件發布和銷售 約束&#xff1…

shell 腳本筆記2

3.env與set區別 env用于查看系統環境變量 set用于查看系統環境變量自定義變量函數 4.常用環境變量 變量名稱含義PATH命令搜索的目錄路徑, 與windows的環境變量PATH功能一樣LANG查詢系統的字符集HISTFILE查詢當前用戶執行命令的歷史列表 Shell變量&#xff1a;自定義變量 目標…

HCIP【VRRP、MSTP、VLAN綜合實驗】

目錄 一、實驗拓撲圖&#xff1a; ?編輯二、實驗要求 三、實驗思路 四、實驗步驟 &#xff08;1&#xff09; eth-trunk技術配置 &#xff08;2&#xff09;vlan 技術配置 &#xff08;3&#xff09;配置SW1、SW2、AR1、ISP的IP地址 &#xff08;4&#xff09;在交換機…