zoukankan      html  css  js  c++  java
  • hystrix学习

     

    概述:

    字面意思是豪猪。作用是保护你的应用。Netflix会有服务实时调用,hystrix提供服务降级。

    目标是将依赖独立化,防止拖垮整个服务。(属于降级服务。)

    作用:

    第三方接口超时或失败时,保护服务。

    防止系统链式雪崩。

    快速失败与恢复,优雅降级。

    提供近实时监控,报警。

    工作原理:

    将外部依赖封装到HystrixCommand或HystrixObervableCommand中。工作时需要继承此类。

    每个依赖有独立线程池,线程池满则拒绝请求。

    调用失败时指定fallback方式。

    服务熔断机制。

    指定独立的超时(建议高于tp99.5)。

    可视化结果。

    降级与熔断:

    大致上说,降级是指单次访问,失败会做降级。

    熔断是一段时间的状况,需要足够大的访问量去激活。

    使用方式:

    调用服务方继承HystrixCommand类,需要实现fallback后执行的函数getfallback。fallback逻辑中,禁止进行网络调用,一般返回默认值。

    效果展示:

    大量超时(熔断)时,大部分请求将不再尝试被依赖方,返回默认值,会有一两个请求被放过去试图访问,有问题就继续熔断,一两个请求没问题则会逐步恢复正常服务。

    大量异常(熔断)时,与上述情况类似。

    在Hystrix配置(如超时熔断的时间上限)更改后,需要重启服务进程。(不支持热修改)

      

     整体流程:

    流程说明:
    1:每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中.
    2:执行execute()/queue做同步或异步调用.
    3:判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤8,进行降级策略,如果关闭进入步骤.
    4:判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8,否则继续后续步骤.
    5:调用HystrixCommand的run方法.运行依赖逻辑
    5a:依赖逻辑调用超时,进入步骤8.
    6:判断逻辑是否调用成功
    6a:返回成功调用结果
    6b:调用出错,进入步骤8.
    7:计算熔断器状态,所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态.
    8:getFallback()降级逻辑.
      以下四种情况将触发getFallback调用:
     (1):run()方法抛出非HystrixBadRequestException异常。
     (2):run()方法调用超时
     (3):熔断器开启拦截调用
     (4):线程池/队列/信号量是否跑满
    8a:没有实现getFallback的Command将直接抛出异常
    8b:fallback降级逻辑调用成功直接返回
    8c:降级逻辑调用失败抛出异常
    9:返回执行成功结果

     状态图

    断路器HystrixCircuitBreaker有三个状态,
    CLOSED关闭状态:允许流量通过。
    OPEN打开状态:不允许流量通过,即处于降级状态,走降级逻辑。
    HALF_OPEN半开状态:允许某些流量通过,并关注这些流量的结果,如果出现超时、异常等情况,将进入OPEN状态,如果成功,那么将进入CLOSED状态。

    ref: 

    https://github.com/Netflix/Hystrix

    https://github.com/Netflix/Hystrix/wiki/How-To-Use

    https://github.com/Netflix/Hystrix/wiki/How-it-Works

     https://www.jianshu.com/p/b9af028efebb

    https://segmentfault.com/a/1190000005988895

    https://www.cnblogs.com/yepei/p/7169127.html

    https://blog.csdn.net/manzhizhen/article/details/80296655

    https://www.javazhiyin.com/25962.html

    https://segmentfault.com/a/1190000005988895

    https://github.com/hehuilei/advanced-java/blob/master/docs/high-availability/hystrix-introduction.md

  • 相关阅读:
    git merge远程合并
    开发中必知必会的常用Linux命令
    mysql双机双向热备
    入门级实操教程!从概念到部署,全方位了解K8S Ingress!
    linux常用命令,你应该了解的Linux知识
    MFC的静态库.lib、动态库.dll(包含引入库.lib)以及Unicode库示例
    Java 表达式之谜:为什么 index 增加了两次?
    Vavr Option:Java Optional 的另一个选项
    一文详解 Java 的八大基本类型!
    如何找到真正的 public 方法
  • 原文地址:https://www.cnblogs.com/huilei/p/10040184.html
Copyright © 2011-2022 走看看