写点什么

一文带你彻底了解 JMX

作者:高端章鱼哥
  • 2023-10-27
    福建
  • 本文字数:1395 字

    阅读完需:约 5 分钟

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


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

1. WebClient 和 RestTemplate 快速比较

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

2.1.RestTemplate


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


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


@Servicepublic class MyService {  private final RestTemplate restTemplate;  @Autowired  public MyService(RestTemplate restTemplate) {    this.restTemplate = restTemplate;  }  public String getData() {    ResponseEntity<String> responseEntity      = restTemplate.getForEntity("https://api.example.com/data", String.class);    String responseBody = responseEntity.getBody();    return responseBody;  }}
复制代码

2.2.WebClient


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


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


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


@Servicepublic class MyService {  private final WebClient webClient;  @Autowired  public MyService(WebClient webClient) {    this.webClient = webClient;  }  public Mono<String> getData() {    return webClient.get()      .uri("/data")      .retrieve()      .bodyToMono(String.class)      .subscribe(          // onSuccess callback          result -> {            System.out.println("Success: " + result);          },          // onError callback          error -> {            System.err.println("Error: " + error.getMessage());          }      );  }}
复制代码

三、结论


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


RestTemplate 无法发出异步请求。


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


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

发布于: 刚刚阅读数: 5
用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
一文带你彻底了解JMX_RestTemplat_高端章鱼哥_InfoQ写作社区