1.使用第一步 feign: hystrix: enabled: true
在yml里需要配置上面的标识,开启才能使用hystrix
目的是使你的服务支持hystrix
2.主启动类加上对应的的标识,代表启用该功能
@EnableHystrix
3.在对应业务类上加上hystrix的超时时间或者在配置文件配置对应的超时时间
配置在yml:
hystrix: threadpool: default: # 执行命令线程池的核心线程数,也是命令执行的最大并发量 # 默认10 coreSize: 500 # 最大执行线程数 maximumSize: 500 command: default: execution: isolation: thread: # HystrixCommand 执行的超时时间,超时后进入降级处理逻辑。一个接口,理论的最佳响应速度应该在200ms以内,或者慢点的接口就几百毫秒。 # 默认 1000 毫秒,最高设置 2000足矣。如果超时,首先看能不能优化接口相关业务、SQL查询等,不要盲目加大超时时间,否则会导致线程堆积过多,hystrix 线程池卡死,最终服务不可用。 timeoutInMilliseconds: 120000
业务类加标识,效果和配置文件相同,但是可以指定具体的兜底方法,精确打击
@PostMapping("/{organizationId}/cf-contracts/enterprise/{historyId}/import") @HystrixCommand(fallbackMethod = "syastemTimeOutFallbackMethod" , commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds" , value = "3000") }) ResponseEntity<?> importToBusiness(@PathVariable("historyId") Long historyId, @PathVariable("organizationId") Long organizationId){ int i = 10/0; try { TimeUnit.MICROSECONDS.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return "代码运行正常"; } public String syastemTimeOutFallbackMethod() { return "代码运行报错,请检查后重试"; }
当业务类代码程序报错,或者超过设置的超时时间,则执行降级方法syastemTimeOutFallbackMethod
第三种,在类上配置
第四种
当A服务调用B服务的时候,遇到b服务宕机或者报错,可以在A进行降级
@FeignClient(value = "hrecc-process", configuration = FeignConfiguration.class, fallback = HreccRemoteServiceFallback.class, path = "/v1")
在B服务的feign接口方法加上以上标签,并且指定兜底方法,当B服务报错,执行A服务的兜底方法。
具体操作如下图
使用hystrix的目的,主要是避免系统直接报错,或者系统持续的等待,造成资源浪费和系统卡顿,
执行兜底方法,降级,使服务能继续进行下去。