Spring Cloud中使用Hystrix来实现断路器的功能。
Ribbon中引入Hystrix
1. pom.xml引入spring-cloud-starter-hystrix,application主类中使用@EnableCircuitBreaker,开启断路器功能。
2. RestTemplate远程调用代码收敛到新的方法,在该方法上使用@HystrixCommand(fallbackMethod = "**Fallback")
3. 增加**Fallback方法,里面编写出现断路时的处理逻辑等
注意:
1. 回退方法的名称可随意定,但出、入参必须和所注解的方法一致,否则报fallbackMethod未定义错误
2. 远程方法执行时间大于断路器的时限(例如timeoutInMilliseconds=5s,而远程方法执行10s),hystrix中的MethodExecutionAction.execute捕获异常,HystrixCommand检查是否有配置回退方法,如果有,则回退方法执行,调用方按回退方法返回的内容继续执行,直到业务处理结束。如果没有,则抛HystrixRuntimeException
Feign使用Hystrix
1. 不需要在Feigh工程中引入Hystix,Feign中已经依赖了Hystrix
2. 不需要在主类使用@EnableCircuitBreaker,已自动开启该功能
3. 在FeignClient的interface上设置fallback,如 @FeignClient(value = "user-service", fallback = UserServiceHystrix.class)
4. 增加UserServiceHystrix类实现feign接口,重写其中的方法,里面的逻辑为:容错处理,例如,直接返回错误
注意:
1. 不需要在FeignClient的interface上使用@HystrixCommand,已隐含,所以在没有写fallback类的情况下,抛异常:hystrix中的InvocableHandlerMethod.doInvoke捕获HystrixRuntimeException,错误信息 ** failed and no fallback available;超时:同上,捕获HystrixRuntimeException,错误信息 ** timed-out and no fallback available