Hystrix 简介

  • Hystrix 的中文含义是豪猪科动物,如下图所示, 因其背上长满了刺,而拥有自我保护能力.
  • Netflix的 Hystrix 是一个帮助解决分布式系统交互时超时处理和容错的类库, 它同样拥有保护系统的能力.
  • Hystrix是一个库,通过添加延迟容差和容错逻辑来帮助你控制这些分布式服务
    之间的交互,停止其间的级联故障以及提供回退选项,从而提供系统的整体弹性。
  • Hystrix执行的操作:
    • 1:对通过第三方客户端库访问(通常通过网络)的依赖关系提供保护并控制延迟和故障。
    • 2:隔离复杂分布式系统中的级联故障。
    • 3:快速发现故障,尽快恢复。
    • 4:回退,尽可能优雅地降级。
    • 5:启用近实时监控,警报和操作控制。
Hystrix熔断隔离流程

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

    • 使用一个线程池来存储当前的请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。
    • 这种方式需要为每个依赖的服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)
  • 信号量隔离模式

    • 使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。
    • 这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)
  • 区别

    • 线程池隔离 信号量隔离
      线程 与调用线程非相同线程 与调用线程为相同线程(jetty线程)
      开销 排队、调度、上下文开销等 无线程切换,开销低
      异步 支持 不支持
      并发支持 支持(最大线程池大小) 支持(最大信号量上限)
  • 选用时机

    • Hystrix默认使用线程池隔离
    • 如果不涉及远程RPC调用(没用网络开销),比如访问内存缓存,则使用信号量来隔离,更为轻量,开销更小。
  • 线程池隔离:线程池核心配置

    • 参数 解释
      coreSize 核心线程数,maxSize
      keepAliveTime 空闲线程保存时间
      maxQueueSize 最大队列大小,如果-1则会使用交换队列
      queueSizeRejectionThreashold 当等待队列多大的时候,将会执行决策
      timeoutlnMiliseconds 执行线程的超时时间

Hystrix 配置

配置分类
  • Hystrix可以配置属性的一下类型:

    • Execution:控制HystrixCommand.run() 的如何执行
    • Fallback: 控制HystrixCommand.getFallback() 如何执行
    • Circuit Breaker: 控制断路器的行为
    • Metrics: 捕获和HystrixCommand 和 HystrixObservableCommand 执行信息相关的配置属性
    • Request Context:设置请求上下文的属性
    • Collapser Properties:设置请求合并的属性
    • Thread Pool Properties:设置线程池的属性
Hystrix参数的覆盖优先级
  • 优先级覆盖顺序:

    • 1、内置全局默认值:写死在代码里的值
    • 2、动态全局默认属性:通过属性文件配置全局的值
    • 3、内置实例默认值:写死在代码里的实例的值
    • 4、动态配置实例属性:通过属性文件配置特定实例的值
配置详解
  • @HystrixCommand注解

    • Hystrix支持两种方式定义HystrixCommand,一种是将类继承自HystrixCommand类,重写run方法。
    • 另一种是在方法头上写注解的方式。
    • 使用注解的方式代码会比较清晰,将Hystrix代码和业务代码隔离开
        // 设置所有实例的默认值hystrix.command.default.*=...// 设置实例HystrixCommandKey的此属性值hystrix.command.HystrixCommandKey.*=...
  • execution.isolation.strategy 隔离策略

    • 表示隔离策略,隔离策略有两种,一种为线程隔离一种为信号量隔离,
    •   @HystrixCommand(fallbackMethod = "error", commandProperties = {//THREAD 线程隔离//SEMAPHORE 信号量隔离@HystrixProperty(name="execution.isolation.strategy", value = "THREAD")})
      
    • 默认是线程池隔离
  • execution.isolation.thread.timeoutInMilliseconds 请求线程总超时时间

    • 表示请求线程总超时时间,如果超过这个设置的时间hystrix就会调用fallback方法。
    •   @HystrixCommand(fallbackMethod = "error", commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "4000")})
      
    • value的参数为毫秒,默认值为1000ms。
  • execution.timeout.enabled 超时开关

    • 表示:当超时后是否触发fallback方法,默认为true。
  • execution.isolation.semaphore.maxConcurrentRequests 最大的并发请求量

    • 当隔离策略使用SEMAPHORE时,最大的并发请求量,如果请求超过这个最大值将拒绝后续的请求.
    • 默认值为10.
  • fallback.enabled 服务降级策略是否启用

    • 该属性用来设置服务降级策略是否启用,默认值 true ;
    • 如果设置为false,当请求失败或拒绝发生时,将不会调用 HystrixCommand.getFallback() 来执行服务降级逻辑
  • equestCache.enabled 是否开启请求缓存功能

    • 默认是:true
  • requestLog.enabled 表示是否开启日志,打印执行HystrixCommand的情况和事件

    • 默认是:true
  • hystrix.threadpool.default.coreSize 设置线程池的core的大小

    • 默认是:10
  • hystrix.threadpool.default.maximumSize 设置最大的线程池的大小

    • 只有设置allowMaximumSizeToDivergeFromCoreSize时,此值才起作用
    • 默认是:10
  • hystrix.threadpool.default.maxQueueSize 设置最大的BlockingQueue队列的值。

    • 如果设置-1,则使用SynchronousQueue队列,
    • 如果设置正数,则使用LinkedBlockingQueue队列
    • 默认是:-1
  • hystrix.threadpool.default.queueSizeRejectionThreshold

    • 因为maxQueueSize值不能被动态修改,所有通过设置此值可以实现动态修改等待队列长度。即等待的队列的数量大于queueSizeRejectionThreshold时(但是没有达到maxQueueSize值),则开始拒绝后续的请求进入队列。
    • 如果设置为-1,则属性不起作用
    • 默认是:5
  • hystrix.threadpool.default.keepAliveTimeMinutes 设置线程多久没有服务后,需要释放(maximumSize-coreSize )个线程

    • 默认是:1

