首先在插件管理中开启插件配置.

然后再配置需要加入限流的信息.

然后我们再请求的话如果有其他情况就会出现以下信息

好下面我们看下限流插件方法的执行
@Override
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
//获取请求信息
final SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);
assert soulContext != null;
//获取限流的信息
final HystrixHandle hystrixHandle = GsonUtils.getInstance().fromJson(rule.getHandle(), HystrixHandle.class);
if (StringUtils.isBlank(hystrixHandle.getGroupKey())) {
hystrixHandle.setGroupKey(Objects.requireNonNull(soulContext).getModule());
}
if (StringUtils.isBlank(hystrixHandle.getCommandKey())) {
hystrixHandle.setCommandKey(Objects.requireNonNull(soulContext).getMethod());
}
//限流的方式(信号量和线程)
Command command = fetchCommand(hystrixHandle, exchange, chain);
return Mono.create(s -> {
Subscription sub = command.fetchObservable().subscribe(s::success,
s::error, s::success);
s.onCancel(sub::unsubscribe);
if (command.isCircuitBreakerOpen()) {
log.error("hystrix execute have circuitBreaker is Open! groupKey:{},commandKey:{}", hystrixHandle.getGroupKey(), hystrixHandle.getCommandKey());
}
}).doOnError(throwable -> {
log.error("hystrix execute exception:", throwable);
exchange.getAttributes().put(Constants.CLIENT_RESPONSE_RESULT_TYPE, ResultEnum.ERROR.getName());
chain.execute(exchange);
}).then();
}
我们分别看下2个方法.
HystrixCommand 和 HystrixCommandOnThread
public class HystrixCommand extends HystrixObservableCommand<Void> implements Command {
private final ServerWebExchange exchange;
private final SoulPluginChain chain;
private final URI callBackUri;
/**
* Instantiates a new Http command.
*
* @param setter the setter
* @param exchange the exchange
* @param chain the chain
* @param callBackUri the call back uri
*/
public HystrixCommand(final Setter setter,
final ServerWebExchange exchange,
final SoulPluginChain chain,
final String callBackUri) {
super(setter);
this.exchange = exchange;
this.chain = chain;
this.callBackUri = UriUtils.createUri(callBackUri);
}
@Override
protected Observable<Void> construct() {
return RxReactiveStreams.toObservable(chain.execute(exchange));
}
@Override
protected Observable<Void> resumeWithFallback() {
return RxReactiveStreams.toObservable(doFallback());
}
private Mono<Void> doFallback() {
if (isFailedExecution()) {
log.error("hystrix execute have error: ", getExecutionException());
}
final Throwable exception = getExecutionException();
return doFallback(exchange, exception);
}
@Override
public Observable<Void> fetchObservable() {
return this.toObservable();
}
@Override
public URI getCallBackUri() {
return callBackUri;
}
}
@Slf4j
public class HystrixCommandOnThread extends HystrixCommand<Mono<Void>> implements Command {
private final ServerWebExchange exchange;
private final SoulPluginChain chain;
private final URI callBackUri;
/**
* Instantiates a new Http command.
*
* @param setter the setter
* @param exchange the exchange
* @param chain the chain
* @param callBackUri the call back uri
*/
public HystrixCommandOnThread(final HystrixCommand.Setter setter,
final ServerWebExchange exchange,
final SoulPluginChain chain,
final String callBackUri) {
super(setter);
this.exchange = exchange;
this.chain = chain;
this.callBackUri = UriUtils.createUri(callBackUri);
}
@Override
protected Mono<Void> run() {
RxReactiveStreams.toObservable(chain.execute(exchange)).toBlocking().subscribe();
return Mono.empty();
}
@Override
protected Mono<Void> getFallback() {
if (isFailedExecution()) {
log.error("hystrix execute have error: ", getExecutionException());
}
final Throwable exception = getExecutionException();
return doFallback(exchange, exception);
}
@Override
public Observable<Void> fetchObservable() {
return RxReactiveStreams.toObservable(this.execute());
}
@Override
public URI getCallBackUri() {
return callBackUri;
}
}
该博客介绍了如何在系统中配置并使用Hystrix进行流量限流和熔断操作。首先在插件管理中启用插件配置,然后设置限流规则。当请求触发限流时,会执行HystrixCommand和HystrixCommandOnThread的相关方法,这两个类实现了Hystrix的命令模式,用于处理限流和熔断。在执行过程中,如果熔断器打开,会记录错误日志并执行回退逻辑。
620

被折叠的 条评论
为什么被折叠?



