前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dubbo源码解析——限流

Dubbo源码解析——限流

作者头像
用户5325874
发布2020-01-16 17:46:46
8250
发布2020-01-16 17:46:46
举报

Dubbo限流

Dubbo的限流作用于提供方。可以在高并发的情况,保证系统的稳定性、安全性。避免让系统被流量压垮,导致整体服务不可用。

实践

提供者添加类似配置

代码语言:javascript
复制
<dubbo:service
  interface="com.huang.yuan.api.service.DemoService"
  ref="demoServiceImpl"
  version="1.0"
  delay="5000"
  filter="tps">
  <dubbo:parameter key="tps" value="1"/>
  <dubbo:parameter key="tps.interval" value="1000"/>  
</dubbo:service>

添加filter及dubbo paramter,表示每tps.interval的时间间隔内,能执行tps个请求。

消费方同时发出10个请求

代码语言:javascript
复制
@Test
public void testdada() throws Exception {
  for (int i = 0; i < 10; i++) {
    new Thread(()->{
      demoService.test("huangyuan");
    }).start();
  }

  Thread.sleep(1100000);
}

提供方限制流量,多余的请求将抛出异常:

image-20191214131831430
image-20191214131831430

源码

令牌桶算法

Dubbo默认使用令牌桶算法实现限流。某段时间内,桶里面只能放进n个令牌,然后来一个请求就减少一个令牌,如果桶里面的令牌没有了,则不能继续执行请求。

限流通过com.alibaba.dubbo.rpc.filter.TpsLimitFilter实现。

首先从URL中获取配置的限制,限制由两个参数组成,表示在interval毫秒的时间内允许执行rate个调用。

默认周期是60秒,不限制速率。

代码语言:javascript
复制
public boolean isAllowable() {

  // 获取现在的时间
  long now = System.currentTimeMillis();

  // 当经过了interval时间间隔
  if (now > lastResetTime + interval) {

    // 重新设置token令牌的个数
    token.set(rate);

    // 从现在开始,经过interval的时间
    lastResetTime = now;
  }

  // 获取令牌的值
  int value = token.get();

  boolean flag = false;

  // 使用CAS实现乐观锁
  while (value > 0 && !flag) {

    // 能够执行请求,则令牌减一
    flag = token.compareAndSet(value, value - 1);

    value = token.get();
  }

  return flag;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Dubbo限流
    • 实践
      • 源码
        • 令牌桶算法
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档