Hystrix与RestTemplate超时的坑

1.问题描述

ConnectTimeOut、SocketTimeOut、ReadTimeOut含义?
当RestTemplate和Hystrix同时配置了超时时间,以谁为准?

2.各种TimeOut含义解释

一次http请求必定会有三个阶段,一:建立连接;二:数据传送;三,断开连接。

当建立连接在规定的时间内(ConnectionTimeOut )没有完成,那么此次连接就结束了。后续的SocketTimeOutException就一定不会发生。只有当连接建立起来后,
也就是没有发生ConnectionTimeOutException ,才会开始传输数据,

总之:
connectTimeout:是建立链接的最大时间,也就是完成三次握手,建立tcp链接所用的时间。
socketTimeout:是等待数据的时间或者两个包之间的间隔时间。
readTimeout:与socketTimeout含义一致。

3.同时配置RestTemplate及Hystrix超时时间将会发生什么?

首先设置RestTemplate相关参数:

@Bean
@LoadBanlanced
public RestTemplate restTemplate(RestTemplateBuilder builder, HttpClientBuilder httpClientBuilder) {
    builder = builder
        .requestFactory(new HttpComponentsClientHttpRequestFactory(httpClientBuilder.build()));
    return builder.build();
}

@Bean 
@ConfigurationProperties(prefix = "http.client.builder")
public HttpClientBuilder httpClientBuilder() {
    HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
    httpClientBuilder.setMaxConnTotal(500);
    httpClientBuilder.setMaxConnPerRoute(200);
    RequestConfig requestConfig = RequestConfig.custom()
        .setSocketTimeout(5000) //设置socketTimeout为5s
        .setConnectTimeout(3000)
        .build();
    httpClientBuilder.setDefaultRequestConfig(requestConfig);
    return httpClientBuilder;
}

Hytrix超时时间:

hystrix:
    command:
        default:
            execution:
                isolation:
                    thread:
                        timeoutInMilliseconds: 4000 //设置Hystrix的超时时间为4s

因为Hystrix的超时时间比RestTemplate的socketTimeout短,所以这里以Hystrix的超时时间为标准,当后端依赖服务在4s内没有给出response,那么Hystrix的fallback方法生效执行。

反之,如果RestTemplate的超时时间小于Hystrix,当后端依赖服务在RestTemplate的socketTimeout内没有返回,那么Hystrix的fallback方法将执行。

你可能感兴趣的:(Hystrix与RestTemplate超时的坑)