亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

RateLimit-使用guava來做接口限流代碼示例

2024-07-13 10:16:59
字體:
來源:轉載
供稿:網友

本文主要研究的是RateLimit-使用guava來做接口限流的相關內容,具體如下。

一、問題描述

  某天A君突然發現自己的接口請求量突然漲到之前的10倍,沒多久該接口幾乎不可使用,并引發連鎖反應導致整個系統崩潰。如何應對這種情況呢?生活給了我們答案:比如老式電閘都安裝了保險絲,一旦有人使用超大功率的設備,保險絲就會燒斷以保護各個電器不被強電流給燒壞。同理我們的接口也需要安裝上“保險絲”,以防止非預期的請求對系統壓力過大而引起的系統癱瘓,當流量過大時,可以采取拒絕或者引流等機制。

二、常用的限流算法

常用的限流算法有兩種:漏桶算法和令牌桶算法。

漏桶算法思路很簡單,請求先進入到漏桶里,漏桶以一定的速度出水,當水請求過大會直接溢出,可以看出漏桶算法能強行限制數據的傳輸速率。

java,guava,限流,google,ratelimit,guava中的ratelimiter

圖1 漏桶算法示意圖

對于很多應用場景來說,除了要求能夠限制數據的平均傳輸速率外,還要求允許某種程度的突發傳輸。這時候漏桶算法可能就不合適了,令牌桶算法更為適合。如圖2所示,令牌桶算法的原理是系統會以一個恒定的速度往桶里放入令牌,而如果請求需要被處理,則需要先從桶里獲取一個令牌,當桶里沒有令牌可取時,則拒絕服務。

java,guava,限流,google,ratelimit,guava中的ratelimiter

圖2 令牌桶算法示意圖

三、限流工具類RateLimiter

  google開源工具包guava提供了限流工具類RateLimiter,該類基于“令牌桶算法”,非常方便使用。該類的接口具體的使用請參考:RateLimiter使用實踐。

RateLimiter 使用Demo

