我是靠谱客的博主 英勇可乐,最近开发中收集的这篇文章主要介绍【高性能网关soul学习】16. 熔断插件之Hystrix,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

【高性能网关soul学习】16. 熔断插件之Hystrix

本文目标:

  1. 跑通熔断插件 Hystrix
  2. 分析 Soul 中 hystrix 源码实现

官网地址


Hystrix 插件启动流程

  • soul-bootstrap 增加 soul-spring-boot-starter-plugin-hystrix 依赖

  • 依次启动 soul-admin、http测试服务、soul-bootstrap 网关服务

  • 参考选择器配置规则 进行配置

    • hystrix 的隔离模式分为两种

      1. semaphore
      2. thread配置
        1. 相比semaphore 多了线程池相关的三个配置项
    • 通用参数:

      • 跳闸最小请求数量 :最小的请求量,至少要达到这个量才会触发熔断
      • 错误百分比阀值 : 这段时间内,发生异常的百分比。
      • 最大并发量 : 最大的并发量
      • 跳闸休眠时间(ms) :熔断以后恢复的时间。
      • 分组Key: 一般设置为:contextPath
      • 命令Key: 一般设置为具体的 路径接口。

修改 跳闸最小请求数量错误百分阈值都为1,然后在 http测试服务中的 OrderController中的对应接口 打上断点,第一次请求超时失败之后,立马请求第二次,则会立马得到下述异常

{
"code": 500,
"message": "Internal Server Error",
"data": "/order/findById short-circuited and fallback failed."
}

源码分析

  1. 获取相关属性
    1. 获取上下文相关内容:SoulContext、HystrixHandle
    2. 设置默认值groupKey 和 commandKey
  2. 根据 HystrixHandle.getExecutionIsolationStrategy() 类型创建 HystrixCommand 或者 HystrixCommandOnThread
  3. command.isCircuitBreakerOpen()
    1. 判断是否
@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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部