目录
RestTemplate
依赖配置
自定义RestTemplate
webCilent
依赖配置
自定义webCilent
springboot中有两种方式实现Rest远程服务调用,分别是RestTemplate与webCilent。下面分别介绍一下这两种方式。
RestTemplate
依赖配置
RestTemplate是Spring Framework提供的一个用于进行RESTful风格的HTTP请求的客户端工具类。所以需要引入spring-boot-starter-web依赖。
<!-- RestTemplate依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
根据 Spring Boot 自动配置规则可以知道 RestTemplate 的自动配置类为 RestTemplateAutoConfiguration,它同样被注册在新的 org.springframework.boot.autoconfigure.AutoConfiguration.imports 自动配置文件中,如下图所示:
自定义RestTemplate
一般使用RestTemplateBuilder创建一个自定义的RestTemplate,可以设置请求、读取时间等。
@Bean
public RestTemplate defaultRestTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder
.setConnectTimeout(Duration.ofSeconds(5))
.setReadTimeout(Duration.ofSeconds(5))
.basicAuthentication("test", "test")
.build();
}
通过实现并注册一个 RestTemplateCustomizer 接口的实例,实现附加其他的自定义配置。
依赖配置:
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
代码块分享:
@Slf4j
@Component
public class CustomRestTemplateCustomizer implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
HttpRoutePlanner routePlanner = new CustomRoutePlanner(new HttpHost("proxy.javastack.cn"));
RequestConfig requestConfig = RequestConfig.custom().build();
HttpClient httpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setRoutePlanner(routePlanner).build();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
}
static class CustomRoutePlanner extends DefaultProxyRoutePlanner {
CustomRoutePlanner(HttpHost proxy) {
super(proxy);
}
@Override
protected HttpHost determineProxy(HttpHost target, HttpContext context) throws HttpException {
log.info("hostName is {}", target.getHostName());
if ("localhost".equals(target.getHostName())) {
return null;
}
return super.determineProxy(target, context);
}
}
}
webCilent
依赖配置
与 RestTemplate 相比,WebClient 客户端的功能更强大,并且是完全基于响应式的。WebClient是Spring WebFlux模块中的一部分,并且适用于响应式编程。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
根据 Spring Boot 自动配置规则可以知道 WebClient 的自动配置类为 WebClientAutoConfiguration,它同样被注册在新的 org.springframework.boot.autoconfigure.AutoConfiguration.imports 自动配置文件中,如下图所示:
自定义webCilent
可以通过WebClient.Builder来自定义WebClient的配置。下面代码创建了一个基于 Reactor Netty 的 ReactorClientHttpConnector 连接器,通过它来设置连接、读写超时时间,这是通过自定义 ClientHttpConnector 的方式来完全控制 Client 端的配置的,它会改变 WebClient.Builder 注册实例的默认配置,所以,如果需要使用这种方式构建多个不同配置的 WebClient 客户端,可以在修改前使用 builder.clone() 克隆一个新实例。
@Bean
public WebClient webClient(WebClient.Builder webClientBuilder) {
HttpClient httpClient = HttpClient.create()
.tcpConfiguration(client ->
client.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3)
.doOnConnected(conn -> {
conn.addHandlerLast(new ReadTimeoutHandler(3000));
conn.addHandlerLast(new WriteTimeoutHandler(3000));
})
);
ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);
return webClientBuilder.clientConnector(connector).build();
}