最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實現(xiàn)單機限流

 更新時間:2022年08月12日 12:05:55   作者:陳虎_63  
這篇文章主要為大家詳細介紹了java實現(xiàn)單機限流,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

何時使用限流:

比如你希望自己的應用程序 QPS不要超過1000,那么RateLimiter設置1000的速率后,就會每秒往桶里 扔1000個令牌,RateLimiter經常用于限制對一些物理資源或者邏輯資源的訪 問速率。

簡介:

對于單機版的限流,可以使用Google 開源的 Guava項目,這個項目提供了Google在Java項目中使用一些核心庫,包含集合(Collections),緩存(Caching),并發(fā)編程庫(Concurrency),常用注解(Common annotations),String操作,I/O操作方面的眾多非常實用的函數(shù)。

這個項目也包含了限流的功能,其原理是根據(jù)令牌桶算法來實現(xiàn)。

提供了兩種限流策略:

● 平滑突發(fā)限流(SmoothBursty)
● 平滑預熱限流(SmoothWarmingUp)實現(xiàn)。

依賴:

<dependency>
? <groupId>com.google.guava</groupId>
? <artifactId>guava</artifactId>
? <version>29.0-jre</version>
</dependency>

方法描述:

模擬場景(示例):

場景一:

當我們希望某一個接口每秒的訪問量不超過10次

package org.xhs.test;

import org.apache.curator.shaded.com.google.common.util.concurrent.RateLimiter;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;


