环境:
Spring Boot :2.0.8.RELEASE
Spring Cloud : Finchley.SR2
Nacos : 0.8.0
接上一篇,通过追踪请求,最终会调用SimpleClientHttpRequestFactory的openConnection,与prepareConnection。具体代码在InterceptingClientHttpRequest:
第一个红框即调用SimpleClientHttpRequestFactory创建ClientHttpRequest,
prepareConnection接口如下
connectTimeout与readTimeout默认情况下都是-1,即不会timeout。到这里请求已经分析完,即可通过自定义ClientHttpRequestFactory来实现超时时间的设置。
修改consume工程如下:
@SpringBootApplication
@Slf4j
@EnableDiscoveryClient
@RestController
public class ConsumeApplication {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
clientHttpRequestFactory.setConnectTimeout(10 * 1000);
clientHttpRequestFactory.setReadTimeout(30 * 1000);
return new RestTemplate(clientHttpRequestFactory);
}
@Autowired
RestTemplate restTemplate;
public static void main(String[] args) {
SpringApplication.run(ConsumeApplication.class, args);
}
@GetMapping("test")
public String getContent(){
log.info("发起请求");
return restTemplate.getForObject("http://provider/provider",String.class);
}
}
默认的SimpleClientHttpRequestFactory是用Java原生的HttpURLConnection发送HTTP请求,没有连接池。如果我们请求并发量大了会如何?可以采用Apache的HttpClient或者OKHTTP来代替。采用HTTP-CLIENT替换如下:
public RestTemplate getRestTemplate(){
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
clientHttpRequestFactory.setConnectTimeout(10 * 1000);
clientHttpRequestFactory.setReadTimeout(30 * 1000);
return new RestTemplate(clientHttpRequestFactory);
}