目录
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 {@Overridepublic 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);}@Overrideprotected 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();
}