Heim  >  Artikel  >  Java  >  Wie verwendet SpringBoot RateLimiter, um den Strom durch AOP zu begrenzen?

Wie verwendet SpringBoot RateLimiter, um den Strom durch AOP zu begrenzen?

PHPz
PHPznach vorne
2023-05-10 23:46:201700Durchsuche

Verwenden Sie RateLimiter, um den Strom durch AOP zu begrenzen

2. Benutzerdefinierte Annotationen

<!-- guava 限流 -->
<dependency>
     <groupId>com.google.guava</groupId>
     <artifactId>guava</artifactId>
     <version>25.1-jre</version>
</dependency>

3 des aktuellen Grenzwertalgorithmus

Token Bucket und Leaky Bucket

Die Implementierung des Leaky-Bucket-Algorithmus basiert häufig auf der Warteschlange. Wenn die Anforderung eintrifft und die Warteschlange nicht voll ist, wird sie direkt in die Warteschlange gestellt und dann von einem Prozessor entfernt die Anfrage vom Kopf der Warteschlange in einer festen Häufigkeit zur Verarbeitung. Wenn das Anfragevolumen groß ist, ist die Warteschlange voll und neue Anfragen werden verworfen.

Der Token-Bucket-Algorithmus ist ein Bucket, der Token mit einer festen Kapazität speichert, und Token werden dem Bucket mit einer festen Rate hinzugefügt. Es gibt eine Höchstgrenze für die Anzahl der im Bucket gespeicherten Token. Bei Überschreitung werden diese verworfen oder abgelehnt. Wenn Verkehrs- oder Netzwerkanforderungen eingehen, muss jede Anforderung ein Token erhalten. Wenn es erhalten werden kann, wird es direkt verarbeitet und ein Token wird aus dem Token-Bucket gelöscht. Wenn es nicht abgerufen werden kann, wird die Anfrage durchflussbegrenzt und entweder direkt verworfen oder im Puffer gewartet.

  • Vergleich zwischen Token-Bucket und Leaky-Bucket
  • Token-Bucket fügt dem Bucket mit einer festen Rate Token hinzu. Ob die Anfrage verarbeitet wird, hängt davon ab, ob sich genügend Token im Bucket befinden wird auf Null reduziert; neue Anfragen werden mit einer konstanten festen Rate abgewiesen, und die Anzahl der eingehenden Anfragen ist willkürlich

Token Der Bucket begrenzt die durchschnittliche Zuflussrate und ermöglicht die Verarbeitung von Burst-Anfragen, die solange verarbeitet werden können, wie Token vorhanden sind. Er unterstützt die Aufnahme von 3 Token oder 4 Tokens gleichzeitig und begrenzt die konstante Abflussrate , die Abflussrate ist eine feste Konstante, zum Beispiel fließen alle mit einer Rate von 1, statt einmal 1 und beim nächsten Mal 2, wodurch die Burst-Zuflussrate geglättet wird Burst, während der Hauptzweck von Leaky Bucket darin besteht, die Abflussrate zu glätten;

@Target({ElementType.PARAMETER, ElementType.METHOD})    
@Retention(RetentionPolicy.RUNTIME)    
@Documented    
public  @interface ServiceLimit { 
     String description()  default "";
}
  • 1 http:// localhost:8080/user/

    Wenn keine Ergebnisklasse vorhanden ist, können Sie nach Belieben eine Zeichenfolge zurückgeben
  • 4. Testergebnisse

  • Andere

Erstellen

RateLimiter bietet zwei Factory-Methoden: Eine davon ist die sanfte Burst-Strombegrenzung

@Component
@Scope
@Aspect
public class LimitAspect {
    每秒只发出5个令牌,此处是单进程服务的限流,内部采用令牌捅算法实现
    private static   RateLimiter rateLimiter = RateLimiter.create(5.0);
    
    //Service层切点  限流
    @Pointcut("@annotation(com.itstyle.seckill.common.aop.ServiceLimit)")  
    public void ServiceAspect() {
        
    }
    
    @Around("ServiceAspect()")
    public  Object around(ProceedingJoinPoint joinPoint) { 
        Boolean flag = rateLimiter.tryAcquire();
        Object obj = null;
        try {
            if(flag){
                obj = joinPoint.proceed();
            }
        } catch (Throwable e) {
            e.printStackTrace();
        } 
        return obj;
    } 
}

Es ​​ist eine sanfte Vorheizung und Strombegrenzung

@Override
@ServiceLimit
@Transactional
    public Result startSeckil(long seckillId,long userId) {
        //todo 操作
    }

Nachteile

RateLimiter kann nur zum Begrenzen des Stroms einer einzelnen Maschine verwendet werden. Wenn Sie den Strom eines Clusters begrenzen möchten, Sie müssen Redis oder Alibabas Open-Source-Sentinel-Middleware einführen.

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.1-jre</version>
    <optional>true</optional>
</dependency>

Das obige ist der detaillierte Inhalt vonWie verwendet SpringBoot RateLimiter, um den Strom durch AOP zu begrenzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen