返回顶部
首页 > 资讯 > 精选 >java如何实现单机接口限流
  • 898
分享到

java如何实现单机接口限流

2023-06-21 20:06:47 898人浏览 八月长安
摘要

这篇文章主要为大家展示了“java如何实现单机接口限流”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何实现单机接口限流”这篇文章吧。简单说就是设定某个接口一定时间只接受固定次数的请求,

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

简单说就是设定某个接口一定时间只接受固定次数的请求,比如/add接口1秒最多接收100次请求,多的直接拒绝,这个问题很常见,场景也好理解,直接上代码:

@Slf4jpublic class FlowLimit { //接口限流上限值和限流时间缓存    private static Cache<String, AtomicLong> localCache = CacheBuilder.newBuilder().maximumSize(100)            .expireAfterWrite(1000, TimeUnit.MILLISECONDS).build(); //每个接口的上限缓存    private static Map<String, Long> maxFlowLimitMap = new ConcurrentHashMap<>();    private static final FlowLimit instance = new FlowLimit(); //这块的目的是初始化每个接口的上限,下面的变量:apiFlowLimitConfigure  //实际使用的时候应该是从db或者其他地方获取设置的每个接口的限流上限值, //这样可以动态的调整接口上限,比如直接修改db,不用发布,就可以调整接口限流值    static {        new ScheduledThreadPoolExecutor(1, runnable -> {            Thread thread = new Thread(runnable, "api-flowLimit-configure");//            thread.setDaemon(true);            return thread;        }).scheduleAtFixedRate(() -> {            try {                String apiFlowLimitConfigure = "{\"doAdd\":100}";  //表示/doAdd接口1秒接受100次请求                Map mapObj = JSONObject.parseObject(apiFlowLimitConfigure, Map.class);                if(mapObj != null){                    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如何实现单机接口限流”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: java如何实现单机接口限流

本文链接: https://lsjlt.com/news/300485.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java如何实现单机接口限流
    这篇文章主要为大家展示了“java如何实现单机接口限流”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何实现单机接口限流”这篇文章吧。简单说就是设定某个接口一定时间只接受固定次数的请求,...
    99+
    2023-06-21
  • Java如何实现接口限流
    小编给大家分享一下Java如何实现接口限流,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!RateLimiterGoogle开源工具包Guava提供了限流工具类RateLimiter,基于令牌桶算法实现。1.maven依赖:...
    99+
    2023-06-21
  • java接口限流如何实现
    在Java中实现接口限流可以使用以下几种方式: 计数器:维护一个计数器来统计每个接口的请求数量,当请求数量超过设定的阈值时,拒绝后...
    99+
    2023-10-25
    java
  • Java实现接口限流方案
    本文实例为大家分享了Java实现接口限流方案的具体代码,供大家参考,具体内容如下 RateLimiter Google开源工具包Guava提供了限流工具类RateLimiter,基于...
    99+
    2024-04-02
  • java单机接口限流处理方案详解
    对单机服务做接口限流的处理方案 简单说就是设定某个接口一定时间只接受固定次数的请求,比如/add接口1秒最多接收100次请求,多的直接拒绝,这个问题很常见,场景也好理解,直接上代码:...
    99+
    2024-04-02
  • Java如何实现限流器处理Rest接口请求
    这篇文章主要为大家展示了“Java如何实现限流器处理Rest接口请求”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java如何实现限流器处理Rest接口请求”这篇文章吧。Maven依赖<d...
    99+
    2023-06-25
  • 如何使用SpringBoot + Redis实现接口限流
    本篇内容介绍了“如何使用SpringBoot + Redis实现接口限流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!配...
    99+
    2023-06-30
  • Java使用Semaphore对单接口进行限流
    目录一、实战说明 1.1 效果说明 1.2 核心知识点 二、 环境搭建 三、限流演示3.1 并发请求工具3.2 效果示例图一、实战说明 1.1 效果说明 本篇主要讲如何...
    99+
    2024-04-02
  • java如何实现接口流量监控
    要实现接口流量监控,可以使用Java的Network Interface和TrafficStats类。首先,可以使用Network ...
    99+
    2023-09-15
    java
  • Java 实现限流器处理Rest接口请求详解流程
    Maven依赖 <dependency> <groupId>com.google.guava</groupI...
    99+
    2024-04-02
  • Java怎么使用Semaphore对单接口进行限流
    这篇文章主要讲解了“Java怎么使用Semaphore对单接口进行限流”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么使用Semaphore对单接口进行限流”吧!目录一、实战说明1...
    99+
    2023-06-20
  • SpringBoot如何使用自定义注解实现接口限流
    目录使用自定义注解实现接口限流1、自定义限流注解2、限流类型枚举类3、限流 Lua 脚本4、限流切面处理类 5、使用与测试SpringBoot工程中限流方式1、google...
    99+
    2024-04-02
  • SpringBoot项目中怎么实现接口限流
    这篇文章将为大家详细讲解有关SpringBoot项目中怎么实现接口限流,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。限流算法一般有漏桶算法和令牌桶算法及计数...
    99+
    2024-04-02
  • 基于 Redis 实现接口限流的方式
    目录基于 Redis 实现接口限流1. 准备工作2. 限流注解3. 定制 RedisTemplate4. 开发 Lua 脚本5. 注解解析6. 接口测试7. 全局异常处理总结基于 R...
    99+
    2024-04-02
  • SpringBootRedis用注释实现接口限流详解
    目录1. 准备工作2. 限流注解3. 定制 RedisTemplate4. 开发 Lua 脚本5. 注解解析6. 接口测试7. 全局异常处理1. 准备工作 首先我们创建一个 Spri...
    99+
    2024-04-02
  • java中如何实现接口
    接口的实现格式:[修饰符] class [extends 父类名] [implements 接口列表]{ }修饰符:可选参数,用于指定类的访问权限,可选值为public、abstract和final。类名:必选参数,用于指定类的名称,类名...
    99+
    2020-03-10
    java入门 java 接口 实现
  • Springboot使用redis实现接口Api限流的实例
    前言 该篇介绍的内容如题,就是利用redis实现接口的限流(  某时间范围内 最大的访问次数 ) 。 正文  惯例,先看下我们的实战目录结构: 首...
    99+
    2024-04-02
  • java中如何实现redis限流操作
    这篇文章给大家分享的是有关java中如何实现redis限流操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体操作如下。导入所需依赖<properties>   &nb...
    99+
    2023-06-21
  • 使用SpringBoot + Redis 实现接口限流的方式
    目录配置限流注解定制 RedisTemplateLua 脚本注解解析接口测试全局异常处理Redis 除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。。。太多太多了...
    99+
    2024-04-02
  • Java接口签名如何实现
    这篇文章给大家分享的是有关Java接口签名如何实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、要求下图为具体要求二、流程线下分配appid和appsecret,针对不同的调用方分配不同的appid和apps...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作