限流接口 访问 java_接口限流的两种方式

php与mysql程序设计第5版高效的

95.1元

包邮

(需用券)

去购买 >

bf52653498fe0f539b80377f324ec991.png

需求:单位时间内,比如1s,限制某个接口的调用次数。

RateLimiter

RateLimiter基于令牌桶算法,有一个令牌桶,单位时间内令牌会以恒定的数量(即令牌的加入速度)加入到令牌桶中,所有请求都需要获取令牌才可正常访问。当令牌桶中没有令牌可取的时候,则拒绝请求。

定义一个接口:

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface RateLimit {

//每秒限制次数

double limit() default 1;

}

定义一个切面:

@Slf4j

@Component

@Aspect

public class RateLimitAspect {

private static final ConcurrentMap rateLimiterCache = new ConcurrentHashMap<>();

@Pointcut("@annotation(com.example.demo.RateLimit)")

public void rateLimit() {

}

@Around("rateLimit()")

public Object pointcut(ProceedingJoinPoint joinPoint) throws Throwable {

Object obj = null;

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

Method method = signature.getMethod();

RateLimit rateLimit = AnnotationUtils.findAnnotation(method, RateLimit.class);

if (rateLimit != null) {

if (rateLimiterCache.get(method.getName()) == null) {

rateLimiterCache.put(method.getName(), RateLimiter.create(rateLimit.limit()));

}

RateLimiter rateLimiter = rateLimiterCache.get(method.getName());

if (rateLimiter != null) {

if (!rateLimiter.tryAcquire()) {

log.info("=====完了没抢到...=====");

} else {

log.info("=====我抢到了!!=====");

obj = joinPoint.proceed();

}

}

}

return obj;

}

}

controller:

@Slf4j

@RestController

public class TestController {

@RateLimit(limit = 5)

@GetMapping("/test")

public String test() {

return "请求成功";

}

}

Redis

利用了Redis的自增和过期时间

@Slf4j

@RestController

public class TestController {

private int countLimit = 5;

private int timeLimit = 1;

@Autowired

StringRedisTemplate stringRedisTemplate;

@GetMapping("/test")

public String test(String key) {

if (stringRedisTemplate.hasKey(key)) {

long count = stringRedisTemplate.boundValueOps(key).increment(1);

if (count > countLimit) {

log.info("请求过于繁忙");

}

} else {

stringRedisTemplate.opsForValue().set(key, "1", timeLimit, TimeUnit.SECONDS);

}

return "请求成功";

}

}

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

f0f3f55624fb396b1764d42d6df88864.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值