概述
【高性能网关soul学习】16. 熔断插件之Hystrix
本文目标:
- 跑通熔断插件 Hystrix
- 分析 Soul 中 hystrix 源码实现
官网地址
Hystrix 插件启动流程
-
soul-bootstrap 增加 soul-spring-boot-starter-plugin-hystrix 依赖
-
依次启动 soul-admin、http测试服务、soul-bootstrap 网关服务
-
参考选择器配置规则 进行配置
-
hystrix 的隔离模式分为两种
- semaphore
- thread配置
- 相比semaphore 多了线程池相关的三个配置项
-
通用参数:
- 跳闸最小请求数量 :最小的请求量,至少要达到这个量才会触发熔断
- 错误百分比阀值 : 这段时间内,发生异常的百分比。
- 最大并发量 : 最大的并发量
- 跳闸休眠时间(ms) :熔断以后恢复的时间。
- 分组Key: 一般设置为:contextPath
- 命令Key: 一般设置为具体的 路径接口。
-
修改 跳闸最小请求数量 和错误百分阈值都为1,然后在 http测试服务中的 OrderController中的对应接口 打上断点,第一次请求超时失败之后,立马请求第二次,则会立马得到下述异常
{
"code": 500,
"message": "Internal Server Error",
"data": "/order/findById short-circuited and fallback failed."
}
源码分析
- 获取相关属性
- 获取上下文相关内容:SoulContext、HystrixHandle
- 设置默认值groupKey 和 commandKey
- 根据 HystrixHandle.getExecutionIsolationStrategy() 类型创建 HystrixCommand 或者 HystrixCommandOnThread
- command.isCircuitBreakerOpen()
- 判断是否
@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 -> {
// command 获取一个观察者,订阅后续 s的处理结果
Subscription sub = command.fetchObservable().subscribe(s::success,
s::error, s::success);
// s处理完毕之后,取消sub的订阅
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();
}
private Command fetchCommand(final HystrixHandle hystrixHandle, final ServerWebExchange exchange, final SoulPluginChain chain) {
if (hystrixHandle.getExecutionIsolationStrategy() == HystrixIsolationModeEnum.SEMAPHORE.getCode()) {
return new HystrixCommand(HystrixBuilder.build(hystrixHandle),
exchange, chain, hystrixHandle.getCallBackUri());
}
return new HystrixCommandOnThread(HystrixBuilder.buildForHystrixCommand(hystrixHandle),
exchange, chain, hystrixHandle.getCallBackUri());
}
总结
- Soul 集成熔断插件Hystrix的配置方式比较简单
- soul-Hystrix源码集成需要点RxJava的基础
最后
以上就是英勇可乐为你收集整理的【高性能网关soul学习】16. 熔断插件之Hystrix的全部内容,希望文章能够帮你解决【高性能网关soul学习】16. 熔断插件之Hystrix所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复