Hystrix原理之核心类HystrixCommandAspect

举报
qingting-fly 发表于 2021/09/26 20:41:15 2021/09/26
【摘要】 上一篇文章介绍了HystrixCommand。除了@HystrixCommand。还有一个@HystrixCollapser的注解用于请求合并操作,但是需要与@HystrixCommand`结合使用,如下的例子:@HystrixCollapser(batchMethod = "getInstanceBuServiceIds")public Future<Instance> getInstan...

上一篇文章介绍了HystrixCommand。除了@HystrixCommand。还有一个@HystrixCollapser的注解用于请求合并操作,但是需要与@HystrixCommand`结合使用,如下的例子:

@HystrixCollapser(batchMethod = "getInstanceBuServiceIds")
public Future<Instance> getInstanceByServiceIds(String serviceId) {
	return null;
}
    
@HystrixCommand
public List<Instance> getInstanceBuServiceIds(List<String> serviceIds){
 	List<Instance> instances = new ArrayList<>();
        
 	for(String s : serviceIds){
  		instances.add(new Instance(s, DEFAULT_HOST, DEFAULT_PORT));
  	}
	return instances;
}

请注意,批量操作的方法必须被@HystrixCommand注解。

HystrixCommandAspect

被注解的方法将会被HystrixCommand包装执行,在Hystrix中通过aspectj切面的方式来将注解的方法进行封装调用的。

//HystrixCommandAspect

@Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand)")

public void hystrixCommandAnnotationPointcut() {
}

@Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser)")
public void hystrixCollapserAnnotationPointcut() {
}

@Around("hystrixCommandAnnotationPointcut() || hystrixCollapserAnnotationPointcut()")
public Object methodsAnnotatedWithHystrixCommand(final ProceedingJoinPoint joinPoint) throws Throwable {
	...
  	// 通过工厂的方式构建metaHolder
  	MetaHolderFactory metaHolderFactory = META_HOLDER_FACTORY_MAP.get(HystrixPointcutType.of(method));
  	MetaHolder metaHolder = metaHolderFactory.create(joinPoint); //1
  	HystrixInvokable invokable = HystrixCommandFactory.getInstance().create(metaHolder);
  	ExecutionType executionType = metaHolder.isCollapserAnnotationPresent() ?
        	metaHolder.getCollapserExecutionType() : metaHolder.getExecutionType();

  	Object result;
   	try {
     	if (!metaHolder.isObservable()) {
    		result = CommandExecutor.execute(invokable, executionType, metaHolder);
      	} else {
         	result = executeObservable(invokable, executionType, metaHolder);
     	}
  	} catch (HystrixBadRequestException e) {
   		throw e.getCause() != null ? e.getCause() : e;
 	} catch (HystrixRuntimeException e) {
    	throw hystrixRuntimeExceptionToThrowable(metaHolder, e);
  	}
  	return result;
}

上面的代码主要具备如下的过程:

  1. 通过MetaHolderFactory构建出被注解方法中用于构建HystrixCommand的所需要的必要信息集合类MetaHolder
  2. 根据MetaHolder通过HystrixCommandFactory构建出合适的HystrixCommand
  3. 委托CommandExecutor执行HystrixCommand,得到结果。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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