soul从入门到放弃11--浅入浅出Hystrix插件

一、前戏

Hystrix插件式对netflix.hystrix的一次封装,简单介绍下Hystrix

  • 在2018年11月20日netflix已经停止了对其维护(soul内目前版本1.5.12)
  • 目前市面大多数spring cloud项目,熔断与降级组件使用的依旧是Hystrix
  • 主要包括命令执行(execution)配置、命令降级(fallback)配置、熔断器(circuit breaker)配置、度量统计(metrics)配置和请求上下文配置。
  • 具有信号量模式与线程池模式

科普贴:https://www.jianshu.com/p/dc0410558fc9

https://cloud.tencent.com/developer/article/1650056

二、soul-admin配置

  • 开启插件

运行Soul-admin,进入管理界面:系统管理 --> 插件管理 --> Hystrix ,点击编辑,把它开启

配置选择器选择器参照divide的匹配方式,让符合条件的http的请求,能被捕获到

image.png
  • 配置规则

以下配置只是为了更容易出现测试效果,生产环境请勿模仿

image.png

失败降级URL在后面的测试中,测试失败,应该是根据请求格式有关。

个别配置项解释:

  • 命令key:

HystrixCommandKey是Hystrix命令的唯一标识,准确来说是HystrixCommand实例或者HystrixObservableCommand实例的唯一标识。一般设置为具体的 路径接口

  • 分组key:

HystrixCommandGroupKey是用于对Hystrix命令进行分组,分组之后便于统计展示于仪表盘、上传报告和预警等等,也就是说,HystrixCommandGroupKey是Hystrix内部进行度量统计时候的分组标识,数据上报和统计的最小维度就是分组的KEY。 一般设置为:contextPath

三、soul-Bootstrap

网关层需要引入依赖即可

<!-- soul hystrix plugin start-->
  <dependency>
      <groupId>org.dromara</groupId>
      <artifactId>soul-spring-boot-starter-plugin-hystrix</artifactId>
       <version>${last.version}</version>
  </dependency>
  <!-- soul hystrix plugin end-->

四、测试

  • 测试用例来一发

触发降级的两个条件:满足最大/最小并发量,或者达到异常比例。

所以使用wrk压一下,让流量先上到阈值,便于触发

wrk -t4 -c32 -d10s http://localhost:9195/http/test/findByUserId?userId=2

启动测试一下::http://localhost:9195/http/test/findByUserId?userId=2

熔断的返回值如下,fallback依旧是没有成功,可能跟格式有关系

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

五、源码分析

插件链的调用此处不再分析,请参考之前文章,直奔主题HystrixPlugin##doExecute

@Override
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
    // some code  .....
    // 将admin配置的rule实例化,json反序列化创建HystrixHandle对象,用于初始化Command
    final HystrixHandle hystrixHandle = GsonUtils.getInstance().fromJson(rule.getHandle(), HystrixHandle.class);
    // some code  .....
    // 创建HystrixCommand
    Command command = fetchCommand(hystrixHandle, exchange, chain);
    return Mono.create(s -> {
    // 注册完整执行生命周期事件 :onCompleted、onError、onNext处理方式
        Subscription sub = command.fetchObservable().subscribe(s::success,
                s::error, s::success);
        s.onCancel(sub::unsubscribe);
        // 请求经过command洗礼后,判断是否当前已经进入熔断状态
        if (command.isCircuitBreakerOpen()) {
            log.error("hystrix execute have circuitBreaker is Open! groupKey:{},commandKey:{}", hystrixHandle.getGroupKey(), hystrixHandle.getCommandKey());
        }
    }).doOnError(throwable -> {
        // 通过调试,doExecute执行异常,比如timeout才会执行此处
        log.error("hystrix execute exception:", throwable);
        exchange.getAttributes().put(Constants.CLIENT_RESPONSE_RESULT_TYPE, ResultEnum.ERROR.getName());
        chain.execute(exchange);
    }).then();
}
image.png

onCompleted:onNext/onError完成之后最后回调

onError:当产生异常时回调

onNext:获取结果后回调

在fetchCommand方法,用于生成是信号量模式还是线程池模式的Command

image.png

HystrixHandle中给了ExecutionIsolationStrategy默认信号量的默认值

image.png

六、小结

  • 日拱一卒
  • 疑问:Hystrix已经停止维护了,真实项目使用此插件是否存在安全隐患?
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容