Spring Cloud Hystrix 断路器

本篇文章为Spring Cloud 各模块演示代码的分支[Hystrix]部分。
先从几个概念开始,了解概念有助于对Hystrix的理解。

熔断、降级、限流的概念

  • 雪崩效应
    分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为了应对服务雪崩, 一种常见的做法是手动服务降级.

    • 定义
      雪崩效应:服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程
      下图从上到下看,可以发现随着A不可用,慢慢的B服务还有CD服务都不可用了。

      雪崩效应

    • 雪崩效应形成的原因
      我把服务雪崩的参与者简化为 服务提供者 和 服务调用者, 并将服务雪崩产生的过程分为以下三个阶段来分析形成的原因:
      1.服务提供者不可用
      2.重试加大流量
      3.服务调用者不可用

    1. 服务提供者不可用原因
      服务雪崩的每个阶段都可能由不同的原因造成, 比如造成 服务不可用的原因有:
      硬件故障: 硬件故障可能为硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问.
      程序Bug
      缓存击穿: 缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用.
      用户大量请求: 在秒杀和大促开始前,如果准备不充分,用户发起大量请求也会造成服务提供者的不可用.

    2. 重试加大流量
      用户重试:在服务提供者不可用后, 用户由于忍受不了界面上长时间的等待,而不断刷新页面甚至提交表单.
      代码逻辑重试:服务调用端的会存在大量服务异常后的重试逻辑.

    3. 服务调用者不可用
      当服务调用者使用 同步调用 时, 会产生大量的等待线程占用系统资源. 一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了.

  • 应对策略
    熔断:通过 超时机制使得不可用服务的调用快速失败
    限流:网关限流、用户交互限流、关闭重试、接口限流。在JAVA中实现接口限流可以用guava的RateLimiter,它实现了令牌桶算法和漏桶算法。
    降级:调用服务线程池隔离、依赖服务分类(终止弱依赖服务)
    服务自动扩容

以上概念部分摘自 http://kaimingwan.com/post/jia-gou/shi-yong-hystrixwan-cheng-rong-duan-xian-liu-he-jiang-ji

Hystrix 代码示例

  • 断路器demo
    1. 启动注册中心 eureka-a
    2.启动服务端 spring-cloud-03-hystrix-client
    3.启动客户端 spring-cloud-03-hystrix-request-a
    请求超时触发http://localhost:6001/hystrix-hello
    返回:----------执行降级策略------------
      /**
       * 配置的断路时间为2秒,但是调用的服务睡眠了3秒。进入降级策略
       * @return
       */
      @HystrixCommand(fallbackMethod = "callHelloFailback")
      public String callHello() {
          return restTemplate.getForObject("http://client-service/hello", String.class);
      }
      
      public String callHelloFailback(){
          System.err.println("----------执行降级策略------------");
          return "----------执行降级策略------------";
      }
    
    异常捕捉触发: http://localhost:6001/hystrix-handler
    返回: 获取异常信息并可以做具体的降级处理
    /**
     * 异常捕获方式的断路器
     */
    @HystrixCommand(fallbackMethod = "handlerFailback",  ignoreExceptions = {BadRequestException.class})
    public String handler() {
        throw new RuntimeException("运行时异常...");
    }
    
    /**
     * 异常信息可传递到fallback方法中
     */
    public String handlerFailback(Throwable e){
        System.err.println("异常信息: " + e.getMessage());
        return "获取异常信息并可以做具体的降级处理";
    }
    
    单独API配置
      /**
       * 对单独API 配置断路由规则,不受配置文件中的配置参数影响
       * 如下,配置8秒读取超时,配置文件中的2秒将失效
       * 更多commandProperties信息:https://github.com/Netflix/Hystrix/wiki/Configuration 
       */
      @HystrixCommand(
              commandKey = "hiKey",
              commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", /*KEY*/ value = "8000" /*VALUE*/)},
              fallbackMethod = "callHiFailback")
      public String callhi() {
                  System.err.println("--客户端调用-----");
          return restTemplate.getForObject("http://client-service/hi", String.class);
      }
      
      public String callHiFailback(){
          System.err.println("----------执行降级策略------------");
          return "----------执行降级策略------------";
      }
    

Hystrix DashBoard 服务压力查看器

1.在以上的Demo启动的基础上,启动 spring-cloud-03-hystrix-dashboard
2.访问 http://localhost:5001/hystrix

DashBoard

3.点击进入后可查看所有的请求情况
监控界面

Hystrix Turbine 集群服务压力查看器

1.在以上的基础上启动 spring-cloud-03-hystrix-request-b 和 集群收集模块turbine spring-cloud-03-hystrix-turbine
这时在dashboard中填入的地址为http://localhost:3000/turbine.stream
点击监控。分别请求 spring-cloud-03-hystrix-request-aspring-cloud-03-hystrix-request-b 的API之后。会发现在监控平台上的Hosts变为了2.两个客户端的请求都能被监控了。


END

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