Die Strombegrenzung kann auf Gateway-Ebene wie Nginx, Openresty, kong, zuul, Spring Cloud Gateway usw. erfolgen; sie kann auch auf Anwendungsebene über Aop erfolgen.
Einige strombegrenzende Komponenten, einschließlich Token-Bucket-Strombegrenzung von Redisson, RateLimiter von Guava (Client-Strombegrenzung). Hystrix ist ein clientseitiger Strombegrenzer (siehe Huian Jinke Java-Interview (Teil) oder direkt auf die Sicherung Hystrix oder JavaGuide-Java Interview Guide North-High Performance: What are the common algorithms for load Balancing? ).
Strombegrenzung der Gateway-Schicht
Strombegrenzung der Gateway-Schicht: Die Strombegrenzung des Gateways basiert auf dem Redis+Lua-Skript 1 2 :
Prinzipanalyse des Redisson Distributed Current Limiter RRateLimiter
Eigenständige Strombegrenzung: Hystrix kann Thread-Pool- oder Semaphore-Strombegrenzung verwenden:
Beispiel 1: Umfassende Isolierung des Hystrix-Thread-Pools und Begrenzung des Schnittstellenstroms
Beispiel 2:
RedisHystrixCommand.java :
public class RedisHystrixCommand<T> extends HystrixCommand<T> {
private static final Logger logger = new Logger("Hystrix");
private Callable<T> callable;
private T defaultResult;
private String opName;
/**
* constructor.
*/
public RedisHystrixCommand(String keyName, Callable<T> callable, T defaultResult,
String opName) {
// default timeout=1s, fallback when 50% or 20 requests in 10 seconds fail
super(Setter
.withGroupKey(HystrixCommandGroupKey.Factory.asKey(keyName))
.andCommandKey(HystrixCommandKey.Factory.asKey(keyName))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
.withCircuitBreakerEnabled(true)));
this.callable = callable;
this.defaultResult = defaultResult;
this.opName = opName;
}
@Override
protected T run() throws Exception {
return callable.call();
}
@Override
protected T getFallback() {
logger.error("RedisCache {} fallback since executionTimeout, return {}",
opName, defaultResult);
return defaultResult;
}
}
RedisHelper.java:
public Long sadd(String key, String member) {
return new RedisHystrixCommand<>(getCommandKey(), () ->
getRedisClient().handle(redis -> redis.sadd(key, member))
.orElse(0L), 0L, "sadd").execute();
}