Spring Cloud Hystrix 源码分析02

HystrixCommandAspect

Spring Cloud Hystrix 源码分析02

1.根据入参连接点joinPoint获取方法method,并且校验不能为空

2.校验方法method不能既使用HystrixCommand注解,同时又使用HystrixCollapser 注解

3.然后获取工厂metaHolderFactory,创建出metaHolder

4.然后创建出invokable

5.获取执行类型executionType

6.调用CommandExecutor.execute执行,并且返回结果

    分成同步,异步,和Observable

++++++++++++++++++++++++++++++++++++++++++++++++++++

Spring Cloud Hystrix 源码分析02
具体的执行细节

Spring Cloud Hystrix 源码分析02

执行分成同步,异步

Spring Cloud Hystrix 源码分析02

熔断后执行fallback

Spring Cloud Hystrix 源码分析02

Spring Cloud Hystrix 源码分析02

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

commandKey:每个command都有对应的commandKey可以认为是command的名字,默认情况***解未指定),命令名称来源于切入方法的方法名(method.getName())。自定义使用HystrixCommandKey.Factory.asKey("HelloWorld"),说实话感觉没啥用,不需要自定义。

groupKey:Hystrix使用命令分组将一起的命令进行管理,比如报告、警报、仪表盘或组/库。默认情况***解未指定),名称来源于切入方法所属类的类名名(obj.getClass().getSimpleName()),Hystrix使用 HystrixCommandGroupKey 来定义命令线程池,除非单独定义线程池。

验证:commandKey和groupKey可以看源码CommandMetaHolderFactory.create以及HystrixCommandBuilderFactory中的createGenericSetterBuilder方法。

threadPoolKey:线程池主要体现是用于监测、指标发布、缓存和其他此类用途的HystrixThreadPool。当隔离方式为线程时,有隔离的作用。AbstractCommand.threadPool通过HystrixThreadPool.getInstance获取。

具有相同的threadPoolKey的使用同一个线程池,如果注解未指定threadPoolKey,则使用groupKey作为HystrixThreadPoolKey。


《Spring Cloud 微服务实战》推荐:通常情况下,尽量通过 HystrixThreadPoolKey 的方式来指定线程池的划分, 而不是通过组名的默认方式实现划分, 因为多个不同的命令可能 从业务逻辑上来看属于同 一个组, 但是往往从实现本身上需要跟其他命令进行隔离

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Spring Cloud Hystrix 源码分析02

Spring Cloud Hystrix 源码分析02

   简单的的来看就是:创建一个Observable,然后绑定各种事件对应的处理者,各类doOnXXXX,表示发生XXX事件时做什么事情。代码如下

Spring Cloud Hystrix 源码分析02

Spring Cloud Hystrix 源码分析02