需求:接口每秒最多只能相应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. 【转载】RocketMQ与Kafka对比(18项差异)

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

  2. jquery 拓展函数集

    方式: 通过拓展在调用$()时返回的包装器 1.将函数绑定到$.fn $.fn.disable = function(){ return this.each(function(){ if (typeo ...

  3. Java Struts2 (三)

    一.国际化概念(了解) 1.什么是国际化 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 2.什么需要国际 ...

  4. 把getJson() 设置为同步执行

    因为业务需求,需要在获取到json 数据后,对数据进行处理. 这时候,我们需要把getJson() 的方法设置为同步 $.ajaxSettings.async = false; getJson() 方 ...

  5. set(string str)变量传参为int的问题

    if (bo.getAnesthesiaMode() != null) { if (bo.getAnesthesiaMode() != null) { CodeMstrCoMpare codeMstr ...

  6. DUANG~ 万网轻云服务器,大促狂欢,不仅仅免单!

    DUANG~ 万网轻云服务器,大促狂欢,不仅仅免单!   当老板第一次知道我们要做活动的时候,其实是拒绝的.DUANG~ 打折.降价.挥泪甩卖…太俗套.客户看到一定骂我们,根本没有诚意. 所以轻云大促 ...

  7. 【Android】Android studio 编译问题:finished with non-zero exit value 2

    1.Android studio 编译问题:finished with non-zero exit value 2 问题: Error:Execution failed for task ':andr ...

  8. Vue2.0中的系统指令

    v-on注册事件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  9. Vs2013 & .net framework 4.5.1 预览介绍

    微软发布了vs2013 preview 和fw4.5.1 下面简单介绍一下与大家共享 Developer productivity X64 edit and continue 在2013里面 可以在x ...

  10. mac和windows自动清理内存工具

    因为我比较懒,所以需要一款能自动清理电脑内存的工具,目的是设置内存最小值,然后自动清理. mac: drcleaner windows: MaxMem win10设置开机启动地址:C:\Program ...