/**
?* @Author: hu.chen
?* @Description:
?**/
public class Test {

? ? /**
? ? ?* 存儲接口名和令牌生成器的對應關系
? ? ?*/
? ?private static Map<String, RateLimiter> interfaces = new ConcurrentHashMap<>();
? ?
? ? /**
? ? ?* 線程池
? ? ?*/
? ? private static ExecutorService threadPool = new ThreadPoolExecutor(10,15,3,TimeUnit.SECONDS,new ArrayBlockingQueue<>(100));

? ? public static void main(String[] args) throws InterruptedException {

? ? ? ? List<UserRequest> tasks = new ArrayList<UserRequest>();
? ? ? ? // 準備工作,先初始化 10個線程(用戶),這10個用戶同時訪問一個接口
? ? ? ? for (int i = 1; i <= 12; i++) {
? ? ? ? ? ? String ip = "127.0.0." + i;
? ? ? ? ? ? String userName="chenhu_"+i;
? ? ? ? ? ? String interfaceName="user/find_";
? ? ? ? ? ? tasks.add(new UserRequest(ip,userName,interfaceName));
? ? ? ? }


? ? ? ? // 先初始化好令牌生成器
? ? ? ? for (UserRequest request : tasks) {
? ? ? ? ? ? // 根據(jù)接口名限流
? ? ? ? ? ? RateLimiter rateLimiter = interfaces.get(request.getInterfaceName());

? ? ? ? ? ? if(rateLimiter==null){
? ? ? ? ? ? ? ? // 創(chuàng)建一個令牌生成器,每秒產生10個令牌
? ? ? ? ? ? ? ? synchronized (interfaces) {
? ? ? ? ? ? ? ? ? ? if(rateLimiter==null) {
? ? ? ? ? ? ? ? ? ? ? ? rateLimiter = RateLimiter.create(10);
? ? ? ? ? ? ? ? ? ? ? ? // 將這個令牌生成器和具體的接口進行綁定
? ? ? ? ? ? ? ? ? ? ? ? interfaces.put(request.getInterfaceName(),rateLimiter);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? // 休眠一秒,讓令牌生成器先生成令牌
? ? ? ? Thread.sleep(1000);

? ? ? ? for (UserRequest request : tasks) {
? ? ? ? ? ? // 根據(jù)接口名限流
? ? ? ? ? ? RateLimiter rateLimiter = interfaces.get(request.getInterfaceName());


? ? ? ? ? ? // 獲取令牌桶中一個令牌,如果獲取不到,則等待 timeout 時間,如果還獲取不到,則返回false,反之則返回true
? ? ? ? ? ? // timeout設置為0,表示不等待
? ? ? ? ? ? if(rateLimiter.tryAcquire(1,0,TimeUnit.SECONDS)){

? ? ? ? ? ? ? ? // 得到令牌,處理請求
? ? ? ? ? ? ? ? threadPool.execute(()->{
? ? ? ? ? ? ? ? ? ? System.err.println("接口:"+request.getInterfaceName()+" 訪問還未達到上限,"+request.getUserName()+"可以訪問");
? ? ? ? ? ? ? ? });
? ? ? ? ? ? }else {
? ? ? ? ? ? ? ? // 已經等待了10秒還獲取不到令牌,進行其他業(yè)務處理
? ? ? ? ? ? ? ? System.err.println("當前時間訪問失敗,"+request.getUserName()+"無法獲取令牌");
? ? ? ? ? ? }
? ? ? ? }
? ? }

? ? private static class UserRequest {
? ? ? ? /**
? ? ? ? ?* 請求用戶ip
? ? ? ? ?*/
? ? ? ? private String ip;

? ? ? ? /**
? ? ? ? ?* 用戶名
? ? ? ? ?*/
? ? ? ? private String userName;

? ? ? ? /**
? ? ? ? ?* 請求的接口名
? ? ? ? ?*/
? ? ? ? private String interfaceName;
? ? ? ? public UserRequest(String ip, String userName, String interfaceName) {
? ? ? ? ? ? this.ip = ip;
? ? ? ? ? ? this.userName = userName;
? ? ? ? ? ? this.interfaceName = interfaceName;
? ? ? ? }
? ? ? ? public String getIp() {return ip;}

? ? ? ? public String getUserName() { return userName;}
? ? ? ? public String getInterfaceName() {return interfaceName;}
? ? }
}

場景二:

當我們希望某一個用戶或者ip,每秒的訪問量不超過10

package org.xhs.test;

import org.apache.curator.shaded.com.google.common.util.concurrent.RateLimiter;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;


/**
?* @Author: hu.chen
?* @Description:
?**/
public class Test {

? ? /**
? ? ?* 存儲用戶名和令牌生成器的對應關系
? ? ?*/
? ?private static Map<String, RateLimiter> interfaces = new ConcurrentHashMap<>();

? ? /**
? ? ?* 線程池
? ? ?*/
? ? private static ExecutorService threadPool = new ThreadPoolExecutor(10,15,3,TimeUnit.SECONDS,new ArrayBlockingQueue<>(100));

? ? public static void main(String[] args) throws InterruptedException {

? ? ? ? List<UserRequest> tasks = new ArrayList<UserRequest>();
? ? ? ? // 準備工作,先初始化 10個線程(用戶),這10個用戶同時訪問一個接口
? ? ? ? for (int i = 1; i <= 12; i++) {
? ? ? ? ? ? String ip = "127.0.0." + i;
? ? ? ? ? ? String userName="chenhu_";
? ? ? ? ? ? String interfaceName="user/find_"+i;
? ? ? ? ? ? tasks.add(new UserRequest(ip,userName,interfaceName));
? ? ? ? }


? ? ? ? // 先初始化好令牌生成器
? ? ? ? for (UserRequest request : tasks) {
? ? ? ? ? ? // 根據(jù)接口名限流
? ? ? ? ? ? RateLimiter rateLimiter = interfaces.get(request.getUserName());

? ? ? ? ? ? if(rateLimiter==null){
? ? ? ? ? ? ? ? // 創(chuàng)建一個令牌生成器,每秒產生5個令牌
? ? ? ? ? ? ? ? synchronized (interfaces) {
? ? ? ? ? ? ? ? ? ? if(rateLimiter==null) {
? ? ? ? ? ? ? ? ? ? ? ? rateLimiter = RateLimiter.create(10);
? ? ? ? ? ? ? ? ? ? ? ? // 將這個令牌生成器和具體的接口進行綁定
? ? ? ? ? ? ? ? ? ? ? ? interfaces.put(request.getUserName(),rateLimiter);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? // 休眠一秒,讓令牌生成器先生成令牌
? ? ? ? Thread.sleep(1000);

? ? ? ? for (UserRequest request : tasks) {
? ? ? ? ? ? // 根據(jù)接口名限流
? ? ? ? ? ? RateLimiter rateLimiter = interfaces.get(request.getUserName());


? ? ? ? ? ? // 獲取令牌桶中一個令牌,如果獲取不到,則等待 timeout 時間,如果還獲取不到,則返回false,反之則返回true
? ? ? ? ? ? // timeout設置為0,表示不等待
? ? ? ? ? ? if(rateLimiter.tryAcquire(1,0,TimeUnit.SECONDS)){

? ? ? ? ? ? ? ? // 得到令牌,處理請求
? ? ? ? ? ? ? ? threadPool.execute(()->{
? ? ? ? ? ? ? ? ? ? System.err.println("用戶:"+request.getUserName()+" 當前時間訪問次數(shù)還未達到上限,可以訪問");
? ? ? ? ? ? ? ? });
? ? ? ? ? ? }else {
? ? ? ? ? ? ? ? // 已經等待了10秒還獲取不到令牌,進行其他業(yè)務處理
? ? ? ? ? ? ? ? System.err.println("當前時間訪問失敗,"+request.getUserName()+"無法獲取令牌");
? ? ? ? ? ? }
? ? ? ? }
? ? }

? ? private static class UserRequest {
? ? ? ? /**
? ? ? ? ?* 請求用戶ip
? ? ? ? ?*/
? ? ? ? private String ip;

? ? ? ? /**
? ? ? ? ?* 用戶名
? ? ? ? ?*/
? ? ? ? private String userName;

? ? ? ? /**
? ? ? ? ?* 請求的接口名
? ? ? ? ?*/
? ? ? ? private String interfaceName;
? ? ? ? public UserRequest(String ip, String userName, String interfaceName) {
? ? ? ? ? ? this.ip = ip;
? ? ? ? ? ? this.userName = userName;
? ? ? ? ? ? this.interfaceName = interfaceName;
? ? ? ? }
? ? ? ? public String getIp() {return ip;}

? ? ? ? public String getUserName() { return userName;}
? ? ? ? public String getInterfaceName() {return interfaceName;}
? ? }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • JavaWeb中web.xml初始化加載順序詳解

    JavaWeb中web.xml初始化加載順序詳解

    本篇文章主要介紹了JavaWeb中web.xml初始化加載順序詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Spring Cloud原理詳解

    Spring Cloud原理詳解

    今天小編就為大家分享一篇關于Spring Cloud原理詳解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • java.security.egd?作用詳解

    java.security.egd?作用詳解

    這篇文章主要為大家介紹了java.security.egd作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • java分割文本字符串的方法

    java分割文本字符串的方法

    這篇文章主要為大家詳細介紹了java分割文本字符串的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java處理不可見特殊字符要點解析

    Java處理不可見特殊字符要點解析

    這篇文章主要介紹了Java處理不可見特殊字符要點解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • java使用CompletableFuture分批處理任務實現(xiàn)

    java使用CompletableFuture分批處理任務實現(xiàn)

    本文主要介紹了java使用CompletableFuture分批處理任務實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • 詳解Java對象的強、軟、弱和虛引用+ReferenceQueue

    詳解Java對象的強、軟、弱和虛引用+ReferenceQueue

    這篇文章主要介紹了詳解Java對象的強、軟、弱和虛引用+ReferenceQueue的相關資料,需要的朋友可以參考下
    2017-06-06
  • Java實現(xiàn)從字符串中找出數(shù)字字符串的方法小結

    Java實現(xiàn)從字符串中找出數(shù)字字符串的方法小結

    這篇文章主要介紹了Java實現(xiàn)從字符串中找出數(shù)字字符串的方法,結合實例形式總結分析了Java查找數(shù)字字符串的常用技巧,需要的朋友可以參考下
    2016-03-03
  • Java equals()方法使用詳解及總結

    Java equals()方法使用詳解及總結

    這篇文章主要介紹了Java equals()方法使用詳解及總結的相關資料,需要的朋友可以參考下
    2017-03-03
  • Java技術匯總

    Java技術匯總

    本篇文章主要對Java基本知識點和技術點的一些看法和介紹,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03

最新評論

迁西县| 阿拉善盟| 乐清市| 靖宇县| 海原县| 灌南县| 葵青区| 赣州市| 永安市| 吉林省| 长沙县| 安陆市| 新营市| 平谷区| 阳高县| 乌拉特中旗| 哈密市| 江西省| 武川县| 大冶市| 库尔勒市| 桐梓县| 郴州市| 澄江县| 开平市| 察哈| 夹江县| 普兰店市| 弥勒县| 南岸区| 汝州市| 罗江县| 津南区| 黄龙县| 尼木县| 永寿县| 金湖县| 抚远县| 新巴尔虎右旗| 高台县| 安泽县|