代码地址:https://github.com/huiyiwu/spring-boot-simple/spring-boot-rest
如果需要从应用程序调用远程REST服务,可以使用Spring Framework的RestTemplate
类和Spring WebFlux的WebClient
类进行远程调用,RestTemplate
为每个事件(HTTP 请求)创建一个新的线程
,而WebClient 将为每个事件创建类似于“任务”
的东西,幕后,Reactive 框架将对这些 “任务” 进行排队,并仅在适当的响应可用时执行它们。
1. RestTempalte
1.1. 使用
Spring Boot不提供任何单个自动配置RestTemplate
bean,所以在使用前需要自定义RestTemplate
Bean,或者使用RestTemplateBuilder
构建:
添加配置:
/**
* Author: Huchx
* Date: 2021/1/22 15:25
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory clientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);
factory.setConnectTimeout(15000);
return factory;
}
}
使用RestTemplateBuilder
构建:
private final RestTemplate restTemplate;
public AddressService(RestTemplateBuilder restTemplateBuilder) {
this.restTemplate = restTemplateBuilder.build();
}
1.2. 自定义
使用RestTemplateCustomizer
自定义RestTemplate,添加拦截器:
/**
* Author: Huchx
* Date: 2021/1/22 16:27
*/
@Component
public class MyRestTemplateCustomizer implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
restTemplate.getInterceptors().add(new CustomizerIntercerptor());
}
}
2. WebClient
2.1. 使用
- 添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
- 使用
private final WebClient webClient;
public AddressService(WebClient.Builder builder) {
this.webClient = builder.baseUrl(url).build();
}
public List<AddressInfo> getByClient() {
Map<String,Object> addressInfos = webClient.get().retrieve().bodyToMono(Map.class).block();
return addressInfos!=null? (List<AddressInfo>) addressInfos.get("rows") :null;
}
2.2. Runtime
spring-boot-starter-webflux
默认依赖于io.projectreactor.netty:reactor-netty
,其提供了服务器和客户端实现。- 可以通过添加
io.projectreactor.netty:reactor-netty
将Jetty用作反应式服务器。 - 可以通过提供自定义
ReactorResourceFactory
或JettyResourceFactory
bean覆盖Jetty和Reactor Netty的资源配置 - 可以自定义
ClientHttpConnector
bean完全控制客户端配置
2.3. 自定义
使用WebClientCustomizer
实现WebClient自定义:
/**
* Author: Huchx
* Date: 2021/1/22 16:27
*/
@Component
public class MyRestTemplateCustomizer implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
restTemplate.getInterceptors().add(new CustomizerIntercerptor());
}
}