[JAVA] Ratenbegrenzung mit RateLimiter of Resilience4j

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.

Normale Zeit (200)

< 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

Bei Ratenbegrenzung (500)

< 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

Ratenbegrenzung mit RateLimiter of Resilience4j
Ratenbegrenzung mit Guavas RateLimiter
Beispiel für die Verwendung von vue.config.js
Zusammenfassung der Verwendung von FragmentArgs
Zusammenfassung der Verwendung von DBFlow
Beispiel für Parameter mit where
Zusammenfassung der Verwendung von ButterKnife
Beispiel für die Verwendung einer abstrakten Klasse
Aufzählung von Kombinationsmustern mit List
Entwicklung von Flink mit der DataStream-API
Validierung von Protokollnachrichten mit mockito
Umgang mit Zeitzonen mit Java
Erfassung von Standortinformationen mit FusedLocationProviderClient
[Kotlin] Ein Beispiel für die Verarbeitung mit Enum
Zusammenfassung der objektorientierten Programmierung mit Java
Ich habe versucht, Google HttpClient von Java zu verwenden