• 一文读懂WebClient和RestTemplate的差异


    自 Spring 5 以来,WebClient已成为Spring WebFlux的一部分,并且是发出 HTTP 请求的首选方式。它是经典RestTemplate的首选替代方案,后者自 Spring 5.0 以来一直处于维护模式。

    本文将讨论 Spring WebClient和RestTemplate类之间的主要区别。

    1. WebClient和RestTemplate快速比较

    特征

    WebClient

    RestTemplate

    反应式编程

    基于反应式原则构建并支持反应式编程。

    同步而不是为反应式编程而设计。

    技术

    构建在反应式技术栈上。

    构建在 Servlet 技术栈上。

    线程模型

    采用非阻塞I/O,适合处理大量并发请求。

    使用阻塞 I/O,在高并发场景下可能会导致线程阻塞。

    Java版本

    需要 Java 8+ 或更高版本。支持函数式编程。

    与 Java 6+ 或更高版本兼容。

    错误处理

    使用onErrorResume、onErrorReturn等运算符提供强大的错误处理。

    错误处理通常使用 try-catch 块完成。

    流媒体

    支持使用Flux和Mono流式传输数据,适合反应式流式场景。

    对流的支持有限,不太适合反应式流。

    用例

    最适合微服务、反应式应用以及需要高并发的场景。

    适用于传统的整体应用程序和简单的用例。

    依赖关系

    需要Spring WebFlux依赖项。

    需要Spring Web依赖。

    未来的支持

    与反应式编程模型保持一致,并可能会得到持续的开发和支持。

    可能会维护更新,将来可能不会受到那么多关注。

    2. 阻塞RestTemplate与非阻塞WebClient对比

    2.1.RestTemplate

    RestTemplate本质上是阻塞的,并使用 Java Servlet API 的每个请求一个线程模型。这意味着RestTemplate一旦向远程服务器发送请求,就会等待响应。默认情况下,每次RestTemplate都会创建新的,并在收到并处理响应后关闭连接。Httpconnection 创建和关闭 URL 连接是一项成本高昂的操作。为了在生产类应用程序中有效地使用RestTemplate ,我们必须使用HTTP 连接池,否则性能会快速下降。当应用程序中有大量请求时,线程和连接的数量也会按比例增加。这会给服务器资源带来负担。如果服务器速度缓慢,用户很快就会发现应用程序性能下降,甚至无响应。

    请注意,RestTemplate 是线程安全的,并且可以随时在多个连接之间共享单个实例。

    1. @Service
    2. public class MyService {
    3. private final RestTemplate restTemplate;
    4. @Autowired
    5. public MyService(RestTemplate restTemplate) {
    6. this.restTemplate = restTemplate;
    7. }
    8. public String getData() {
    9. ResponseEntity<String> responseEntity
    10. = restTemplate.getForEntity("https://api.example.com/data", String.class);
    11. String responseBody = responseEntity.getBody();
    12. return responseBody;
    13. }
    14. }
    2.2.WebClient

    与RestTemplate相反,WebClient本质上是异步且非阻塞的。它遵循 Spring WebFlux 反应式框架的事件驱动架构。使用WebClient,客户端无需等待响应返回。相反,当服务器有响应时,它将使用回调方法收到通知。

    当我们通过WebClient调用返回 Mono或 Flux 的API 时,API 会立即返回。而调用结果将通过 mono 或 flux 回调传递给调用端。

    请注意,如果需要,我们可以通过WebClient.block()方法实现类似RestTemplate的同步处理。

    1. @Service
    2. public class MyService {
    3. private final WebClient webClient;
    4. @Autowired
    5. public MyService(WebClient webClient) {
    6. this.webClient = webClient;
    7. }
    8. public Mono<String> getData() {
    9. return webClient.get()
    10. .uri("/data")
    11. .retrieve()
    12. .bodyToMono(String.class)
    13. .subscribe(
    14. // onSuccess callback
    15. result -> {
    16. System.out.println("Success: " + result);
    17. },
    18. // onError callback
    19. error -> {
    20. System.err.println("Error: " + error.getMessage());
    21. }
    22. );
    23. }
    24. }

    3.结论

    从上面可以清楚地看出, WebClient和RestTemplate之间唯一的大区别是它们的阻塞性质。RestTemplate会阻止请求线程,而WebClient不会。我们可以使用WebClient来发出同步请求,但反之则不行。RestTemplate无法发出异步请求。

    虽然WebClient是未来使用的首选方式,但 RestTemplate 应该会长期保留,尽管没有添加任何新的核心功能。

    在考虑使用WebClient 构建新应用程序时,我们必须记住,要构建真正的非阻塞应用程序,必须以非阻塞方式创建/使用其所有组件,即客户端、控制器、中间服务,甚至数据库。如果其中之一阻塞了请求,目的就会落空。

  • 相关阅读:
    基于Web的Markdown编辑器HedgeDoc
    mysql explain extra值枚举
    正大杯市场调查与分析大赛|赛前准备 持续更新ing
    等级保护——Linux命令大全
    蓝牙技术|新能源汽车正快速发展,蓝牙无钥匙进入助力智能化新能源汽车
    Java开发学习----SpringMVC设置请求映射路径
    apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】
    [附源码]计算机毕业设计JAVA火车票订票管理系统
    【GPU】Nvidia CUDA 编程高级教程——利用蒙特卡罗法求解 的近似值
    SwiftUI——如何使用新的NavigationStack和NavigationSplitView(如何页面跳转2.0以及如何制作侧栏)
  • 原文地址:https://blog.csdn.net/pantouyuchiyu/article/details/134076553