Der Zweck der Strombegrenzung besteht darin, das System zu schützen, indem die Geschwindigkeit des gleichzeitigen Zugriffs/Anforderungen oder die Geschwindigkeit der Anfragen innerhalb eines Zeitfensters begrenzt wird. Sobald die Begrenzungsrate erreicht ist, kann der Service abgelehnt werden.
Vor ein paar Tagen habe ich einen Plan gelesen, Guawa zu verwenden, um eine Einschränkung des Einsatzes zu erreichen. Referenz "Redis in Aktion" auf eine Jedis-Version, die alle Einschränkungen auf Unternehmensebene sind. Häufige aktuelle begrenzende Strategien in den tatsächlichen Szenarien:
Nginx -Zugriffsschichtstromgrenze
Nach bestimmten Regeln wie Kontonummer, IP, Systemaufruflogik usw., um den Strom auf der Nginx -Ebene zu begrenzen
Business Application System Current Limit
Die Kontrolle des Verkehrs über Geschäftsordnung Dieser Verkehr kann als Semaphor bezeichnet werden, das als Sperre verstanden werden kann, was einschränken kann, wie viele Prozesse auf eine Ressource gleichzeitig zugegriffen werden können.
Code -Implementierung
import redis.clients.jedis.jedis; import redis.clients.jedis.transaction; import redis.clients.jedis.zparams; import java.util.list; "EIMER"; private statische endgültige Zeichenfolge bocket_count = "bucket_count"; private statische endgültige String -Bucket_Monitor = "bucket_monitor"; statische String AcquireTokenFrombucket (jedis jedis, int limit, langfristig) {String identifier = uUid.randomuuid (). toString (); long now = System.currentTimemillis (); Transaktionstransaktion = jedis.multi (); // semaphore transaction.zremrangebyscore (bocket_monitor.getBytes (), "-inf" .GetByTes (), String.ValueOf (jetzt - Timeout) .getByTes ()); ZPARAMS -Params = neu Zparams (); params.wilthtsByDouble (1.0,0,0); Transaktion.Zinterstore (Bucket, Parames, Bucket, Bucket_Monitor); // Counter Self-Uncrement Transaction.incr (Bucket_Count); LIST <Object> resultaces = Transaction.exec (); langer Zähler = (lang) results.get (results.size () - 1); Transaktion = jedis.multi (); Transaction.zadd (Bucket_Monitor, jetzt, Kennzeichen); Transaction.zadd (Eimer, Zähler, Kennung); Transaction.zrank (Bucket, Identifier); Ergebnisse = Transaction.exec (); // Erhalten Sie das Ranking, um festzustellen, ob die Anforderung den Semaphor -langen Rank = (long) results.get (results.size () - 1) erhalten hat; if (Rang <limit) {return identifier; } else {// kein Semaphor wurde erhalten, in Redis eingebracht, bevor Transaktion = jedis.multi (); Transaction.zrem (Bucket_Monitor, Bezeichner); Transaction.zrem (Bucket, Identifier); Transaction.exec (); } return null; }}Anruf
Testerschnittstellenanruf
@GetMapping ("/") public void Index (httpServletResponse -Antwort) löst ioException {jedis jedis = jedispool.getResource () aus; String token = Redisratelimiter.acquireTokenFrombucket (Jedis, Limit, Timeout); if (token == null) {response.sendError (500); } else {// todo Ihre Geschäftslogik} Jedispool.ReturnResource (jedis);}Optimierung
Code mit Interceptor + Annotation optimieren
Interceptor
@ConfigurationStatic Class WebMVCConFigurer erweitert webmvcconFigurerAdapter {private logger logger = loggerfactory.getLogger (webmvcconFigurer.class); @Autowired Private Jedispool Jedispool; public void addInterceptors (InterceptorRegistry Registry) {Registry.AdDInterceptor (neuer HandlerinterceptorAdapter () {public boolean prehandle (httpServletRequest Request, httpServletResponse -Reaktion, Objekthandler) Ausnahmeberechter {Handlermethethodethethod = (Handlermethethod) Handler; Handler; Ratelimiter ratelimiter = methode.getannotation (ratelimiter.class); Timeout); }}Definition Annotation
/** * @email [email protected] * @data 2017-08 * aktuelle Limitannotation */@target (elementtype.method) @retention (retentionPolicy.runtime) @DocumentedPublic @Interface Ratelimiter {int limit () default 5; int timeout () Standard 1000;}
verwenden
@Ratelimiter (limit = 2, timeout = 5000) @getMapping ("/test") public void test () {}Gleichzeitige Tests
Tools: Apache-JMeter-3.2
Hinweis: Die Schnittstelle, die das Semaphor nicht erhalten hat, gibt 500 zurück, der Status ist rot, die Schnittstelle, die das Semaphor zurückgelegt hat 200, der Status ist grün.
Wenn das Semaphor der Limit -Anforderung 2 ist, werden 5 Threads gesendet:
Wenn das Semaphor der Limit -Anforderung 5 ist, werden 10 Threads gesendet:
Material
Implementierung basierend auf Reids + Lua
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.