最近在使用spring cloud 搭建一个微服务项目,因为需要调用第三方接口,且延迟可能较高,
特意写了个测试接口测试30秒左右延迟能否正常处理,请求中途会在zuul的gate-service 中断于15秒左右,
并抛出如下异常
com.netflix.zuul.exception.ZuulException: Forwarding error
...
...
...
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: api-service timed-out and no fallback available.
...
...
...
修改了多次配置都未生效,于是就仔细研究了一下cloud中的各种组件的超时配置并整理如下
RestTemplate的超时
@Bean
@LoadBalanced
//不管是否有@LoadBalanced注解,都可以使用如下方式设置超时
public RestTemplate restTemplate(){
SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
simpleClientHttpRequestFactory.setConnectTimeout(1000);
simpleClientHttpRequestFactory.setReadTimeout(1000);
return new RestTemplate(simpleClientHttpRequestFactory);
}
Ribbon的超时
#全局设置
ribbon:
ReadTimeout: 40000 #单位ms
ConnectTimeout: 40000 #单位ms
#局部设置
#Ribbon所使用的虚拟主机名,
#一般和Eureka Server上注册的服务名称一致,
#即与spring.application.name一致
<service-id>:
ribbon