自定义注解封装RateLimiter.实例:

@RequestMapping("/myOrder")

@ExtRateLimiter(value = 10.0, timeOut = 500)

public String myOrder() throws InterruptedException {

System.out.println("myOrder");

return "SUCCESS";

}

自定义注解

@Target(value = ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface ExtRateLimiter {

double value();

long timeOut();

}

编写AOP

@Aspect

@Component

public class RateLimiterAop {

// 存放接口是否已经存在

private static ConcurrentHashMap<String, RateLimiter> rateLimiterMap = new ConcurrentHashMap<String, RateLimiter>();

@Pointcut("execution(public * com.it.api.*.*(..))")

public void rlAop() {

}

@Around("rlAop()")

public Object doBefore(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();

// 使用Java反射技术获取方法上是否有@ExtRateLimiter注解类

ExtRateLimiter extRateLimiter = signature.getMethod().getDeclaredAnnotation(ExtRateLimiter.class);

if (extRateLimiter == null) {

// 正常执行方法

Object proceed = proceedingJoinPoint.proceed();

return proceed;

}

// ############获取注解上的参数 配置固定速率 ###############

// 获取配置的速率

double value = extRateLimiter.value();

// 获取等待令牌等待时间

long timeOut = extRateLimiter.timeOut();

RateLimiter rateLimiter = getRateLimiter(value, timeOut);

// 判断令牌桶获取token 是否超时

boolean tryAcquire = rateLimiter.tryAcquire(timeOut, TimeUnit.MILLISECONDS);

if (!tryAcquire) {

serviceDowng();

return null;

}

// 获取到令牌,直接执行..

Object proceed = proceedingJoinPoint.proceed();

return proceed;

}

// 获取RateLimiter对象

private RateLimiter getRateLimiter(double value, long timeOut) {

// 获取当前URL

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

HttpServletRequest request = attributes.getRequest();

String requestURI = request.getRequestURI();

RateLimiter rateLimiter = null;

if (!rateLimiterMap.containsKey(requestURI)) {

// 开启令牌通限流

rateLimiter = RateLimiter.create(value); // 独立线程

rateLimiterMap.put(requestURI, rateLimiter);

} else {

rateLimiter = rateLimiterMap.get(requestURI);

}

return rateLimiter;

}

// 服务降级

private void serviceDowng() throws IOException {

// 执行服务降级处理

System.out.println("执行降级方法,亲,服务器忙!请稍后重试!");

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

HttpServletResponse response = attributes.getResponse();

response.setHeader("Content-type", "text/html;charset=UTF-8");

PrintWriter writer = response.getWriter();

try {

writer.println("执行降级方法,亲,服务器忙!请稍后重试!");

} catch (Exception e) {

} finally {

writer.close();

}

}

public static void main(String[] args) {

// 使用Java反射技术获取方法上是否有@ExtRateLimiter注解类

ExtRateLimiter extRateLimiter = IndexController.class.getClass().getAnnotation(ExtRateLimiter.class);

System.out.println(extRateLimiter);

}

}

运行效果

@RequestMapping("/myOrder")

@ExtRateLimiter(value = 10.0, timeOut = 500)

public String myOrder() throws InterruptedException {

System.out.println("myOrder");

return "SUCCESS";

}

封装RateLimiter 令牌桶算法的更多相关文章

  1. RateLimiter令牌桶算法

    限流,是服务或者应用对自身保护的一种手段,通过限制或者拒绝调用方的流量,来保证自身的负载. 常用的限流算法有两种:漏桶算法和令牌桶算法 漏桶算法 思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度 ...

  2. coding++:RateLimiter 限流算法之漏桶算法、令牌桶算法--简介

    RateLimiter是Guava的concurrent包下的一个用于限制访问频率的类 <dependency> <groupId>com.google.guava</g ...

  3. 基于令牌桶算法实现的SpringBoot分布式无锁限流插件

    本文档不会是最新的,最新的请看Github! 1.简介 基于令牌桶算法和漏桶算法实现的纳秒级分布式无锁限流插件,完美嵌入SpringBoot.SpringCloud应用,支持接口限流.方法限流.系统限 ...

  4. coding++:Semaphore—RateLimiter-漏桶算法-令牌桶算法

    java中对于生产者消费者模型,或者小米手机营销 1分钟卖多少台手机等都存在限流的思想在里面. 关于限流 目前存在两大类,从线程个数(jdk1.5 Semaphore)和RateLimiter速率(g ...

  5. 15行python代码,帮你理解令牌桶算法

    本文转载自: http://www.tuicool.com/articles/aEBNRnU   在网络中传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送,令牌桶算法 ...

  6. flask结合令牌桶算法实现上传和下载速度限制

    限流.限速: 1.针对flask的单个路由进行限流,主要场景是上传文件和下载文件的场景 2.针对整个应用进行限流,方法:利用nginx网关做限流 本文针对第一中情况,利用令牌桶算法实现: 这个方法:h ...

  7. 令牌桶算法实现API限流

    令牌桶算法( Token Bucket )和 Leaky Bucket 效果一样但方向相反的算法,更加容易理解.随着时间流逝,系统会按恒定 1/QPS 时间间隔(如果 QPS=100 ,则间隔是 10 ...

  8. 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿

    一.微服务网关Spring Cloud Gateway 1.1 导引 文中内容包含:微服务网关限流10万QPS.跨域.过滤器.令牌桶算法. 在构建微服务系统中,必不可少的技术就是网关了,从早期的Zuu ...

  9. php 基于redis使用令牌桶算法 计数器 漏桶算法 实现流量控制

    通常在高并发和大流量的情况下,一般限流是必须的.为了保证服务器正常的压力.那我们就聊一下几种限流的算法. 计数器计数器是一种最常用的一种方法,在一段时间间隔内,处理请求的数量固定的,超的就不做处理. ...

随机推荐

  1. 国外物联网平台(3):IBM Watson IoT

    国外物联网平台(3)——IBM Watson IoT 马智 平台定位 提供全面管理的云托管服务,旨在简化并从 IoT 设备中获得价值. Watson IoT Platform 提供对 IoT 设备和数 ...

  2. IIS如何避免子web应用程序中继承根目录web.config配置

    1.一种方式,需要改动根目录的web.config(不是很推荐) <?xml version="1.0"?> <configuration> <loc ...

  3. Gazebo学习随记1 Gazebo概览

    Gazebo组件 World 世界 包含模拟中所有的元素如机器人,灯光,传感器等等 使用SDF(模拟描述格式)格式化 [用XML语言描述] 拓展名.world Model 模型 只包含一个<mo ...

  4. C语言和sh脚本的杂交代码

    在网上看到了一个把 C语言和bash杂并起来的例子,这个示子如下所示.在下面这个例子中,我们把脚本用#if 0这个预编译给起来,这样就不会让其编译到C语言中了. #if 0 echo "He ...

  5. 51nod1455(dp)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1455 题意: 中文题诶~ 思路: dp 1 <= n, ...

  6. ios配置xmpp即时聊天-服务器端

    一.安装 到MySQL官网上http://dev.mysql.com/downloads/mysql/,下载mysql可安装dmg版本 比如:Mac OS X ver. 10.7 (x86, 64-b ...

  7. 洛谷 P1801 黑匣子_NOI导刊2010提高(06)

    题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...

  8. HDU - 6416 :Rikka with Seam(DP & 前缀和 & 数学)

    pro:给定N*M的矩阵,现在让你在每一行删去一个位置,然后形成新N*(M-1)的矩阵,问有多少种不同的新的矩阵.需要满足相邻行删去的位置不大于K. (题目是01矩阵,其实任意矩阵都可以做,本题算法里 ...

  9. java 的开发工具IDEA使用 中Debug 调试工具使用

    IDEA JetBrains(这个公司的名称翻译过来就是“大脑喷射?”) 公司的宣传语是这么说的:Develop with pleasure!(带着快乐开发!)   话不多说 开始debug   1, ...

  10. [转载]np.where()使用说明

    转载自https://www.cnblogs.com/massquantity/p/8908859.html#4072620 numpy.where() 有两种用法: 1. np.where(cond ...