今天在对Hystrix服务熔断验证的时候,服务提供方代码如下:
@HystrixCommand(fallbackMethod = "getEmpBackup")
@RequestMapping("/provider/circuit/breaker/get/emp")
public ResultEntity<Employee> getEmp(@RequestParam("signal")String signal) throws InterruptedException {
if ("bang".equals(signal)) {
throw new RuntimeException("蹦!瞎卡拉卡!");
}if("sleep".equals(signal)) {
Thread.sleep(5000);
}
return ResultEntity.successWithData(new Employee(666, "sam666", 666.66));
}
public ResultEntity<Employee> getEmpBackup(@RequestParam("signal") String signal) {
return ResultEntity.failed("circuitbreakworkded,withsignal=" + signal+", the Exception is: ");
}
其中的线程本来只是为了验证熔断的功能,访问服务消费端的接口时却报了以下错误:
请求超时???
一上来就怀疑是Hystrix配置的问题,但是仔细一看最后一段错误提示:Read timed out executing GET http://atguigu-provider/provider/circuit/breaker/get/emp?signal=sleep 可以看出应该是服务消费者成功访问到提供者的接口了,但由于消费方长时间得不到提供方的响应便抛出这个错误,通过这句话中的调用地址可以捕捉到问题的根源在于服务消费方的Feign,所以,这个错误的解决方式建立在服务消费方更加合理一些。于是通过百度,通过以下方式将Feign连接超时时间和读取超时时间设置更大就可以解决:
feign:
client:
config:
default:
connectTimeout: 10000
readTimeout: 600000
然后重启服务,再次访问该接口,成功实现服务熔断