Hystrix
1 概念:
概述
在分布式系统下,微服务之间不可避免地会发生相互调用,但每个系统都无法百分之百保证自身运行不出问题。在服务调用中,很可能面临依赖服务失效的问题(网络延时,服务异常,负载过大无法及时响应)。因此需要一个组件,能提供强大的容错能力,为服务间调用提供保护和控制。
我们的目的:当我自身 依赖的服务不可用时,服务自身不会被拖垮。防止微服务级联异常。
图。
本质:就是隔离坏的服务,不让坏服务拖垮其他服务(调用坏服务的服务)。
比如:武汉发生疫情,隔离它,不让依赖于武汉的地方感染。
和我们课程中熔断降级更贴切一点:北京从武汉招聘大学生,武汉有疫情了,当北京去武汉请求大学生来的时候,武汉熔断,然后北京启动自身的备用逻辑:去上海找大学生(降级)。
舱壁模式
舱壁模式(Bulkhead)隔离了每个工作负载或服务的关键资源,如连接池、内存和CPU,硬盘。每个工作单元都有独立的 连接池,内存,CPU。
使用舱壁避免了单个服务消耗掉所有资源,从而导致其他服务出现故障的场景。
这种模式主要是通过防止由一个服务引起的级联故障来增加系统的弹性。
据说泰坦尼克原因:泰坦尼克号上有16个防水舱,设计可以保障如果只有4个舱进水,密闭和隔离可以阻止水继续进入下一个防水舱,从而保证船的基本浮力。
但是当时冰山从侧面划破了船体,从而导致有5个防水舱同时进水,而为了建造豪华的头等舱大厅,也就是电影里杰克和罗斯约会的地方,5号舱的顶部并未达到密闭所需要的高度,水就一层层进入了船体,隔离的失败导致了泰坦尼克的沉没。
舱壁模式
给我们的思路:可以对每个请求设置,单独的连接池,配置连接数,不要影响 别的请求。就像一个一个的防水舱。
对在公司中的管理也一样:给每个独立的 小组,分配独立的资源,比如产品,开发,测试。在小公司,大多数情况 这些资源都是共享的,有一个好处是充分利用资源,坏处是,如果一个项目延期,会影响别的项目推进。自己权衡利弊。
最近比较火的一句话: 真正的知识,是 产品提高一个等级和成本提高0.2元的 痛苦抉择。
雪崩效应
每个服务 发出一个HTTP请求都会 在 服务中 开启一个新线程。而下游服务挂了或者网络不可达,通常线程会阻塞住,直到Timeout。如果并发量多一点,这些阻塞的线程就会占用大量的资源,很有可能把自己本身这个微服务所在的机器资源耗尽,导致自己也挂掉。
如果服务提供者响应非常缓慢,那么服务消费者调用此提供者就会一直等待,直到提供者响应或超时。在高并发场景下,此种情况,如果不做任何处理,就会导致服务消费者的资源耗竭甚至整个系统的崩溃。一层一层的崩溃,导致所有的系统崩溃。
《雪崩示意图》
雪崩:由基础服务故障导致级联故障的现象。描述的是:提供者不可用 导致消费者不可用,并将不可用逐渐放大的过程。像滚雪球一样,不可用的服务越来越多。影响越来越恶劣。
雪崩三个流程:
服务提供者不可用
重试会导致网络流量加大,更影响服务提供者。
导致服务调用者不可用,由于服务调用者 一直等待返回,一直占用系统资源。
(不可用的范围 被逐步放大)
服务不可用原因:
服务器宕机
网络故障
宕机
程序异常
负载过大,导致服务提供者响应慢
缓存击穿导致服务超负荷运行
总之 : 基础服务故障 导致 级联故障 就是 雪崩。
容错机制
为网络请求设置超时。
必须为网络请求设置超时。一般的调用一般在几十毫秒内响应。如果服务不可用,或者网络有问题,那么响应时间会变很长。长到几十秒。
每一次调用,对应一个线程或进程,如果响应时间长,那么线程就长时间得不到释放,而线程对应着系统资源,包括CPU,内存,得不到释放的线程越多,资源被消耗的越多,最终导致系统崩溃。
因此必须设置超时时间,让资源尽快释放。
使用断路器模式。
想一下家里的保险丝,跳闸。如果家里有短路或者大功率电器使用,超过电路负载时,就会跳闸,如果不跳闸,电路烧毁,波及到其他家庭,导致其他家庭也不可用。通过跳闸保护电路安全,当短路问题,或者大功率问题被解决,在合闸。
自己家里电路,不影响整个小区每家每户的电路。
断路器
如果对某个微服务请求有大量超时(说明该服务不可用),再让新的请求访问该服务就没有意义,只会无谓的消耗资源。例如设置了超时时间1s,如果短时间内有大量的请求无法在1s内响应,就没有必要去请求依赖的服务了。
断路器是对容易导致错误的操作的代理。这种代理能统计一段时间内的失败次数,并依据次数决定是正常请求依赖的服务还是直接返回。
断路器可以实现快速失败,如果它在一段时间内检测到许多类似的错误(超时),就会在之后的一段时间,强迫对该服务的调用快速失败,即不再请求所调用的服务。这样对于消费者就无须再浪费CPU去等待长时间的超时。
断路器也可自动诊断依赖的服务是否恢复正常。如果发现依赖的服务已经恢复正常,那么就会恢复请求该服务。通过重置时间来决定断路器的重新闭合。
这样就实现了微服务的“自我修复”:当依赖的服务不可用时,打开断路器,让服务快速失败,从而防止雪崩。当依赖的服务恢复正常时,又恢复请求。
断路器开关时序图
1 | 第一次正常 |
断路器状态转换的逻辑:
1 | 关闭状态:正常情况下,断路器关闭,可以正常请求依赖的服务。 |
《熔断.doc》《断路器开关时序图》《状态转换》
降级
为了在整体资源不够的时候,适当放弃部分服务,将主要的资源投放到核心服务中,待渡过难关之后,再重启已关闭的服务,保证了系统核心服务的稳定。当服务停掉后,自动进入fallback替换主方法。
用fallback方法代替主方法执行并返回结果,对失败的服务进行降级。当调用服务失败次数在一段时间内超过了断路器的阈值时,断路器将打开,不再进行真正的调用,而是快速失败,直接执行fallback逻辑。服务降级保护了服务调用者的逻辑。
1 | 熔断和降级: |
19年春晚 百度 红包,凤巢的5万台机器熄火4小时,让给了红包。
Hystrix
spring cloud 用的是 hystrix,是一个容错组件。
Hystrix实现了 超时机制和断路器模式。
Hystrix是Netflix开源的一个类库,用于隔离远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。主要有以下几点功能:
- 为系统提供保护机制。在依赖的服务出现高延迟或失败时,为系统提供保护和控制。
- 防止雪崩。
- 包裹请求:使用HystrixCommand(或HystrixObservableCommand)包裹对依赖的调用逻辑,每个命令在独立线程中运行。
- 跳闸机制:当某服务失败率达到一定的阈值时,Hystrix可以自动跳闸,停止请求该服务一段时间。
- 资源隔离:Hystrix为每个请求都的依赖都维护了一个小型线程池,如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等候,从而加速失败判定。防止级联失败。
- 快速失败:Fail Fast。同时能快速恢复。侧重点是:(不去真正的请求服务,发生异常再返回),而是直接失败。
- 监控:Hystrix可以实时监控运行指标和配置的变化,提供近实时的监控、报警、运维控制。
- 回退机制:fallback,当请求失败、超时、被拒绝,或当断路器被打开时,执行回退逻辑。回退逻辑我们自定义,提供优雅的服务降级。
- 自我修复:断路器打开一段时间后,会自动进入“半开”状态,可以进行打开,关闭,半开状态的转换。前面有介绍。
2 Hystrix 使用
hystrix独立使用脱离spring cloud
代码:study-hystrix项目,HelloWorldHystrixCommand类。看着类讲解。
关注点:
继承hystrixCommand
重写run
fallback(程序发生非HystrixBadRequestException异常,运行超时,熔断开关打开,线程池/信号量满了)
熔断(熔断机制相当于电路的跳闸功能,我们可以配置熔断策略为当请求错误比例在10s内>50%时,该服务将进入熔断状态,后续请求都会进入fallback。)
结果缓存(支持将一个请求结果缓存起来,下一个具有相同key的请求将直接从缓存中取出结果,减少请求开销。)
这个例子,只是独立使用hystrix, 通过这个例子,了解 hystrix 的运行逻辑。
和restTemplate结合
在api-driver(服务消费端)中:
pom.xml
1 | <!-- 引入hystrix依赖 --> |
启动类
1 | @EnableCircuitBreaker |
调用的方法上,通过使用@HystrixCommand,将方法纳入到hystrix监控中。
1 | @HystrixCommand(fallbackMethod = "sendFail") |
sendFail,此处需要注意:此方法的 请求参数和 返回参数 要和原方法一致。
1 | private ResponseResult sendFail(SmsSendRequest smsSendRequest) { |
正常调用:启动eureka-7900,service-sms 8002,api-driver。
测试点:
- 访问sms是否正常。
- 访问yapi:api-driver下:司机获取验证码。是否正常。
- 停止service-sms。访问司机获取验证码,是否走备用逻辑。
两个注解@EnableCircuitBreaker,@EnableHystrix点进去看,其实一样。
点@EnableHystrix进去。
ps:配置:HystrixCommandProperties
写好方法封装restTemplate 请求的service。一般将HystrixCommand,写在此service。也可以扩大范围。
上面的例子中,如果不走熔断的备用方法,则,停止提供者时,会抛出500错误。
更多的配置:
点击@HystrixCommand 进去。可以看到很多配置项。
下面说一下:commandProperties。
https://github.com/Netflix/Hystrix/wiki/Configuration
打开官网,对比着看一下。
1 | 1、Execution: |
通过下面例子,说一下配置方法。大家下去可以参考上面 看需要试试。
1 | 将下面 值 写成false |
和feign结合
api-passenger
上面的pom一样。
feign自带Hystrix,但是默认没有打开,首先打开Hystrix。(从Spring Cloud Dalston开始,feign的Hystrix 默认关闭,如果要用feign,必须开启)
1 | feign: |
注解添加feignclient
1 | @FeignClient(name = "service-sms",fallback = SmsClientFallback.class) |
类,实现feignClient接口
1 | import java.util.concurrent.TimeUnit; |
启动类
1 | @EnableFeignClients |
正常调用:启动eureka-7900,service-sms 8002,api-passenger。
测试点:
访问sms是否正常。
访问yapi:api-passenger下:乘客获取验证码。是否正常。
停止service-sms。访问乘客获取验证码,是否走备用逻辑。
去掉yml中熔断改成false。 熔断是否生效。
feign:
hystrix:
enabled: false
所有(restTemplate和feign)配置默认值
HystrixCommandProperties
1 | /* --------------统计相关------------------*/ |
HystrixThreadPoolProperties
1 | /* 配置线程池大小,默认值10个 */ |
捕获熔断的异常信息
- restTemplate中:
在备用方法中 api-driver
1 | public ResponseResult sendFail(ShortMsgRequest shortMsgRequest,Throwable throwable) { |
加上一个Throwable,就Ok。
上面例子跑一便。停止服务提供者,测试结果如下:
1 | 2020-02-01 23:00:44.182 INFO [api-driver,f1100452d8b33b08,874b9cac5fe20385,true] 18088 --- [SmsController-1] c.o.t.driver.controller.SmsController : 异常信息:java.lang.IllegalStateException: No instances available for SERVICE-SMS |
不走异常,就走500方法。
- feign中:
注解
1 | @FeignClient(name = "service-sms",fallbackFactory = SmsClientFallbackFactory.class) |
factory类
1 | package com.online.taxi.passenger.fallback; |
测试点:
- 启动eureka 7900,api-driver,是否走降级方法。
- 忽略异常
有些情况下,提供者是好的,但在消费者发生业务异常时,我们不希望走熔断的备用方法。则用以下两个办法。
- 第一种方式:继承HystrixBadRequestException
1 | 自定义异常,继承HystrixBadRequestException,当发生此异常时,不走备用方法。 |
- 第二种方式:Hystrix属性配置。
1 | 配置属性: |
禁用feign客户端的hystrix
为@feignclient单独配置Feign.Builder
配置类
1 | @Configuration |
注解
1 | @FeignClient(name = "service-sms",configuration = FeignDisableHystrixConfiguration.class) |
测试点:
启动eureka,api-passenger。测试发送验证码,是否走熔断。没走是正确,报500.
hystrix command 配置
1 | @HystrixCommand(fallbackMethod = "sendFail",ignoreExceptions = {HystrixIgnoreException.class}, |
操作步骤:
- 启动eureka7900,service-sms 8002,api-driver 9002,
- 正常访问 yapi->api-driver->司机获取验证码。正常。查看开关,UP。
1 | http://localhost:9002/actuator/health |
- 关闭 service-sms 8002。
- 打开jemeter,(检查jmeter设置,api-driver设置日志为info。)设置1秒访问25次(默认10秒 20次,才开始熔断计算)。错误,熔断。查看开关.
1 | http://localhost:9002/actuator/health |
- 恢复UP。启动service-sms 8002,成功请求一次yapi中 司机发送验证码。查看开关。又变成了UP。
熔断计算:先10秒20次,再算错误次数超过阈值 50%。
小结:
- 注意上面发生的异常信息:有下面不同的2种。
1 | 异常信息:java.lang.IllegalStateException: No instances available for service-sms |
上节课开关不生效.
原因:我最后讲 熔断忽略的异常时,走了忽略的异常,不走熔断。所以开关没打开。
此次熔断触发的条件:1、走熔断处理,2、依赖服务停止。
熔断恢复:1、底层服务启动,2、成功请求一次。
课下问题:
- 两个eureka,彼此注册,为什么 连个eureka里面都有 彼此。1向2注册,2将1信息同步给1,2向1注册。
- eureka server中的url和eureka client 中的url没关系。没必要一致。
断路器开关演示
在项目中引入
1 | <dependency> |
访问健康地址:
1 | http://localhost:9002/actuator/health |
相关的配置,主要是10秒20次,失败率超过 50%。
1 | Execution相关的属性的配置: |
熔断强制配置
此处配置强制走熔断方法。。
api-driver中RestTemplateRequestServiceImpl
1 | 例子: |
测试点:启动eureka,service-sms,api-driver
访问直接熔断。
将circuitBreaker.forceOpen改成false,正常返回,(默认为false)
观察异常信息。
1
异常信息:java.lang.RuntimeException: Hystrix circuit short-circuited and is OPEN
开关例子
HelloWorldHystrixCommand2
1 | 调用次数:1 结果:熔断:fallback,name:testCircuitBreaker 开关是否打开: false |
细看日志从里面找规律
- 第10次,熔断开关才打开。之前的 异常 虽然也报错,但是开关没开。(10秒,9次)默认:10秒,20次。
- 后面有10-19次,总计5秒钟,因为我们设置程序 500毫秒执行。开关一直打开,都走的熔断。(开关打开)
- 第20次,距离第一次熔断过去了 5秒钟。断路器尝试放开一部分请求过去,正常了就关闭开关。(如果正常,开关关闭,否则,不关闭)
- 第29次,开关又打开。又到了下一个周期。
监控
在服务消费端 api-driver,配置actuator,jar
1 | <dependency> |
通过event-stream暴露出来的。hystrix的jar包已经包含了下面这个jar包。
1 | 没必要配。 |
启动 eureka 7900,api-driver 9002,service-sms 8002。
地址:
1 | api-driver |
测试点:
重新 启动eureka7900,service-sms,api-driver
api-driver方。(此时注意,如果熔断了,查看forceOpen)
- 访问http://localhost:9002/actuator/hystrix.stream。
- 不发起任何请求,观察页面。一直ping。
- 发起正常请求(发送验证码),观察页面。ping回来data。查看data。
- 关闭service-sms,访问(jemeter)。查看data。在页面中搜索:”isCircuitBreakerOpen”:true
feign和ribbon在这个点上是一样的操作。
可视化
上面的操作有点原始,刀耕火种。下面可视化。
项目:hystrix-dashboard
pom
1 | <dependency> |
启动类
1 | @EnableHystrixDashboard |
使用 重新启动eureka7900,service-sms,api-driver
访问:http://localhost:6101/hystrix
输入:上面的地址:http://localhost:9002/actuator/hystrix.stream
停止 service-sms 8002 只留 eureka 7900和api-driver 9002
再发一次25次 jmeter。
查看面板,注意面板变化。
面板说明:
github:https://github.com/Netflix-Skunkworks/hystrix-dashboard
解释:https://github.com/Netflix-Skunkworks/hystrix-dashboard/wiki
《熔断》
无需纠结它只能监控10秒的信息,因为如果出问题,会一直报问题。
集中可视化
上面的方法只能监控一个服务。实际生产中不方便。
《Turbine原理》
下面接着改造。
创建study-hystrix-turbine
pom
1 | <dependency> |
yml
1 | turbine: |
启动类
1 | @EnableTurbine |
地址:http://localhost:6102/turbine.stream,也是一直ping,相当于原来的hystrix.stream,不过此处是综合了所有的项目。
启动hystrix-dashboard。
访问:http://localhost:6101/hystrix
填上上面的地址:http://localhost:6102/turbine.stream
此时注意测试api-driver,api-passenger两个服务。在《熔断中有效果》
停一下service-sms,看界面。
3 原理
了解前面一些概念:舱壁模式,命令模式(下面),雪崩,容错,断路器,降级。
熔断降级:北京去武汉招大学生的例子。
资源隔离:类似于高铁高架桥,并不是一个整体,而是一块一块的拼装的,一段路坏了,不会影响整条路。
隔离策略
概念中的舱壁模式。想一下货船上,每个货仓中间的隔离。两个好处:
- 服务提供者高延迟或异常,不会影响到整个系统的失败。
- 能够控制每个调用者的并发度。因为有独立的线程池。
两种线程隔离策略:线程池(默认)、信号量。
《Hystrix隔离策略》
@HystrixCommand注释修饰一个服务时,HystrixCommand的运行逻辑有可能是在该请求的主线程上一并执行,也有可能是单独起一个线程来执行,这取决于我们如何设置Hystrix线程的隔离策略。
execution.isolation.strategy属性就是用来设置HystrixCommand.run()执行的隔离策略的。(回忆上面讲过的配置,设置线程策略的)
两种隔离策略:线程隔离和信号量隔离,即“THREAD”和“SEMAPHORE”,系统默认为“THREAD”。
它们的含义是:
THREAD(线程隔离):使用该方式,HystrixCommand将会在单独的线程上执行,并发请求受线程池中线程数量的限制。不同服务通过使用不同线程池,彼此间将不受影响,达到隔离效果。
此种隔离方式:将调用服务线程与服务访问的执行线程分割开来,调用线程能够空出来去做其他工作,而不至于因为服务调用的执行,阻塞过长时间。
hystrix将使用独立的线程池对应每一个服务提供者,用于隔离和限制这些服务。于是某个服务提供者的高延迟或者资源受限只会发生在该服务提供者对应的线程池中。
SEMAPHORE(信号量隔离):其实就是个计数器,使用该方式,HystrixCommand将会在调用线程上执行,通过信号量限制单个服务提供者的并发量,开销相对较小(因为不用那么多线程池),并发请求受到信号量个数的限制。 线程隔离会带来线程开销,有些场景(比如无网络请求场景)可能会因为用开销换隔离得不偿失,为此hystrix提供了信号量隔离,当服务的并发数大于信号量阈值时将进入fallback。
Hystrix中默认并且推荐使用线程隔离(THREAD),
一般来说,只有当调用负载异常高时(例如每个实例每秒调用数百次)才需要信号量隔离,因为这种场景下使用THREAD开销会比较高。信号量隔离一般仅适用于非网络调用的隔离。
正常情况下,默认为线程隔离, 保持默认即可。
取舍:
线程池和信号量都支持熔断和限流。相比线程池,信号量不需要线程切换,因此避免了不必要的开销。但是信号量不支持异步,也不支持超时,也就是说当所请求的服务不可用时,信号量会控制超过限制的请求立即返回,但是已经持有信号量的线程只能等待服务响应或从超时中返回,即可能出现长时间等待。线程池模式下,当超过指定时间未响应的服务,Hystrix会通过响应中断的方式通知线程立即结束并返回。
Hystrix实现思路
请求过来时,将请求的远程调用逻辑,封装到HystrixCommand或者HystrixObservableCommand对象(并在构造方法配置请求被执行需要的参数)中,这些远程调用将会在独立的线程中执行。(资源隔离、命令模式)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21https://www.runoob.com/design-pattern/command-pattern.html
介绍
意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
Hystrix对访问耗时超过设置阈值的请求采用自动超时的策略。该策略对所有的命令都有效。(如果是信号量隔离方式,则此特性失效),超时的阈值可以通过命令配置进行自定义。
为每个服务提供者维护一个线程池(信号量),当线程池(信号量)被占满时,对于该服务提供者的请求将会被直接拒绝(快速失败,走回滚)而不是排队等待,减少系统等待资源。
针对请求服务提供者划分出成功、失效、超时和线程池被占满等情况。
断路器将在请求服务提供者失败次数超过一定阈值后手动或自动切断服务一段时间。
当请求服务提供者出现服务拒绝、超时和 短路(多个服务提供者依次顺序请求,前面的服务提供者请求失败,后面的请求将不再发出)等情况,执行器fallback方法,服务降级。
提供近乎实时的监控和配置变更服务。
hystrix实现流程
构建HystrixCommand或者HystrixObservableCommand对象,用于封装请求,并在构造方法配置请求被执行需要的参数。
执行命令,Hystrix提供了4种执行命令的方法。
检查是否有相同命令执行的缓存,若启用了缓存,且缓存可用,直接使用缓存响应请求。Hystrix支持请求缓存,但需要用户自定义启动。
检查断路器是否打开,如果打开走 第8步。
检查线程池或者信号量是否被消耗完,如果已满,走第8步。
调用HystrixCommand的run 或者 HystrixObservableCommand的construct 执行被封装的调用逻辑,如果执行失败或超时,走第8步。
计算链路的健康情况
在命令执行失败时获取fallback逻辑。
返回响应。
《断路器整体流程》
4 源码
debug时,注意上面类名的变化。
包裹请求
@HystrixCommand,用此注解来包装需要保护的远程调用方法。
1 | public @interface HystrixCommand { |
上面的配置,我们大部分情况仅需要关注fallbackMethod,看注释中关于fallback方法的说明,如果需要对线程池和和命令有特殊要求,可进行额外配置,其实99%不需要配置。
HystrixCommandAspect切面
被注解@HystrixCommand修饰的方法,会被HystrixCommand包装执行,通过切面来实现。
1 | com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect |
MetaHolder 持有用于构建HystrixCommand和与被包装方法相关的必要信息,如被注解的方法,失败回滚执行的方法等
1 | com.netflix.hystrix.contrib.javanica.command.MetaHolder |
创建HystrixCommand方法如下
1 | com.netflix.hystrix.contrib.javanica.command.HystrixCommandFactory |
ExecutionType
1 | /** |
debug到:
1 | HystrixCommandAspect类中。 |
命令模式在此的应用
1 | HystrixInvokable是被HystrixCommand标记的接口,继承了它的类,都是可以被执行的HystrixCommand。提供具体方法的为HystrixExecutable。 |
主要的2个类
1 | public abstract class HystrixCommand<R> extends AbstractCommand<R> |
queue和execute
1 | public abstract class HystrixCommand<R> extends AbstractCommand<R>的下面的方法, |
断路器
1 | 断路器核心接口: |
统计命令
1 | com.netflix.hystrix.HystrixMetrics |
失败回滚
1 | AbstractCommand的方法executeCommandAndObserve的局部变量:handleFallback(final Func1<Throwable, Observable<R>> handleFallback) |