Hystrix原理之核心类解析

举报
qingting-fly 发表于 2021/09/26 20:39:07 2021/09/26
【摘要】 首先我们通过官网的流程图来了解一下当我们通过Hystrix来包装我们远程调用后的流程,如下图所示:简单的流程的序号介绍如下:构建HystrixCommand或者HystrixObservableCommand对象;执行命令;是否有Response缓存;是否断路器打开;是否线程池或者队列或者信号量被消耗完;HystrixObservableCommand.construct() or Hyst...

首先我们通过官网的流程图来了解一下当我们通过Hystrix来包装我们远程调用后的流程,如下图所示:

flow-chart.png

简单的流程的序号介绍如下:

  1. 构建HystrixCommand或者HystrixObservableCommand对象;
  2. 执行命令;
  3. 是否有Response缓存;
  4. 是否断路器打开;
  5. 是否线程池或者队列或者信号量被消耗完;
  6. HystrixObservableCommand.construct() or HystrixCommand.run()
  7. 计算链路的健康情况;
  8. 获取fallback逻辑;
  9. 返回成功的Response;

接着我们通过源码来逐步理解这些过程。

Command

@HystrixCommand

在入门中,是通过@HystrixCommand的注解的方式包装了需要保护的远程调用方法,如下:

@HystrixCommand(fallbackMethod = "instanceInfoGetFail")
public Instance getInstanceByServiceIdWithRestTemplate(String serviceId){

	Instance instance = restTemplate.getForEntity("http://FEIGN-SERVICE/feign-service/instance/{serviceId}", 		Instance.class, serviceId).getBody();
 	return instance;
}

首先查看该注解的相关属性:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface HystrixCommand {

   // 命令分组键用于报告、预警以及面板
   // 默认被注解方法的运行时类名 
	String groupKey() default "";
	// Hystrix的命令键,用于区分不同的注解方法
	// 默认为注解方法的名称
	String commandKey() default "";
	// 线程池键用来表示被监控、度量发布、缓存和其他用处的HystrixThreadPool
	String threadPoolKey() default "";
	// 指定fallback方法名,fallback方法也可以被HystrixCommand注解
	String fallbackMethod() default "";
	// 自定义command的相关配置
	HystrixProperty[] commandProperties() default {};
	// 自定义线程池的相关配置
	HystrixProperty[] threadPoolProperties() default {};
	// 定义忽略哪一些异常
	Class<? extends Throwable>[] ignoreExceptions() default {};
   // 指定执行hystrix observable command的mode,快速执行还式懒执行
	ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;
    
	HystrixException[] raiseHystrixExceptions() default {};
 	// 默认的fallback
 	String defaultFallback() default "";
}

一般来说,对于HystrixCommand的配置,仅需要关注fallbackMethod(),当然如果有对command和线程池有特定需要的也可以进行额外的配置。

上面就是对 HystrixCommand 的介绍,接下来将会继续介绍HystrixCommandAspect的实现。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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