java如何实现单机接口限流

技术java如何实现单机接口限流这篇文章主要为大家展示了“java如何实现单机接口限流”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何实现单机接口限流”这篇文章吧。

本文主要给大家展示“java如何实现单机界面的限流”。内容简单易懂,条理清晰。希望能帮你解开疑惑。让边肖带领大家学习学习《java如何实现单机界面的电流极限》一文。

简单来说,就是设置一个接口,在一定时间内只接受固定次数的请求。例如,/add接口一秒钟最多可以接收100个请求,其中许多请求会直接拒绝。这个问题很常见,场景也很好理解。直接编码:

/**

*单机限流

*/

@Slf4j

publicclassFlowLimit{

//接口限流上限和限流时间缓存

privatestaticCacheString,atomiconglocalccache=cachebuilder . new builder()。最大大小(100)。expireAfterWrite(1000,时间单位。毫秒)。build();

//每个接口的上限缓存

privatestaticMapString,longmaxflow limitmap=new concurrenthashmap();

privatedstatifnlowlimitinstance=new flow limit();

//这个块的目的是初始化每个接口的上限,以下变量:apiFlowLimitConfigure

//在实际使用中,我们应该从db或其他地方获取每个接口的设置电流限制上限值,

//这样就可以动态调整接口上限,比如直接修改db,就可以调整接口限流,无需发布。

静态{

newscheduledreadpoolexecutor(1,可运行-{ 0

Threadthread=newThread(可运行,' API-FlowLimit-configure ');

//thread . setdaemon(true);

returnthread

}).scheduleAtFixedRate(()-{ 0

尝试{

stringiflowlimitconfigure=' { \ ' DOADD ' :100 } ';//表示/doAdd接口一秒钟接受100个请求。

MapmapObj=jsonobject . parseobject(apiflolimitconfigure,map . class);

if(mapObj!=null){ 0

             mapObj.forEach((key, value) -> {
                        if(value != null){
                            instance.setMaxFlowLimit(key.toString(), new Long(value.toString()));
                        }else{
                            log.warn(key + " - 设置接口限流发现限流值为空,设置默认值");
                            instance.setMaxFlowLimit(key.toString(), 100L);
                        }
                    });
                }
            } catch (Exception e) {
                log.error("设置接口限流出现异常{}", e);
            }
        }, 0, 3, TimeUnit.SECONDS);
    }
    public static FlowLimit getInstance() {
        return instance;
    }
    private FlowLimit setMaxFlowLimit(String key, Long maxFlowLimit) {
        maxFlowLimitMap.put(key, maxFlowLimit);
        return this;
    }
    public Boolean isAvailable(String key) {
        return checkAvailable(key, 1L);
    }
    public Boolean isAvailable(String key, Long incrNum) {
        return checkAvailable(key, incrNum);
    }
    private Boolean checkAvailable(String key, Long incrNum){
        Long maxFlowLimit = maxFlowLimitMap.get(key);
        if (null == maxFlowLimit || maxFlowLimit == 0) {
            return true;
        }
        if (incrAndGet(key, incrNum) <= maxFlowLimit.longValue()) {
            return true;
        } else {
            return false;
        }
    }
    private long incrAndGet(String key, final long n) {
        try {
            return localCache.get(key, new Callable<AtomicLong>() {
                @Override
                public AtomicLong call() throws Exception {
                    return new AtomicLong(0);
                }
            }).addAndGet(n);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return 0;
    }
    public long get(String key) {
        return incrAndGet(key, 0);
    }
}

上面这个就是单机限流逻辑,代码不难,感觉没必要使用ConcurrentHashMap,不过感觉无所谓了
这段代码只需要加在需要限流的接口前面:

@GetMapping("doAdd")
public Boolean doAdd(){
    FlowLimit instance = FlowLimit.getInstance(); //单例获取
    //查看当前的/doAdd接口是否触发了限流
    Boolean flowLimitFlag = instance.isAvailable("doAdd");
    if(!flowLimitFlag){
        log.warn("触发限流,拒绝请求");
        return false;
    }
    //doAdd()
    return true;
}

调用实例如上

上面这个限流其实是有一定问题的:比如你限定10秒钟1000次,在第9.9秒的时候,突然进来1000个请求,然后第10.1秒的时候,攻击者,又进来1000次请求,这样,0.2秒之内,进来2000次请求。。。
所以这个时候就需要令牌桶或者其他算法了,其他算法后面再写

以上是“java如何实现单机接口限流”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/116537.html

(0)

相关推荐

  • SQL基础的查询语句有哪些

    技术SQL基础的查询语句有哪些这篇文章主要介绍“SQL基础的查询语句有哪些”,在日常操作中,相信很多人在SQL基础的查询语句有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQL基础的

    攻略 2021年11月10日
  • IE8下DIV嵌套出现错误怎么办

    技术IE8下DIV嵌套出现错误怎么办这篇文章给大家分享的是有关IE8下DIV嵌套出现错误怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。IE8下DIV嵌套出现错误解决方案最近用DIV写了几

    攻略 2021年11月6日
  • 如何使用Cython为Python编写更快的C扩展

    技术如何使用Cython为Python编写更快的C扩展本篇文章为大家展示了如何使用Cython为Python编写更快的C扩展,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在我们这

    攻略 2021年10月26日
  • 自制柚子茶,家庭自制蜂蜜柚子茶要怎么做

    技术自制柚子茶,家庭自制蜂蜜柚子茶要怎么做在冬天这个时候,是吃柚子的最佳时节,柚子皮具有很好的清热去火功能,并且柚子皮在擦拭水龙头等厨具上面还可以很好的清洁污渍,所以小编的柚子皮都是充分利用的,最喜欢的就是用它来做蜂蜜柚

    生活 2021年10月28日
  • Java基础学习笔记

    技术Java基础学习笔记 Java基础学习笔记Java基础思维导图
    左键在“新标签页打开图片”可查看高清大图一、Java入门特性与优势
    高可用 高并发 高性能
    面向对象、多线程、简单性(去掉了内存分配、

    礼包 2021年12月1日
  • Linux DRM平台驱动匹配和探测的方法是什么

    技术Linux DRM平台驱动匹配和探测的方法是什么本篇内容介绍了“Linux DRM平台驱动匹配和探测的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这

    攻略 2021年11月23日