RestTemplate是阻塞性客户端,每个事件都为一个线程,客户端在收到服务器响应前会一直被阻塞
WebClient是非阻塞性客户端,每个事件都为一个任务,Spring Reactive框架对任务进行队列处理,仅在收到响应时才执行对应的任务
Java实现
服务
@GetMapping("/getAll")
public Person server(String name) throws InterruptedException {
System.out.println("Enter Server");
Thread.sleep(2000);
Person person = new Person(name, 25);
System.out.println("Server finished");
return person;
}
进入服务时打印服务开始,睡眠2秒且做一个无意义的操作模拟服务器处理数据,服务返回前打印服务结束
RestTemplate
@GetMapping("/RT")
public String getRT() {
System.out.println("Enter RTController+++++++++");
RestTemplate restTemplate = new RestTemplate();
Person person = restTemplate.getForObject("http://localhost:8080/getAll?name={name}", Person.class, "skye1");
System.out.println("RTController Finished+++++++");
return "true";
}
开始启用方法时打印进入方法,getForObject返回对象,getForEntity返回包含响应体的整个对象,离开方法时打印方法结束
WebClient
@GetMapping("/WC")
public String getWC() throws InterruptedException {
System.out.println("Enter WCController--------");
WebClient webClient = WebClient.builder()
.baseUrl("http://localhost:8080")
.build();
webClient.get().uri(uriBuilder -> {
uriBuilder = uriBuilder.path("/getAll");
uriBuilder = uriBuilder.queryParam("name", "skye2");
return uriBuilder.build();
})
.retrieve()
.bodyToMono(Person.class).subscribe();
System.out.println("WC finished---------");
System.out.println("main thread sleep to wait for WC return");
Thread.sleep(10000);
System.out.println("wake up");
return "true";
}
进入方法时打印进入方法,build webclient,发起get请求,使用subscribe异步获取响应(block则是同步阻塞式获取响应)
结束方法时打印方法结束,为了防止主线程关闭导致服务不执行,主线程睡眠10秒
控制台信息
RestTemplate
Enter RTController+++++++++
Enter Server
Server finished
RTController Finished+++++++
运行时可以明显感觉到停顿了2秒
WebClient
Enter WCController--------
WC finished---------
main thread sleep to wait for WC return
Enter Server
Server finished
wake up
先结束主方法,在主线程睡眠等待时,进入服务,10秒后唤醒
本文探讨了Spring框架中的RestTemplate与WebClient在处理HTTP请求时的阻塞与非阻塞模式,通过实例展示了两者在请求响应速度上的区别,以及WebClient如何利用异步任务处理机制提高效率。
600

被折叠的 条评论
为什么被折叠?



