[英]Resilience4J Ratelimiter does not limit access of annotated method
I am using the resilience4j-spring-boot2
library ( io.github.resilience4j:resilience4j-spring-boot2
, version 1.5.0
) and Spring Boot version 2.3.1.RELEASE
. 我創建了一個RateLimiter
,它應該只讓一個線程每 30 秒執行一次某個方法。 但是,線程調用該方法似乎沒有界限(除了在 Tomcat 服務器中運行的已配置線程數)。
我實現了一個簡單的服務,它等待給定的時間然后返回“Hello:”:
@RequestMapping("/")
@RestController
public class ResilientService {
@RateLimiter(name = "hello-rl")
@GetMapping("/hello/{timeout}")
public String hello(@PathVariable int timeout) throws InterruptedException {
Thread.sleep(timeout);
return "Hello!";
}
}
並配置 Ratelimiter 如下
resilience4j.ratelimiter:
instances:
hello-rl:
limitForPeriod: 1 # The number of permissions available during one limit refresh period
limitRefreshPeriod: 30s # The period of a limit refresh. After each period the rate limiter sets its permissions count back to the limitForPeriod value
timeoutDuration: 30s # The default wait time a thread waits for a permission
我用八個線程調用了該服務:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
@Slf4j
public class CircuitBreakerTest {
@Autowired
TestRestTemplate testRestTemplate;
@LocalServerPort
private int port;
@Value("${server.address}")
private String serverAddress;
@Test
public void t() throws InterruptedException {
final ExecutorService executorService = Executors.newFixedThreadPool(8);
for (int i : IntStream.rangeClosed(1, 8).toArray()) {
executorService.execute(() -> log.error(callService()));
}
executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.MINUTES);
}
private String callService() {
return testRestTemplate.getForObject(
"http://" + serverAddress + ":" + port + "/hello/5000",
String.class
);
}
output如下:
2020-08-07 10:41:10,095 ERROR [pool-1-thread-7] CircuitBreakerTest: Hello!
2020-08-07 10:41:10,095 ERROR [pool-1-thread-1] CircuitBreakerTest: Hello!
2020-08-07 10:41:10,095 ERROR [pool-1-thread-8] CircuitBreakerTest: Hello!
2020-08-07 10:41:10,095 ERROR [pool-1-thread-2] CircuitBreakerTest: Hello!
2020-08-07 10:41:10,095 ERROR [pool-1-thread-5] CircuitBreakerTest: Hello!
2020-08-07 10:41:15,104 ERROR [pool-1-thread-3] CircuitBreakerTest: Hello!
2020-08-07 10:41:15,121 ERROR [pool-1-thread-4] CircuitBreakerTest: Hello!
2020-08-07 10:41:15,121 ERROR [pool-1-thread-6] CircuitBreakerTest: Hello!
一次似乎只允許五個線程執行該方法,但我不知道為什么。 Tomcat 服務器以 >8 個線程運行。 我犯錯了嗎? 還是我誤解了 RateLimiter 應該如何工作?
resilience4j-spring-boot2
內部使用方面,因此需要將spring-boot-starter-aop
依賴添加到項目中才能使注釋工作:
<dependency>
<!-- for rate limiting -->
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>${resilience4j.version}</version>
</dependency>
<dependency>
<!-- needed for Resilience4j -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
正如一開始的官方文檔中所述(“設置”)......完全錯過了這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.