高频控制的配置方式与熔断类似,有对应的RateLimiterRegistry 和 RateLimiterConfig,自定义配置的可选项有:
- 频次阈值
- 阈值刷新时间
- 限流后的冷却时间
初始化:
private void init() { // For example you want to restrict the calling rate of some method to be not higher than 10 req/ms. RateLimiterConfig config = RateLimiterConfig.custom() .limitRefreshPeriod(Duration.ofMillis(1)) .limitForPeriod(10) .timeoutDuration(Duration.ofMillis(25)) .build(); // Create registry RateLimiterRegistry rateLimiterRegistry = RateLimiterRegistry.of(config); // Use registry RateLimiter rateLimiterWithDefaultConfig = rateLimiterRegistry.rateLimiter("backend"); RateLimiter rateLimiterWithCustomConfig = rateLimiterRegistry.rateLimiter("backend#2", config); // Or create RateLimiter directly RateLimiter rateLimiter = RateLimiter.of("NASDAQ :-)", config); }
高频控制器使用方式:
private void process(){ RateLimiter rateLimiter = RateLimiter.ofDefaults("NASDAQ :-)"); // 使用上面定义的高频控制器装饰函数调用 CheckedRunnable restrictedCall = RateLimiter .decorateCheckedRunnable(rateLimiter, () -> System.out.println("Do something")); // 第一次调用成功,第二次调用被高频限制 Try.run(restrictedCall) .andThenTry(restrictedCall) .onFailure(throwable -> System.out.println("Wait before call it again :)")); // 你可以在运行时动态修改高频控制器配置,但新的冷却时间不会影响当前处于冷却状态的线程,新的阈值也不会影响处于当前一轮控制的线程: // 在下一轮控制中,阈值变更为100 rateLimiter.changeLimitForPeriod(100); }
监听高频控制事件
高频控制器事件RateLimiterEvent包含允许执行和拒绝执行事件,所有事件包含发生时间、相关高频控制器名称的信息。
rateLimiter.getEventPublisher()
.onSuccess(event -> logger.info(...))
.onFailure(event -> logger.info(...));
高频控制器状态
RateLimiter limit;
RateLimiter.Metrics metrics = limit.getMetrics();
int numberOfThreadsWaitingForPermission = metrics.getNumberOfWaitingThreads();
int availablePermissions = metrics.getAvailablePermissions();
AtomicRateLimiter atomicLimiter;
long nanosToWaitForPermission = atomicLimiter.getNanosToWait();
请使用手机"扫一扫"x