Spring Cloud Hystrix 源码分析01

代码结构如下

重点实现在hystrix-core 代码依赖下图所示

先看一下核心接口HystrixInvokable,是一个空接口

下面是子接口HystrixInvokableInfo,定义了一些接口方法

直接看其具体实现类HystrixObservableCommand和HystrixCommand

HystrixCommand用在依赖服务返回单个操作结果的时候:

  • execute():同步执行。从依赖的服务返回一个单一的结果对象,或是在发生错误的时候抛出异常。
  • queue():异步执行。直接返回一个Future对象,其中包含了服务执行结束时要返回的单一结果对象。

HystrixObservableCommand用在依赖服务返回多个操作结果的时候:

observe():返回Obervable对象,他代表了操作的多个结果,它是一个Hot Observable
toObservable():同样返回Observable对象,也代表了操作多个结果,但它返回的是一个Cold Observable。

 

2.2 基本用法
有两种:手动自定义command和使用注解,手动自定义这里就不介绍了。这里介绍下注解需要两步(对破析源码有用):

第一步:隐式模式(用户不需要做什么,但你要知道),spirng boot会自动加载Feign的配置类HystrixAutoConfiguration(spring-cloud-netflix-core-1.4.4.RELEASE.jar/META-INF/spring.factories)

第二步:应用系统启动类中添加@EnableHystrix,它的作用是将spring.cloud.circuit.breaker.enabled设为true。

Hystrix默认配置都在HystrixCommandProperties类中

 

HystrixCommand已具备了observe()和toObservable()的功能,和HystrixObservableCommand有和不同?

是的,但它的实现有一定的局限性,它返回的Observable只能发射一次数据,而HystrixObservableCommand实现的命令可以获取能发多次的Observable。

思考:多级降级的时候,为何将降级command单独做一个线程池?

如果主流程的command都失败了,可能线程池都已经被占满了,降级command必须用自己的独立的线程池。

3.1 构建命令
前面讲过Hystrix 提供了两个Command,可以使用这两个对象来包裹待执行的任务。 注解@HystrixCommand标记方法,Hystrix 将利用AOP自动将目标方法包装成HystrixCommand来执行,也可以继承他们来创建Command。任务委托给 Hystrix 后,Hystrix 可以应用自己的一系列保护机制,在执行用户任务的各节点(执行前、执行后、异常、超时等)做一系列的事情。

3.2 执行命令
有四种方式执行command:

R execute():同步执行,从依赖服务得到单一结果对象,实现为 queue().get()
Future queue():异步执行,返回一个 Future 以便获取执行结果,也是单一结果对象,实现为 toObservable().toBlocking().toFuture()
Observable observe():hot observable,创建Observable后会订阅Observable,可以返回多个结果
Observable toObservable():cold observable,返回一个Observable,只有订阅时才会执行,可以返回多个结果;也就是未订阅

 

3.3 检查缓存
    如果启用了 Hystrix Cache,任务执行前将先判断是否有相同命令执行的缓存。如果有则直接返回缓存的结果;如果没有缓存的结果,但启动了缓存,将缓存本次执行结果以供后续使用。

3.4 断路器是否打开
   断路器(circuit-breaker)和保险丝类似,保险丝在发生危险时将会烧断以保护电路,而断路器可以在达到我们设定的阀值时触发短路(比如请求失败率达到50%),拒绝执行任何请求。如果断路器被打开,Hystrix 将不会执行命令,直接进入Fallback处理逻辑。

3.5 检查线程池/信号量情况
    Hystrix 隔离方式有线程池隔离和信号量隔离。当使用Hystrix线程池时,Hystrix 默认为每个依赖服务分配10个线程,当10个线程都繁忙时,将拒绝执行命令。信号量同理。

3.6 执行任务
通过HystrixObservableCommand.construct()或者 HystrixCommand.run() 来运行用户真正的任务。

