需求:接口每秒最多只能相应1个请求

1.创建 全局类对象

import com.google.common.util.concurrent.RateLimiter;
import org.springframework.stereotype.Service; /**
* @Auther: 011336
* @Date: 2019/4/29 17:31
*/
@Service
public class AccessLimitService {
/**
* 每秒只发出1个令牌
*/
RateLimiter rateLimiter = RateLimiter.create(1.0); /**
* 获取等待时间 方法阻塞
* 每次等待一个获取一个令牌
* @return
*/
public double acquire(){
double waitTime = rateLimiter.acquire(1);
return waitTime;
}
}

2.测试实例  模拟10个并发请求

@Controller
@RequestMapping("/SegmentRecommend")
public class NearestAirportController { private Logger logger = Logger.getLogger(NearestAirportController.class); @Autowired
private NearestAirportService nearestAirportService; @Autowired
private AccessLimitService accessLimitService; /**
   * 此方法是我们对外提供的接口,通过调用acquire()方法获取令牌,获取失时会阻塞直到获取令牌成功才继续执行
   */
public ModelAndView getNearestAirport(HttpServletRequest request, HttpServletResponse response)throws Exception {
logger.info("NearestAirportController.getNearestAirport begin");
System.out.println(" |||||||||||||waitTime:" + accessLimitService.acquire());
RemoteAirportsData data = nearestAirportService.getNearestAirports();
logger.info("NearestAirportController.getNearestAirport end");
return null;
}
@RequestMapping(value ="/GetNearestAirport" ,produces = "application/json;charset=UTF-8")
public ModelAndView ttttt (HttpServletRequest request, HttpServletResponse response) throws Exception{
logger.info("=============================================================================");
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
    //开启10个线程模拟10个并发请求
for(int i=0;i<10;i++) {
fixedThreadPool.submit(new Runnable() {
@Override
public void run() {
try {
getNearestAirport(request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
fixedThreadPool.shutdown();
fixedThreadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
logger.info("================================================================================");
return null;
}
}

3. 执行结果:getNearestAirpor()方法每秒只执行了一次

总结:关键是要让  rateLimiter  变量成为线程共享变量,每个请求执行前都要来到 rateLimiter 中获取令牌。成功择执行,失败则阻塞 直到拿到令牌才继续执行

实例:接口并发限流RateLimiter的更多相关文章

  1. wcf利用IDispatchMessageInspector实现接口监控日志记录和并发限流

    一般对于提供出来的接口,虽然知道在哪些业务场景下才会被调用,但是不知道什么时候被调用.调用的频率.接口性能,当出现问题的时候也不容易重现请求:为了追踪这些内容就需要把每次接口的调用信息给完整的记录下来 ...

  2. 快速入门系列--WCF--06并发限流、可靠会话和队列服务

    这部分将介绍一些相对深入的知识点,包括通过并发限流来保证服务的可用性,通过可靠会话机制保证会话信息的可靠性,通过队列服务来解耦客户端和服务端,提高系统的可服务数量并可以起到削峰的作用,最后还会对之前的 ...

  3. 服务接口API限流 Rate Limit 续

    一.前言 上一篇文章中粗浅的介绍使用Redis和基于令牌桶算法进行对服务接口API限流,本文介绍另一种算法---漏桶算法的应用.Nginx想必大家都有所了解是一个高性能的 HTTP 和反向代理服务器, ...

  4. Google Guava缓存实现接口的限流

    一.项目背景 最近项目中需要进行接口保护,防止高并发的情况把系统搞崩,因此需要对一个查询接口进行限流,主要的目的就是限制单位时间内请求此查询的次数,例如1000次,来保护接口. 参考了 开涛的博客聊聊 ...

  5. Guava RateLimiter实现接口API限流

    一.简介 Guava提供的RateLimiter可以限制物理或逻辑资源的被访问速率.RateLimit二的原理类似与令牌桶,它主要由许可发出的速率来定义,如果没有额外的配置,许可证将按每秒许可证规定的 ...

  6. 服务接口API限流 Rate Limit

    一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...

  7. java 服务接口API限流 Rate Limit

    一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...

  8. 高并发之限流RateLimiter(二)

    Guava RateLimiter提供了令牌桶算法实现:平滑突发限流(SmoothBursty)和平滑预热限流(SmoothWarmingUp)实现. SmoothBursty:令牌生成速度恒定 @T ...

  9. 使用AOP和Semaphore对项目中具体的某一个接口进行限流

    整体思路: 一 具体接口,可以自定义一个注解,配置限流量,然后对需要限流的方法加上注解即可! 二 容器初始化的时候扫描所有所有controller,并找出需要限流的接口方法,获取对应的限流量 三 使用 ...

随机推荐

  1. mac安装rz,sz文件操作指令包

    安装需要具备什么样的环境? 1.安装item2 iterm2是一个与terminal一样的指令窗口 item2 下载地址,​​http://iterm2.com/downloads.html,下载后解 ...

  2. 学会Markdown,写博客不愁

    前言 Markdown是一种轻量级的标记语言,有John Gruber以及Aaron Hillel Swartz一起编写.Aaron Hillel Swartz是一个极富传奇的黑客,有兴趣可以看看他的 ...

  3. JFrame自适应大小

    pack();函数调用PreferedSize(); 所以对于组件要setPreferedSize();

  4. Maven --- <distributionManagement>标签

    1.<distributionManagement>的作用: 负责管理构件的发布.这是一个环境变量    <downloadUrl> URL </downloadUrl& ...

  5. 我所理解的js闭包

    举个例子: function f1(){ var n=; function f2(){ alert(n); } } 上面代码中,f2()可以读取f1()中的局部变量n的值,但是f1()不能反过来读取f ...

  6. 【转载】RocketMQ与Kafka对比(18项差异)

    转载自 https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka RocketMQ与Kafka对比(18项差异) 淘宝内部的交易系统使用了淘宝自主研发 ...

  7. mysql 远程连接权限

    当你远程连不上时,可能的原因: 1.是否开启了远程连接权限 2.是否启动了mysql服务 使用客户端远程登陆报错: 使用命令行myslq -h192.168.82.23 -uroot -p123456 ...

  8. Linux pip 安装模块时,一直黄字错误:Could not find a version that satisfies the requirement

    参考原文:https://blog.csdn.net/u012592062/article/details/51966649 这时我们用国内的镜像源来加速 pip install 包名-i http: ...

  9. SQL Join 语句

    SQL Join 语句 SQL 中每一种连接操作都包括一个连接类型和连接条件. 连接类型 决定了如何处理连接条件不匹配的记录. 连接类型 返回结果 inner join 只包含左右表中满足连接条件的记 ...

  10. ExceptionHelper异常工具类

    using System;using System.Collections.Generic;using System.Text; namespace JiaWel.Utilities{ public ...