https://github.com/resilience4j/resilience4j
resilience4j wird vor allem für Java eine herausragende Implementierung von Leistungsschaltern sein. Es gibt auch Funktionen zur Ratenbegrenzung.
https://github.com/resilience4j/resilience4j#ratelimiter
Im Folgenden wird die Überprüfung anhand des folgenden Beispielprogramms durchgeführt.
https://github.com/resilience4j/resilience4j-spring-boot2-demo
Configuration build.gradle
Verwenden Sie "io.github.resilience4j: Resilience4j-spring-boot2", wenn Sie eine Verbindung mit Spring Boot herstellen.
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
Mit limitForPeriod: 3
und limitRefreshPeriod: 2s
wird die Ratenbegrenzung durchgeführt, wenn innerhalb von 2 Sekunden mehr als 3 Zugriffe vorliegen.
Java Legen Sie die @ RateLimiter-Annotation beim Festlegen der Ratenbegrenzung fest.
@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 Mit dieser Einstellung wird ein 500-Fehler zurückgegeben, wenn der Zugriff mehr als dreimal in 2 Sekunden erfolgt.
< 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"
}
Intern tritt eine RuntimeException mit dem Namen "RequestNotPermitted" auf, sodass in der Controller-Schicht eine entsprechende Fehlerbehandlung und HTTP-StatusCode-Rückgabeverarbeitung durchgeführt werden muss.
Monitoring
Mit / actuator / ratelimiters
können Sie Einstellungen für das Ratenlimit erhalten.
{
"rateLimiters" : [ "backendA", "backendB" ]
}
Conclusion
Mit Resilience4j und Resilience4j-Spring-Boot2 ist es ziemlich einfach, Ihrer vorhandenen Spring Boot-Anwendung Funktionen zur Ratenbegrenzung hinzuzufügen.
Der Unterschied zu Bucket4j besteht darin, dass die Verarbeitung von URL-Pfad und Rate-Limiting pro Benutzer standardmäßig nicht unterstützt wird.
Wenn Sie die Ratenbegrenzungsverarbeitung ernsthaft auf das gesamte System anwenden möchten, ist es vorzuziehen, die API Gateway-Middleware mithilfe des Ambassador-Musters oder des Side-Car-Musters einzuführen.
Recommended Posts