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

首頁 > 開發 > Java > 正文

基于Redis實現分布式應用限流的方法

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

限流的目的是通過對并發訪問/請求進行限速或者一個時間窗口內的的請求進行限速來保護系統,一旦達到限制速率則可以拒絕服務。

前幾天在DD的公眾號,看了一篇關于使用 瓜娃 實現單應用限流的方案 --》原文,參考《redis in action》 實現了一個jedis版本的,都屬于業務層次限制。 實際場景中常用的限流策略:

Nginx接入層限流

按照一定的規則如帳號、IP、系統調用邏輯等在Nginx層面做限流

業務應用系統限流

通過業務代碼控制流量這個流量可以被稱為信號量,可以理解成是一種鎖,它可以限制一項資源最多能同時被多少進程訪問。

代碼實現

import redis.clients.jedis.Jedis;import redis.clients.jedis.Transaction;import redis.clients.jedis.ZParams;import java.util.List;import java.util.UUID;/** * @email wangiegie@gmail.com * @data 2017-08 */public class RedisRateLimiter {  private static final String BUCKET = "BUCKET";  private static final String BUCKET_COUNT = "BUCKET_COUNT";  private static final String BUCKET_MONITOR = "BUCKET_MONITOR";  static String acquireTokenFromBucket(      Jedis jedis, int limit, long timeout) {    String identifier = UUID.randomUUID().toString();    long now = System.currentTimeMillis();    Transaction transaction = jedis.multi();    //刪除信號量    transaction.zremrangeByScore(BUCKET_MONITOR.getBytes(), "-inf".getBytes(), String.valueOf(now - timeout).getBytes());    ZParams params = new ZParams();    params.weightsByDouble(1.0,0.0);    transaction.zinterstore(BUCKET, params, BUCKET, BUCKET_MONITOR);    //計數器自增    transaction.incr(BUCKET_COUNT);    List<Object> results = transaction.exec();    long counter = (Long) results.get(results.size() - 1);    transaction = jedis.multi();    transaction.zadd(BUCKET_MONITOR, now, identifier);    transaction.zadd(BUCKET, counter, identifier);    transaction.zrank(BUCKET, identifier);    results = transaction.exec();    //獲取排名,判斷請求是否取得了信號量    long rank = (Long) results.get(results.size() - 1);    if (rank < limit) {      return identifier;    } else {//沒有獲取到信號量,清理之前放入redis 中垃圾數據      transaction = jedis.multi();      transaction.zrem(BUCKET_MONITOR, identifier);      transaction.zrem(BUCKET, identifier);      transaction.exec();    }    return null;  }}

調用

測試接口調用

@GetMapping("/")public void index(HttpServletResponse response) throws IOException {  Jedis jedis = jedisPool.getResource();  String token = RedisRateLimiter.acquireTokenFromBucket(jedis, LIMIT, TIMEOUT);  if (token == null) {    response.sendError(500);  }else{    //TODO 你的業務邏輯  }  jedisPool.returnResource(jedis);}

優化

使用攔截器 + 注解優化代碼

攔截器

@Configurationstatic class WebMvcConfigurer extends WebMvcConfigurerAdapter {  private Logger logger = LoggerFactory.getLogger(WebMvcConfigurer.class);  @Autowired  private JedisPool jedisPool;  public void addInterceptors(InterceptorRegistry registry) {    registry.addInterceptor(new HandlerInterceptorAdapter() {      public boolean preHandle(HttpServletRequest request, HttpServletResponse response,                   Object handler) throws Exception {        HandlerMethod handlerMethod = (HandlerMethod) handler;        Method method = handlerMethod.getMethod();        RateLimiter rateLimiter = method.getAnnotation(RateLimiter.class);        if (rateLimiter != null){          int limit = rateLimiter.limit();          int timeout = rateLimiter.timeout();          Jedis jedis = jedisPool.getResource();          String token = RedisRateLimiter.acquireTokenFromBucket(jedis, limit, timeout);          if (token == null) {            response.sendError(500);            return false;          }          logger.debug("token -> {}",token);          jedis.close();        }        return true;      }    }).addPathPatterns("/*");  }}

定義注解

/** * @email wangiegie@gmail.com * @data 2017-08 * 限流注解 */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface RateLimiter {  int limit() default 5;  int timeout() default 1000;}

使用

@RateLimiter(limit = 2, timeout = 5000)@GetMapping("/test")public void test() {}

并發測試

工具:apache-jmeter-3.2

說明: 沒有獲取到信號量的接口返回500,status是紅色,獲取到信號量的接口返回200,status是綠色。

當限制請求信號量為2,并發5個線程:

Redis,分布式,限流,實現限流,redis實現分布式限流

當限制請求信號量為5,并發10個線程:

Redis,分布式,限流,實現限流,redis實現分布式限流

資料

基于reids + lua的實現

總結

  1. 對于信號量的操作,使用事務操作。
  2. 不要使用時間戳作為信號量的排序分數,因為在分布式環境中,各個節點的時間差的原因,會出現不公平信號量的現象。
  3. 可以使用把這塊代碼抽成@rateLimiter注解,然后再方法上使用就會很方便啦
  4. 不同接口的流控,可以參考源碼的里面RedisRateLimiterPlus,無非是每個接口生成一個監控參數
  5. 源碼:boding1-pig-cloud.rar

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


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色婷婷综合久久久久中文字幕1| 欧美—级a级欧美特级ar全黄| 精品夜色国产国偷在线| 久久久国产一区二区三区| 国产一级揄自揄精品视频| 久久亚洲国产精品成人av秋霞| 亚洲精品久久视频| 国产高清视频一区三区| 国产成人精品优优av| 欧美乱大交xxxxx| 日韩电影中文字幕在线| 亚洲精品自拍第一页| 国产精品美女久久久久久免费| 欧美性猛交xxxx黑人| 91地址最新发布| 在线丨暗呦小u女国产精品| 日韩美女av在线免费观看| 91色中文字幕| 国产美女精彩久久| 亚洲自拍偷拍福利| 日韩视频第一页| 26uuu另类亚洲欧美日本一| 国产精品海角社区在线观看| 欧美床上激情在线观看| 91精品中文在线| 51精品国产黑色丝袜高跟鞋| 26uuu亚洲国产精品| 亚洲最大成人免费视频| 日韩视频免费看| 日韩精品在线免费观看视频| 国产精品第二页| 欧美麻豆久久久久久中文| 欧美黑人性生活视频| 久久久久国产视频| 日韩在线国产精品| 亚洲欧洲一区二区三区久久| 国产91对白在线播放| 欧美在线免费看| 日韩欧美亚洲一二三区| 国产精品一区二区久久精品| 色噜噜久久综合伊人一本| 国产精品国产三级国产aⅴ9色| 欧美日韩国产专区| 欧美电影免费观看电视剧大全| 亚洲黄色有码视频| 国产在线视频2019最新视频| 美日韩在线视频| 国产一区二中文字幕在线看| 精品国产成人av| 96pao国产成视频永久免费| 成人免费xxxxx在线观看| 亚洲综合中文字幕在线观看| 岛国视频午夜一区免费在线观看| 国产精品专区h在线观看| 成人97在线观看视频| 国产精品自拍偷拍| 精品亚洲一区二区三区| 中文字幕亚洲无线码在线一区| 亚洲一区亚洲二区| 在线成人激情黄色| 国产成人一区二区| 日韩精品一区二区三区第95| 日韩69视频在线观看| 在线电影欧美日韩一区二区私密| 亚洲人成电影在线观看天堂色| 国产香蕉一区二区三区在线视频| 日韩精品在线电影| 欧美激情在线观看视频| 国产91精品久久久久久| 色婷婷久久一区二区| 久久91亚洲精品中文字幕| 成人激情春色网| 性色av一区二区三区红粉影视| 精品中文视频在线| 精品久久久久久中文字幕一区奶水| 亚洲精品成人网| 在线精品高清中文字幕| 日韩成人久久久| 国产精品人人做人人爽| 久久成人精品一区二区三区| 欧美在线观看视频| 日韩av网站大全| 中文字幕亚洲综合| 中文字幕在线成人| 日韩av中文字幕在线免费观看| 久久99精品国产99久久6尤物| 亚洲精品成人久久久| 欧美一级电影免费在线观看| 亚洲四色影视在线观看| 国产欧美精品在线播放| 欧美日韩成人网| 久久这里有精品| 精品久久久香蕉免费精品视频| 国产一区二区丝袜| 国产精品福利小视频| 亚洲欧美日韩精品久久奇米色影视| 热re99久久精品国产66热| 热re91久久精品国99热蜜臀| 亚洲美腿欧美激情另类| 日韩中文字幕在线播放| 国产精品羞羞答答| 国产91免费观看| 久久亚洲精品中文字幕冲田杏梨| 久久精品99国产精品酒店日本| 日韩高清有码在线| 这里只有精品视频在线| 日韩av在线精品| 精品国产美女在线| 伊人一区二区三区久久精品| 欧美性生交xxxxxdddd| 亚洲激情小视频| 国产精品第七影院| 亚洲欧美福利视频| 日韩av123| www.99久久热国产日韩欧美.com| 欧美精品videofree1080p| 九九综合九九综合| 欧美性生交大片免费| 欧美成人免费小视频| 国产精品久久久久久久久久久新郎| 欧美精品国产精品日韩精品| 中文字幕亚洲无线码在线一区| 久久亚洲国产精品| 国模私拍视频一区| 久久噜噜噜精品国产亚洲综合| 91产国在线观看动作片喷水| 另类专区欧美制服同性| 性欧美激情精品| 国产一区二区三区欧美| 欧美野外wwwxxx| 91国在线精品国内播放| 精品亚洲国产成av人片传媒| 欧美亚洲另类制服自拍| 亚洲白虎美女被爆操| 精品国偷自产在线视频| 欧美成人激情视频| 国内精品久久久| 日韩电影中文字幕av| 欧美一区二区视频97| 亚洲91精品在线观看| 国产欧美日韩中文字幕| 狠狠做深爱婷婷久久综合一区| 日本最新高清不卡中文字幕| 久热99视频在线观看| 黑人精品xxx一区一二区| 中文字幕日韩精品在线观看| 欧美日韩国产91| 成人精品久久一区二区三区| 午夜剧场成人观在线视频免费观看| 亚洲精品国精品久久99热一| 国产成+人+综合+亚洲欧洲| 亚洲男人av电影| 国产精品爽黄69天堂a| 免费不卡在线观看av| 久久久久久久久久久亚洲| 久久精品国产一区| 成人欧美一区二区三区黑人孕妇| 亚洲美女av黄| 欧美国产日韩在线| 国产精品久久久久久超碰| 国产精品日韩av| 高清欧美电影在线| 国产自摸综合网| 欧美性猛交xxxx免费看漫画|