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方法将执行。