Google,RateLimiter
private RateLimiter limiter;
@PostConstruct
public void init() {
limiter = RateLimiter.create(100.0);
}
使用
// 是否触发了QPS保护
if (!limiter.tryAcquire()) {
return Response.failure(ErrorCodeMsgEnums.OPERATION_FREQUENTLY);
}
QPS、QTS区别:
QPS:每秒查询数;【查询】
QTS:每秒事物数(处理事物数量);【更新】
拓展,如果要在RateLimiter中动态设置QPS值,比如使用Nacos配置文件形式;
@Slf4j
@Getter
@RequiredArgsConstructor
@Service
public class ShiseidoRateLimiterService {
private final ShiseidoConfig shiseidoConfig;
private RateLimiter rateLimiter;
@PostConstruct
public void init() {
rateLimiter = RateLimiter.create(shiseidoConfig.getTodosUnfinishedQps());
}
@EventListener
public void handleContextRefresh(EnvironmentChangeEvent event) {
log.info("开始刷新待办QPS值: {}", shiseidoConfig.getTodosUnfinishedQps());
rateLimiter.setRate(shiseidoConfig.getTodosUnfinishedQps());
}
}
@PostConstruct:构造函数被调用,并且所有的Spring注入都以完成时,该注解方法才会执行;
@EventListener:应用内发布与监听器匹配的异步或同步事件时,该方法会被触发;
EnvironmentChangeEvent:应用程序的环境或者属性变化时,事件会被触发【如果你只关心环境的刷新,而不关心具体哪些属性变化,你可能想要监听 RefreshEvent 而不是 EnvironmentChangeEvent。】
使用:
if (!shiseidoRateLimiterService.getRateLimiter().tryAcquire()) {
return Response.failure(ErrorCodeMsgEnums.OPERATION_FREQUENTLY);
}