文档章节

后端服务------之-----限流篇

吹比龙
 吹比龙
发布于 2017/08/30 16:11
字数 629
阅读 67
收藏 1

3 月,跳不动了?>>>

前言

        服务开发时,提供给第三方使用,防止恶意调用,和无节制调用,暴力调用,或者瞬间大批量请求会压垮我们的服务,踏上扯皮,甩锅之路。。。

        常见的限流模式有控制并发和控制速率,一个是限制并发的数量,一个是限制并发访问的速率,另外还可以限制单位时间窗口内的请求数量。

实现

控制并发数量

    利用线程池实现

    利用线程池控制并发访问数,超出的抛出拒绝服务异常

    1、线程池配置

/**
 * 
 * 配置线程池
 * 
 * 
 * 
 * @author lli
 * 
 *
 * 
 * @version 1.0
 * 
 *
 */
@Configuration
public class ExecutorConfig {

    /** 核心线程数 线程池维护线程的最少数量. */
    private int corePoolSize = 40;
    /** 线程池维护线程的最大数量. */
    private int maxPoolSize = 60;
    /** 线程池所使用的缓冲队列. */
    private int queueCapacity = 20;

    /**
     * 
     * @description 这里我想用作限流池
     * @author lli
     * @create 2017年8月29日上午10:32:02
     * @version 1.0
     * @return
     */
    @Bean
    public Executor pool() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setThreadNamePrefix("iflytek-pool-");
        executor.initialize();
        return executor;
    }
}

  2、service具体使用


/**
     * 限流池
     */
    @Resource
    ThreadPoolTaskExecutor pool;
@Async("pool")
    public void ansyHandle(ScanDataList scanDataList) throws Exception {
        // do something
        logger.info("限流池情况---当前活动现场数量:{},线程池最大的大小:{}",
                pool.getActiveCount(), pool.getMaxPoolSize());
    }

3、控制器调用

 @ApiOperation(value = "识别接口", notes = "识别接口")
    @RequestMapping(value = { "" }, method = RequestMethod.POST)
    public JsonResult ocr(@RequestBody ScanDataList scanDataList)
        throws Exception {

        service.ansyHandle(scanDataList);
        return new JsonResult();

    }

4、拒绝服务抛出

全局异常处理拦截(后面改成,独立的业务异常)

 /**
     * 
     * @description 系统异常 预期以外异常
     * @author lli
     * @create 2017年8月3日下午1:58:12
     * @version 1.0
     * @param ex
     * @return
     */
    @ExceptionHandler(RejectedExecutionException.class)
    @ResponseStatus(value = HttpStatus.OK)
    @ResponseBody
    public JsonResult handleRejectedExecution(Exception ex) {
        logger.error("系统异常:", ex);
        return new JsonResult(BusinessMsgEnum.FAST_ERR);
    }

    信号量机制Semaphore


public class SemaphoreTest {


  // 模拟请求线程数量
  private static final int THREAD_COUNT = 30;


  // 模拟请求线程池
  private static ExecutorService threadPool = Executors

          .newFixedThreadPool(THREAD_COUNT);


  // 信号量限流 数量为并发数10
  private static Semaphore s = new Semaphore(10);


 
  public static void main(String[] args) {

      for (int i = 0; i < THREAD_COUNT; i++) {

          threadPool.execute(new Runnable() {

              @Override

              public void run() {

                  try {
                      // int availablePermits() :返回此信号量中当前可用的许可证数。
                      // int getQueueLength():返回正在等待获取许可证的线程数。
                      // 可以用上面的方法判断 是否还需要处理,还是抛出 定制化更好控制
                      // 尝试获取许可,超时时间为1分钟
                      s.tryAcquire(1, TimeUnit.MINUTES); 

                      System.out.println("save data");


                  } catch (InterruptedException e) {

                  } finally {
                      // 释放许可
                      s.release();
                  }

              }

          });

      }

      threadPool.shutdown();

  }

}

代码可扩展性比用线程池更优。

参考地址:http://www.2cto.com/kf/201611/569222.html

© 著作权归作者所有

吹比龙
粉丝 10
博文 135
码字总数 38713
作品 0
合肥
程序员
私信 提问
加载中

评论(0)

一步一步学SpringCloud--getway配置详解

SpringCloud Gateway配置详解 前言 在上一篇文章中简单的介绍了SpringCloud Gateway,同时也对比了一下springcloud的gateway和Netflix的zuul,相信大家也有了一定的认识。此篇文章主要介绍一...

时光无声_l
昨天
0
0
流量激增不宕机,服务限流系统架构解密

再举一个我们生活中的例子:一些热门的旅游景点,往往对每日的旅游参观人数有严格的限制,比如北京的故宫、欢乐谷等,每天只卖固定数目的门票,如果去的晚了,可能当天的票就已经卖完,当天就...

IVAN-jsjwk
2018/11/14
0
0
基于滑动窗口的消息静默限流

1、背景 在物流详情的数据监控应用中,会通过消息中间件来接收包裹物流的变更消息(qps均值在1w,峰值在4w),接收到消息之后会调用一个后端的定时触发的服务(TMQ)用来检测物流消息是否及时...

zqrferrari
2017/07/17
0
0
SpringCloud 系列之九:Spring Cloud Zuul实现路由,过滤,限流

文章目录 Why? Zuul作为SpringCloud全家桶微服网关,可以帮助我们实现防刷,限流,安全权限校验,过滤,路由等重要的功能。 What? zuul具体可以帮助我们实现的功能以及如何实现的呢,现在我们...

lnazj
今天
0
0
限流和降级(上) | 如何打造平台稳定性能力(一)

在整个稳定性体系中,所包含的范围非常广泛,从机房的布线、网络通信、硬件部署、应用架构、数据容灾等方面都与之相关。从共享服务中台的角度看,则更多的是从应用架构设计和中间件平台的维度...

中间件小哥
2018/08/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存

一、malloc/free概述 malloc是在C语言中用于在程序运行时在堆中进行动态内存分配的库函数。free是进行内存释放的库函数。 1、函数原型 #include <stdlib.h> void *malloc( size_t size ); v...

shzwork
42分钟前
17
0
什么是JavaBean? - What is a JavaBean exactly?

问题: I understood, I think, that a "Bean" is a Java class with properties and getters/setters. 我认为,“ Bean”是具有属性和getter / setter的Java类。 As much as I understand,......

技术盛宴
49分钟前
21
0
深圳援鄂最后一批工作人员归来,88万元关爱金发放至85人

中国公益在线3月31日深圳讯 深圳援鄂最后一批工作人员归来......深圳市民政局、深圳市卫健委和深圳市慈善会发起了“深爱战疫天使基金”项目,联合龙华区慈善会和 永贤慈善基金会,进行第二次...

传承天下融媒体中心
53分钟前
15
0
easyui 的combobox设置宽度和高度自动适应,如果超出,则指定宽度和高度

<s:select list="newCostTypeMap" theme="simple" cssClass="myCombobox" cssStyle="width:200px" data-options="editable:false,panelHeight:'auto'" />$('.myCombobox').combobox({......

文文1
54分钟前
17
0
Scala的运算符

在Scala中运算符的表示法不局限于字符, 中缀运算符可以是任何方法接受参数的方法 前缀运算符放在值的前面,只能是 + - ! ~ 四者之一, 方法名为unary_*(*为运算符) 后缀运算符是任何不接受参...

dreamness
今天
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部