博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实例:接口并发限流RateLimiter
阅读量:7077 次
发布时间:2019-06-28

本文共 2506 字,大约阅读时间需要 8 分钟。

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

 

1.创建 全局类对象

import com.google.common.util.concurrent.RateLimiter;import org.springframework.stereotype.Service;/** * @Auther: 011336 * @Date: 2019/4/29 17:31 */@Servicepublic 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 中获取令牌。成功择执行,失败则阻塞 直到拿到令牌才继续执行

转载于:https://www.cnblogs.com/UncleWang001/p/10794393.html

你可能感兴趣的文章
debian 7.4 安装配置
查看>>
2017-2018-1 20155229 《信息安全系统设计基础》第五周学习总结
查看>>
【整理】SYSCOMMAND的wParam值的宏定义
查看>>
.net Application的目录
查看>>
洛谷 P1313 计算系数 Label:杨辉三角形 多项式计算
查看>>
YUV色彩空间(转自百度百科)
查看>>
创建服务
查看>>
Sencha Touch 2.1学习图表Chart概述
查看>>
NYOJ467 中缀式变后缀式
查看>>
qwq
查看>>
C#中timer类的用法
查看>>
shell脚本学习
查看>>
自动化交易机器人Beta猪
查看>>
03、常用类解析
查看>>
最少的次数
查看>>
用vue开发单页应用的一些心得
查看>>
步步为营:SQLServer查询随机不相同的记录插入临时表
查看>>
About SOuP
查看>>
【12c OCP】CUUG OCP认证071考试原题解析(36)
查看>>
join
查看>>