package ratelimite;import com.google.common.util.concurrent.RateLimiter;public class RateLimiterDemo {	public static void main(String[] args) {		testNoRateLimiter();		testWithRateLimiter();	}	public static void testNoRateLimiter() {		long start = System.currentTimeMillis();		for (int i = 0; i < 10; i++) {			System.out.println("call execute.." + i);		}		long end = System.currentTimeMillis();		System.out.println(end - start);	}	public static void testWithRateLimiter() {		long start = System.currentTimeMillis();		RateLimiter limiter = RateLimiter.create(10.0);		// 每秒不超過10個任務被提交 		for (int i = 0; i < 10; i++) {			limiter.acquire();			// 請求RateLimiter, 超過permits會被阻塞 			System.out.println("call execute.." + i);		}		long end = System.currentTimeMillis();		System.out.println(end - start);	}}

四 Guava并發:ListenableFuture與RateLimiter示例

概念

ListenableFuture顧名思義就是可以監聽的Future,它是對java原生Future的擴展增強。我們知道Future表示一個異步計算任務,當任務完成時可以得到計算結果。如果我們希望一旦計算完成就拿到結果展示給用戶或者做另外的計算,就必須使用另一個線程不斷的查詢計算狀態。這樣做,代碼復雜,而且效率低下。使用ListenableFuture Guava幫我們檢測Future是否完成了,如果完成就自動調用回調函數,這樣可以減少并發程序的復雜度。

推薦使用第二種方法,因為第二種方法可以直接得到Future的返回值,或者處理錯誤情況。本質上第二種方法是通過調動第一種方法實現的,做了進一步的封裝。

另外ListenableFuture還有其他幾種內置實現:

SettableFuture:不需要實現一個方法來計算返回值,而只需要返回一個固定值來做為返回值,可以通過程序設置此Future的返回值或者異常信息

CheckedFuture: 這是一個繼承自ListenableFuture接口,他提供了checkedGet()方法,此方法在Future執行發生異常時,可以拋出指定類型的異常。

RateLimiter類似于JDK的信號量Semphore,他用來限制對資源并發訪問的線程數,本文介紹RateLimiter使用

代碼示例

import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import com.google.common.util.concurrent.FutureCallback;import com.google.common.util.concurrent.Futures;import com.google.common.util.concurrent.ListenableFuture;import com.google.common.util.concurrent.ListeningExecutorService;import com.google.common.util.concurrent.MoreExecutors;import com.google.common.util.concurrent.RateLimiter;public class ListenableFutureDemo {	public static void main(String[] args) {		testRateLimiter();		testListenableFuture();	}	/**   * RateLimiter類似于JDK的信號量Semphore,他用來限制對資源并發訪問的線程數   */	public static void testRateLimiter() {		ListeningExecutorService executorService = MoreExecutors		        .listeningDecorator(Executors.newCachedThreadPool());		RateLimiter limiter = RateLimiter.create(5.0);		// 每秒不超過4個任務被提交		for (int i = 0; i < 10; i++) {			limiter.acquire();			// 請求RateLimiter, 超過permits會被阻塞			final ListenableFuture<Integer> listenableFuture = executorService			          .submit(new Task("is "+ i));		}	}	public static void testListenableFuture() {		ListeningExecutorService executorService = MoreExecutors		        .listeningDecorator(Executors.newCachedThreadPool());		final ListenableFuture<Integer> listenableFuture = executorService		        .submit(new Task("testListenableFuture"));		//同步獲取調用結果		try {			System.out.println(listenableFuture.get());		}		catch (InterruptedException e1) {			e1.printStackTrace();		}		catch (ExecutionException e1) {			e1.printStackTrace();		}		//第一種方式		listenableFuture.addListener(new Runnable() {			@Override			      public void run() {				try {					System.out.println("get listenable future's result "					              + listenableFuture.get());				}				catch (InterruptedException e) {					e.printStackTrace();				}				catch (ExecutionException e) {					e.printStackTrace();				}			}		}		, executorService);		//第二種方式		Futures.addCallback(listenableFuture, new FutureCallback<Integer>() {			@Override			      public void onSuccess(Integer result) {				System.out				            .println("get listenable future's result with callback "				                + result);			}			@Override			      public void onFailure(Throwable t) {				t.printStackTrace();			}		}		);	}}class Task implements Callable<Integer> {	String str;	public Task(String str){		this.str = str;	}	@Override	  public Integer call() throws Exception {		System.out.println("call execute.." + str);		TimeUnit.SECONDS.sleep(1);		return 7;	}}

Guava版本

<dependency>      <groupId>com.google.guava</groupId>      <artifactId>guava</artifactId>      <version>14.0.1</version>    </dependency>

總結

以上就是本文關于RateLimit-使用guava來做接口限流代碼示例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲老头同性xxxxx| 国产v综合ⅴ日韩v欧美大片| 91夜夜未满十八勿入爽爽影院| 欧美最猛性xxxxx亚洲精品| 国产v综合v亚洲欧美久久| 午夜精品福利在线观看| 欧美激情一区二区三区在线视频观看| 亚洲深夜福利网站| 欧美高清视频在线| 国模gogo一区二区大胆私拍| 久久久91精品| 国产精品99久久99久久久二8| 欧美极品少妇xxxxx| 97在线免费观看视频| 亚洲国产精品久久91精品| 亚洲变态欧美另类捆绑| 亚洲第一在线视频| 欧美亚洲成人网| 亚洲精品日韩丝袜精品| 亚洲欧美综合区自拍另类| 国产91久久婷婷一区二区| 欧美视频免费在线观看| 精品国产一区二区三区久久| 久久视频在线观看免费| 亚洲一二在线观看| 萌白酱国产一区二区| 成人激情视频在线观看| 中文字幕久久久| 亚洲国产精品资源| 98午夜经典影视| 国产精品直播网红| 欧美性在线观看| 欧美激情一二区| 久热精品视频在线免费观看| 91sao在线观看国产| 国产成人精品av在线| 日韩网站免费观看| 日韩av有码在线| 亚洲精品动漫100p| 欧美亚洲国产视频小说| 自拍偷拍亚洲一区| 亚洲国产精品福利| 日韩av不卡电影| 欧美性猛交xxxx免费看漫画| 久久香蕉国产线看观看网| 国产日韩精品在线播放| 美女久久久久久久| 成人羞羞国产免费| 亚洲第一免费播放区| 午夜精品福利电影| 欧美一区二区.| 亚洲成人999| 国产精品一区av| 国产aⅴ夜夜欢一区二区三区| 在线国产精品播放| 成人羞羞国产免费| 97精品国产97久久久久久免费| 国产日韩精品综合网站| 91伊人影院在线播放| 亚洲少妇激情视频| 中文字幕亚洲综合| 色噜噜狠狠狠综合曰曰曰| 人体精品一二三区| 欧美精品激情在线| www.国产一区| 精品国产一区久久久| 亚洲免费伊人电影在线观看av| www.日韩av.com| 欧美一级电影在线| 欧美疯狂做受xxxx高潮| 日本三级韩国三级久久| 欧美极品美女电影一区| 亚洲精品国产综合久久| 国产精品免费视频xxxx| 国产精品最新在线观看| 久久视频中文字幕| 国产成人免费av| 国产一区二区三区在线播放免费观看| 国产大片精品免费永久看nba| 国产不卡一区二区在线播放| 正在播放亚洲1区| 91在线视频精品| 亚洲一区二区三区四区在线播放| 91av成人在线| 国产精品久久久久久久久久久不卡| 欧美亚洲另类制服自拍| 国产a∨精品一区二区三区不卡| 久久中文久久字幕| 亚洲午夜未满十八勿入免费观看全集| 高清亚洲成在人网站天堂| 91亚洲精品视频| 中文字幕久精品免费视频| 欧美一级黑人aaaaaaa做受| 韩剧1988免费观看全集| 中文字幕日韩av电影| 成人欧美一区二区三区黑人孕妇| 久久成人这里只有精品| 欧美精品日韩三级| 国产精品444| 亚洲欧美日韩一区二区三区在线| 欧美劲爆第一页| 国产精品成av人在线视午夜片| 国产精品色视频| 亚洲欧美国产一区二区三区| 九九九久久国产免费| 日韩精品在线观| 成人激情av在线| 国外日韩电影在线观看| 久久亚洲私人国产精品va| 欧美尤物巨大精品爽| 日韩av免费在线播放| 久久亚洲精品一区| 久久中文字幕一区| 麻豆成人在线看| 欧美丰满老妇厨房牲生活| 97福利一区二区| 日韩在线观看网站| 亚洲一区二区在线播放| 国产精品男女猛烈高潮激情| 欧美裸体xxxx极品少妇| 久久视频在线直播| 久久精品一本久久99精品| 韩国三级日本三级少妇99| 欧美夫妻性生活xx| 91免费看片网站| 国产成人av网| 欧美午夜www高清视频| 欧美成人性色生活仑片| 国产精品视频网址| 亚洲成人网av| 最近2019年手机中文字幕| 成人有码在线视频| 国产精品久久久久不卡| 精品久久久久久国产91| 国产女人精品视频| 欧美老女人www| 国产在线98福利播放视频| 亚洲成年网站在线观看| 亚洲精品一区二区三区不| 免费99精品国产自在在线| 色琪琪综合男人的天堂aⅴ视频| 亚洲人成网在线播放| 8x拔播拔播x8国产精品| 亚洲成av人片在线观看香蕉| 久久午夜a级毛片| 国产精品偷伦免费视频观看的| 欧洲成人午夜免费大片| 91欧美日韩一区| 久久久久久尹人网香蕉| 亚洲美女黄色片| 欧美性受xxx| 97精品国产97久久久久久春色| 亚洲网在线观看| 国产成人一区二区三区| 精品中文字幕在线| 国产精品三级美女白浆呻吟| 992tv成人免费视频| 精品亚洲国产视频| 91丝袜美腿美女视频网站| 精品高清一区二区三区| 国产精品大片wwwwww| 久久免费精品日本久久中文字幕| 日韩av在线网址| 国产剧情久久久久久|