Spring Cloud Hystrix 源码分析02
HystrixCommandAspect
1.根据入参连接点joinPoint获取方法method,并且校验不能为空
2.校验方法method不能既使用HystrixCommand注解,同时又使用HystrixCollapser 注解
3.然后获取工厂metaHolderFactory,创建出metaHolder
4.然后创建出invokable
5.获取执行类型executionType
6.调用CommandExecutor.execute执行,并且返回结果
分成同步,异步,和Observable
++++++++++++++++++++++++++++++++++++++++++++++++++++
具体的执行细节
执行分成同步,异步
熔断后执行fallback
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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 的方式来指定线程池的划分, 而不是通过组名的默认方式实现划分, 因为多个不同的命令可能 从业务逻辑上来看属于同 一个组, 但是往往从实现本身上需要跟其他命令进行隔离
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
简单的的来看就是:创建一个Observable,然后绑定各种事件对应的处理者,各类doOnXXXX,表示发生XXX事件时做什么事情。代码如下