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)

相关推荐

  • 提问的英文,对于价格的提问,用英语怎么说

    技术提问的英文,对于价格的提问,用英语怎么说对于价格的提问的英文:How muchmuch 读法 英 [mʌtʃ] 美 [mʌtʃ] 1、det./pron.(与不可数名词连用,尤用于否定句;或与how连用以询问数

    生活 2021年10月26日
  • 香港VPS与云服务器:哪个是您的正确选择

    技术香港VPS与云服务器:哪个是您的正确选择与传统香港服务器相比,如果搭建简单的是一些结构简单的小型网站,从成本的角度考虑,香港VPS和香港云服务器都具有明显的优势。但是你如何在它们之间做出选择呢?VPS和云主机一样吗?

    礼包 2021年10月20日
  • C# 和 Python 的 hash_md5加密方法是什么

    技术C# 和 Python 的 hash_md5加密方法是什么这篇文章给大家介绍C# 和 Python 的 hash_md5加密方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、C# 和

    攻略 2021年11月9日
  • moisten,Moisten是什么意思

    技术moisten,Moisten是什么意思moisten 英[mɔɪsn] 美[ˈmɔɪsən] vt.& vi. (使)变得潮湿moisten,变得湿润
    第三人称单数:moiste

    生活 2021年10月26日
  • angular双向绑定实现(angular 双向绑定数据校验)

    技术angular怎么实现双向数据绑定本篇内容介绍了“angular怎么实现双向数据绑定”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,

    攻略 2021年12月21日
  • 现在做什么生意赚钱,今年有什么商机能创业赚钱

    技术现在做什么生意赚钱,今年有什么商机能创业赚钱今年什么商机能赚到钱呢现在做什么生意赚钱?
    其实在今天的社会中,在我们身边,这生活中有太多赚钱的机会,只是你能不能发现或者说你愿意不愿意去做,如果大家都知道了赚钱的机会,那

    生活 2021年10月31日