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

漫衍式限流,你想知道的都在这里

发布时间:2019-04-25 04:35:15 所属栏目:教程 来源:儒雅程序员
导读:媒介 在一个高并发体系中对流量的把控长短常重要的,当庞大的流量直接哀求到我们的处事器上没多久就也许造成接口不行用,不处理赏罚的话乃至会造成整个应用不行用。 好比最近就有个这样的需求,我作为客户端要向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 应用。

结果如下:

实现道理

实现道理着实很简朴。既然要到达漫衍式全范围流的结果,那天然必要一个第三方组件来记录哀求的次数。

(编辑:湖南网)

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

热点阅读