RestTemplate
RestTemplate是一个执行http请求的同步阻塞式工具类,它仅仅式在HTTP客户端库的基础上封装了更加简单易用的模板方法API,方便程序员用发起网络请求和处理
1.RestTemplate是Spring提供的访问Rest服务器的客户端
2.底层通过使用java.net包下的实现创建HTTP请求
3.通过使用ClientHttpRequetFactory指定不同的HTTP请求方式,主要提供了两种实现方式
(1)SimpleClientHttpRequestFactory(默认)
-底层使用了J2SE提供的方式,就是java.net包所提供的方式,去创建底层的http请求连接
-主要createRequest方法,每次都会创建一个新的连接,每次创建连接都会造成极大的资源浪费,而且如果连接不能及时释放资源,会因为无法建立新的连接而导致后面的请求阻塞
(2) HttpComponentClientHttpRequestFactory
底层使用的是HttpClient访问远程的Http服务
Spring的restTemplate对httpClient进行了封装,而httpClient是支持池化的,通过http连接池可以减少连接的建立和释放时间,提高http请求的性能
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder, ClientHttpRequestFactory httpRequestFactory){
RestTemplate restTemplate = builder.build();
//使用连接池
restTemplate.setInterceptors(Collections.singletonList(restTemplateLoggingInterceptor));
restTemplate.setErrorHandler(restTemplateErrorHandler);
restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(httpRequestFactory));
return restTemplate;
}
@Bean
public ClientHttpRequestFactory clientHttpRequestFactory(){
SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
simpleClientHttpRequestFactory.setConnectTimeout(150000);
simpleClientHttpRequestFactory.setReadTimeout(15000);
return simpleClientHttpRequestFactory;
}
HttpClient
代码复杂,还需要进行资源回收,不建议直接使用,一般是封装为HttpClient工具类使用的。
RestTemplate和WebClient的区别
WebClient是一种非阻塞,响应式的客户端,用于执行HTTP请求,在Spring5.0引入,支持同步,异步和流式场景,用于取代RestTemplate,
1.RestTemplate是同步阻塞的:这意味着客户端线程在受到服务器端的响应之前,会一直 被阻塞着。当访问大量响应速度较慢的服务的时候,数量众多的阻塞线程将占用大量的服务器资源,严重影响性能。
WebClient是异步阻塞的,在等待响应返回的时候不会阻塞正在执行的线程,只有当响应就绪的时候,才会产生通知。