Hystrix原理之核心类HystrixCommandAspect
【摘要】 上一篇文章介绍了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;
}
上面的代码主要具备如下的过程:
- 通过
MetaHolderFactory
构建出被注解方法中用于构建HystrixCommand
的所需要的必要信息集合类MetaHolder
; - 根据
MetaHolder
通过HystrixCommandFactory
构建出合适的HystrixCommand
; - 委托
CommandExecutor
执行HystrixCommand
,得到结果。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)