SpringCloud 学习笔记系列03--Hystrix熔断器相关推荐

  1. springCloud学习笔记系列(1)-负载均衡Ribbon

    2019独角兽企业重金招聘Python工程师标准>>> Ribbon是一个客户端IPC库,在云中经过实战测试.它提供以下功能 负载均衡 容错 异步和反应模型中的多协议(HTTP,TC ...

  2. 网易云课堂Java进阶学习笔记系列03 -- 第7周 抽象与接口

    第七周 抽象与接口 在第一周就有一个Shape类的例子.这个类有很多的子类,每个子类也都实现了父类的方法.实际上父类Shape只是一个抽象的概念而并没有实际的意义. 举例案例理解 如果请你画一个圆,你 ...

  3. SpringCloud学习笔记(1)- Spring Cloud Alibaba

    文章目录 SpringCloud学习笔记(1)- Spring Cloud Alibaba 服务治理 Nacos 服务注册 Nacos 服务发现与调用 Ribbon 负载均衡 Sentinel 服务限 ...

  4. SpringCloud学习笔记(1)- Spring Cloud Netflix

    文章目录 SpringCloud学习笔记(1)- Spring Cloud Netflix 单体应用存在的问题 Spring Cloud Eureka Eureka Server代码实现 Eureka ...

  5. 分布式系统服务注册与发现原理 SpringCloud 学习笔记

    分布式系统服务注册与发现原理 & SpringCloud 学习笔记 分布式系统服务注册与发现原理 引入服务注册与发现组件的原因 单体架构 应用与数据分离 集群部署 微服务架构 架构演进总结 服 ...

  6. LearnOpenGL学习笔记—入门03:Hello Triangle

    LearnOpenGL学习笔记-入门03:Hello Triangle 0 前言 1 图形渲染管线 2 顶点输入 3 VAO,VBO 3.1 VAO建立 3.2 VBO建立 4 shader 5 绘制 ...

  7. SQL Server 2008中SQL应用系列及BI学习笔记系列--目录索引 @邀月

    邀月 的数据库学习 http://www.cnblogs.com/downmoon/archive/2011/03/10/1980172.html SQL Server 2008中SQL应用系列及BI ...

  8. SQL Server 2008/2012中SQL应用系列及BI学习笔记系列--目录索引

    SQL Server 2008中的一些特性总结及BI学习笔记系列,欢迎与邀月交流. 3w@live.cn  ◆0.SQL应用系列 1.SQL Server 2008中SQL增强之一:Values新用途 ...

  9. BizTalk学习笔记系列之二:实例说明如何使用BizTalk

    BizTalk学习笔记系列之二:实例说明如何使用BizTalk --.BizTalk学习笔记系列之二<?XML:NAMESPACE PREFIX = O /> Aaron.Gao,2006 ...

最新文章

  1. 用C语言解“二分法求多项式单根”题
  2. c51单片机的语言,51单片机,stm32,arduino都是用什么语言进行编程的?
  3. 仿京东首页上侧导航左侧地址栏布局(1)
  4. 用友二次开发 用友控件 Js宿主脚本 调用用友T6 登录 参照 控件示例
  5. java语言的技术可行性_可行性分析的主要内容( )。
  6. RabbitMQ中queueBind和exchangeBind方法
  7. opengl矩阵变换与平移缩放旋转
  8. SqlServer获取数据表字段自定义编号
  9. 《Java就业培训教程》_张孝祥_书内源码_11
  10. Linux下软件管理方式
  11. 计算机论文价值观,[转载]我的人生价值观--思修论文
  12. WPF - 善用路由事件
  13. JAVA标准系列(JSRnbsp;208:nbsp;Javanbsp;Busi…
  14. 薛之谦明星人物介绍html源码 html期末大作业 课程设计
  15. BASH文件操作备忘
  16. 张一鸣怎样跳出“增长的痛苦”?
  17. android wifi布局,Android使用 WiFi 建立 P2P 连接
  18. 下列关于python函数参数说法错误的是_以下关于函数说法错误的是
  19. MacBook 整个配置过程,供新入手MacBook的同学
  20. 搭建FTP服务器(二):虚拟目录的设置

热门文章

  1. Java 基础学习之类集框架 十 (SortedMap 接口)
  2. 网投简历应该注意些什么
  3. 两位数合并成一个四位数
  4. java atlas mysql_jdbc连接atlas报错
  5. dB 、dBSPL、dBFS、dBTP
  6. 瓷砖铺贴方法_5种常见的瓷砖铺贴及施工方法
  7. 瓷砖铺贴方法_正确的瓷砖铺贴步骤!(全图标示)
  8. python中ord函数
  9. 前端HTML调用jQuery库,属性操作:更换图片、添加字体样式(前端:HTML搭配jQuery系列教程六)
  10. 【口才】谈判说服技巧及策略