3.7 断路器健康检查
每次开始执行command、结束执行command以及发生异常等情况时,都会记录执行情况,例如:成功、失败、拒绝以及超时等情况,会定期处理这些数据,再根据设定的条件来判断是否开启断路器。

3.8 失败时执行 Fallback
在命令失败时执行用户指定的 Fallback 逻辑。上图中的断路、线程池拒绝、信号量拒绝、执行执行、执行超时都会进入 Fallback 处理。

3.9 返回执行结果
原始结果将以Observable形式返回,在返回给用户之前,会根据调用方式的不同做一些处理

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Cloud Hystrix是一个用于处理分布式系统的延迟和容错的库。它通过隔离服务之间的访问点,防止级联故障,并提供了一个备用方案,以便在出现故障时继续运行。Hystrix通过实现断路器模式来实现这些功能,这意味着它可以在服务之间建立一个断路器,以便在服务出现故障时自动切换到备用方案。 ### 回答2: Spring Cloud Hystrix是基于Netflix Hystrix的容错框架,为微服务提供了服务降级、服务熔断、服务限流等容错机制,以确保微服务在面临异常情况时,能够保持高可用性和稳定性。 在微服务架构中,服务之间的调用很容易受到网络波动、服务不可用、资源限制等影响,这时候如果不进行容错处理,就可能会导致整个系统崩溃。Spring Cloud Hystrix通过引入断路器的概念,可以提供一种优雅的容错处理方式。当某个服务出现故障或延迟时,断路器会立刻打开,停止对该服务的调用,降低对该服务的压力,保持系统的稳定性。 除了断路器外,Spring Cloud Hystrix还提供了线程池隔离、信号量隔离、缓存预处理等机制,以更好地保护系统。如果采用线程隔离,可以让请求在独立的线程中执行,从而防止请求的问题影响到其他请求。信号量隔离通过限制并发数,达到在负载高峰期或请求过多时,自我调节的目的。 在使用方面,Spring Cloud Hystrix也非常简单。只需在服务调用处添加@HystrixCommand注解,指定服务降级方法,就可以完成调用端的服务降级处理。对于其他Hystrix特性,也可以通过在配置文件中进行配置。 总而言之,Spring Cloud Hystrix为微服务架构提供了一种高效可靠的容错机制,可以在服务出现问题时,从容松手,保证系统的鲁棒性和扩展性。 ### 回答3: Spring Cloud Hystrix是一种开源的断路器模式实现,可用于构建分布式系统和微服务。它可以防止由于一个服务故障或超时导致整个系统崩溃。 在分布式系统中,一个服务的故障可能会导致整个系统的连锁反应。这就是为什么需要HystrixHystrix可以监视服务调用的结果,如果服务出现故障,它会强制断路器并替代其他服务并返回一个错误响应。 服务故障可能不仅仅是由于服务器故障,还包括超时,网络故障等原因。Hystrix 可以配置降级策略,当服务出现故障时,可以返回一些默认值或者备用数据,使得服务的调用方不至于完全失败。如果这些降级策略的执行时间过长,超出了阈值,那么Hystrix会自动熔断该服务,以免该服务继续产生故障影响到整个系统。 Hystrix可以同时监控多个服务,以避免整个系统受到单个服务故障的影响。如果某个服务出现问题,Hystrix会自动将该服务的请求转向其他可用的服务,以确保业务服务的高可用性。 在开发过程中,Hystrix虽然具有强大的监控能力,但同时也需要注意它会增加系统的负担,因此需要根据需求进行合理的配置。使用Hystrix需要在Spring Cloud应用中增加相应的依赖,同时在应用代码中使用@HystrixCommand注解对需要监控的服务进行定义。对服务的降级策略可以通过@Service注解中的fallback属性来定义。 总之,Hystrix提供了一种有力的方式来保证服务调用的稳定性,并确保系统的高可用性。它使得微服务架构更加健壮和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值