加入收藏 | 设为首页 | 会员中心 | 我要投稿 孝感站长网 (https://www.0712zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

分布式限流,你想知道的都在这里

发布时间:2019-04-25 13:55:39 所属栏目:教程 来源:儒雅程序员
导读:前言 在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。 比如最近就有个这样的需求,我作为客户端要向kafka生产数据,而kafka的消费者则再源源不断的

为了方便使用,也提供了注解:

  1. @Override 
  2. @ControllerLimit 
  3. public BaseResponse<OrderNoResVO> getOrderNoLimit(@RequestBody OrderNoReqVO orderNoReq) { 
  4.  BaseResponse<OrderNoResVO> res = new BaseResponse(); 
  5.  // 业务逻辑 
  6.  return res ; 

该注解拦截了 http 请求,会再请求达到阈值时直接返回。

普通方法也可使用:

  1. @CommonLimit 
  2. public void doSomething(){} 

会在调用达到阈值时抛出异常。

为了模拟并发,在 User 应用中开启了 10 个线程调用 Order(限流次数为5) 接口(也可使用专业的并发测试工具 JMeter 等)。

  1. @Override 
  2. public BaseResponse<UserResVO> getUserByFeign(@RequestBody UserReqVO userReq) { 
  3.  //调用远程服务 
  4.  OrderNoReqVO vo = new OrderNoReqVO(); 
  5.  vo.setAppId(1L); 
  6.  vo.setReqNo(userReq.getReqNo()); 
  7.  for (int i = 0; i < 10; i++) { 
  8.  executorService.execute(new Worker(vo, orderServiceClient)); 
  9.  } 
  10.  UserRes userRes = new UserRes(); 
  11.  userRes.setUserId(123); 
  12.  userRes.setUserName("张三"); 
  13.  userRes.setReqNo(userReq.getReqNo()); 
  14.  userRes.setCode(StatusEnum.SUCCESS.getCode()); 
  15.  userRes.setMessage("成功"); 
  16.  return userRes; 
  17. private static class Worker implements Runnable { 
  18.  private OrderNoReqVO vo; 
  19.  private OrderServiceClient orderServiceClient; 
  20.  public Worker(OrderNoReqVO vo, OrderServiceClient orderServiceClient) { 
  21.  this.vo = vo; 
  22.  this.orderServiceClient = orderServiceClient; 
  23.  } 
  24.  @Override 
  25.  public void run() { 
  26.  BaseResponse<OrderNoResVO> orderNo = orderServiceClient.getOrderNoCommonLimit(vo); 
  27.  logger.info("远程返回:" + JSON.toJSONString(orderNo)); 
  28.  } 

为了验证分布式效果启动了两个 Order 应用。

效果如下:

实现原理

实现原理其实很简单。既然要达到分布式全局限流的效果,那自然需要一个第三方组件来记录请求的次数。

(编辑:孝感站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读