https://github.com/resilience4j/resilience4j
resilience4j sera une implémentation de disjoncteur de premier plan principalement pour Java. Des fonctionnalités liées à la limitation de débit existent également.
https://github.com/resilience4j/resilience4j#ratelimiter
Ci-dessous, la vérification est effectuée sur la base de l'exemple de programme suivant.
https://github.com/resilience4j/resilience4j-spring-boot2-demo
Configuration build.gradle
Utilisez ʻio.github.resilience4j: resilience4j-spring-boot2` lors de la liaison avec Spring Boot.
dependencies {
compile('org.springframework.boot:spring-boot-starter-webflux')
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.boot:spring-boot-starter-aop')
compile("io.github.resilience4j:resilience4j-spring-boot2:${resilience4jVersion}") // <-
application.yml
resilience4j.ratelimiter:
configs:
default:
registerHealthIndicator: false
limitForPeriod: 3
limitRefreshPeriod: 2s
timeoutDuration: 0
eventConsumerBufferSize: 100
instances:
backendA:
baseConfig: default
backendB:
limitForPeriod: 6
limitRefreshPeriod: 500ms
timeoutDuration: 3s
Avec limitForPeriod: 3
et limitRefreshPeriod: 2s
, la limitation de débit est effectuée s'il y a plus de 3 accès dans les 2 secondes.
Java Définissez l'annotation @RateLimiter lors de la définition de la limitation de débit.
@Override
@RateLimiter(name = BACKEND_A) // <--
@CircuitBreaker(name = BACKEND_A)
@Bulkhead(name = BACKEND_A)
@Retry(name = BACKEND_A)
public String success() {
return "Hello World from backend A";
}
Running Avec ce paramètre, une erreur 500 sera renvoyée si l'accès est effectué plus de 3 fois en 2 secondes.
< HTTP/1.1 200 OK
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 26
<
* Connection #0 to host localhost left intact
Hello World from backend A
< HTTP/1.1 500 Internal Server Error
< Content-Type: application/json
< Content-Length: 235
<
{
"timestamp" : "2020-05-05T09:23:13.530+0000",
"path" : "/backendA/success",
"status" : 500,
"error" : "Internal Server Error",
"message" : "RateLimiter 'backendA' does not permit further calls",
"requestId" : "b372ed49"
}
En interne, une exception RuntimeException appelée RequestNotPermitted
se produit, il est donc nécessaire d'effectuer une gestion des erreurs appropriée et un traitement de retour HTTP StatusCode dans la couche Controller.
Monitoring
Vous pouvez obtenir les paramètres relatifs à la limite de débit avec / actionneur / ratelimiters
.
{
"rateLimiters" : [ "backendA", "backendB" ]
}
Conclusion
Avec resilience4j et resilience4j-spring-boot2, il est assez facile d'ajouter une fonctionnalité de limitation de débit à votre application Spring Boot existante.
La différence avec bucket4j est que le chemin d'URL et le traitement de limitation de débit par utilisateur ne sont pas pris en charge par défaut.
Si vous souhaitez appliquer sérieusement le traitement de limitation de débit à l'ensemble du système, il est préférable d'introduire le middleware API Gateway à l'aide de Ambassador Pattern ou Side-Car Pattern.
Recommended Posts