Hystrix原理之核心类MetaHolder的实现

举报
qingting-fly 发表于 2021/09/26 20:44:13 2021/09/26
【摘要】 通过HystrixCommand的讲解,我们知道在MetaHolder中,简单地持有用于构建HystrixCommand的关于被包装方法的必要信息,如被注解的方法、失败回滚执行的方法和默认的command key等属性。@Immutablepublic final class MetaHolder { ... private final Method method; //被注解...

通过HystrixCommand的讲解,我们知道在MetaHolder中,简单地持有用于构建HystrixCommand的关于被包装方法的必要信息,如被注解的方法、失败回滚执行的方法和默认的command key等属性。

@Immutable
public final class MetaHolder {

   	
	...
    private final Method method; //被注解的方法
    private final Method cacheKeyMethod;
    private final Method ajcMethod;
    private final Method fallbackMethod; // 失败回滚执行的方法
	...
    private final String defaultGroupKey; // 默认的group key
    private final String defaultCommandKey; // 默认的command key
    private final String defaultCollapserKey; // 默认的合并请求key
    private final String defaultThreadPoolKey; // 默认的线程池key
    private final ExecutionType executionType; // 执行类型
  	...
....    
}

HystrixCommandFactory,用于创建HystrixCommand的方法:

public HystrixInvokable create(MetaHolder metaHolder) {
	HystrixInvokable executable;
	// 构建合并请求的command
  	if (metaHolder.isCollapserAnnotationPresent()) {
     	executable = new CommandCollapser(metaHolder);
  	} else if (metaHolder.isObservable()) {
      	executable = new GenericObservableCommand(HystrixCommandBuilderFactory.getInstance().create(metaHolder));
  	} else {
     	executable = new GenericCommand(HystrixCommandBuilderFactory.getInstance().create(metaHolder));
  	}
	return executable;
}

需要应该注意的是metaHolder.isObservable()的属性的不同将会构建不同的Command(HystrixCommand或者HystrixObservableCommand),前者用于将命令用于同步或者异步操作,后者用于响应式操作,主要是根据被包装方法的返回值来决定Command执行方式,主要有异步执行、同步执行、响应式执行。

//CommandMetaHolderFactory.create()
...
ExecutionType executionType = ExecutionType.getExecutionType(method.getReturnType());
...


public enum ExecutionType {

    // 异步执行命令
    ASYNCHRONOUS,

    // 同步执行命令
    SYNCHRONOUS,

    // 响应式执行命令(异步回调)
    OBSERVABLE;

    private static final Set<? extends Class> RX_TYPES = ImmutableSet.of(Observable.class, Single.class, Completable.class);

	// 根据方法的返回类型返回对应的ExecutionType
    public static ExecutionType getExecutionType(Class<?> type) {
    	  // Future 为异步执行
        if (Future.class.isAssignableFrom(type)) {
            return ExecutionType.ASYNCHRONOUS;
        } else if (isRxType(type)) {
        // 属于 rxType为异步回调执行
            return ExecutionType.OBSERVABLE;
        } else {
        // 其他为同步执行
            return ExecutionType.SYNCHRONOUS;
        }
    }

    private static boolean isRxType(Class<?> cl) {
        for (Class<?> rxType : RX_TYPES) {
            if (rxType.isAssignableFrom(cl)) {
                return true;
            }
        }
        return false;
    }
}

根据被包装方法的返回值类型决定命令执行的ExecutionType,从而决定构建HystrixCommand还是HystrixObservableCommand。其中Future类型的返回值将会被异步执行,rx类型的返回值将会被异步回调执行,其他的类型将会被同步执行。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。