Heim >Java >javaLernprogramm >Wie verwendet SpringBoot RateLimiter, um den Strom durch AOP zu begrenzen?
<!-- guava 限流 --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>25.1-jre</version> </dependency>
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.
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 ""; }
4. Testergebnisse
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 操作
}
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!