成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文讀懂WebClient和RestTemplate的差異

開發 前端
自 Spring 5 以來,WebClient已成為Spring WebFlux的一部分,并且是發出 HTTP 請求的首選方式。它是經典RestTemplate的首選替代方案,后者自 Spring 5.0 以來一直處于維護模式。

自 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 塊完成。

流媒體

支持使用FluxMono流式傳輸數據,適合反應式流式場景。

對流的支持有限,不太適合反應式流。

用例

最適合微服務、反應式應用以及需要高并發的場景。

適用于傳統的整體應用程序和簡單的用例。

依賴關系

需要Spring WebFlux依賴項。

需要Spring Web依賴。

未來的支持

與反應式編程模型保持一致,并可能會得到持續的開發和支持。

可能會維護更新,將來可能不會受到那么多關注。

2. 阻塞RestTemplate與非阻塞WebClient對比

2.1.RestTemplate

RestTemplate本質上是阻塞的,并使用 Java Servlet API 的每個請求一個線程模型。這意味著RestTemplate一旦向遠程服務器發送請求,就會等待響應。默認情況下,每次RestTemplate都會創建新的,并在收到并處理響應后關閉連接。Httpconnection 創建和關閉 URL 連接是一項成本高昂的操作。為了在生產類應用程序中有效地使用RestTemplate ,我們必須使用HTTP 連接池,否則性能會快速下降。當應用程序中有大量請求時,線程和連接的數量也會按比例增加。這會給服務器資源帶來負擔。如果服務器速度緩慢,用戶很快就會發現應用程序性能下降,甚至無響應。

請注意,RestTemplate 是線程安全的,并且可以隨時在多個連接之間共享單個實例。

@Service
public 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的同步處理。

@Service
public 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 構建新應用程序時,我們必須記住,要構建真正的非阻塞應用程序,必須以非阻塞方式創建/使用其所有組件,即客戶端、控制器、中間服務,甚至數據庫。如果其中之一阻塞了請求,目的就會落空。

責任編輯:華軒 來源: 今日頭條
相關推薦

2017-10-24 11:19:16

深度學習機器學習數據

2023-12-22 19:59:15

2021-08-04 16:06:45

DataOps智領云

2024-04-10 13:50:41

CentOSUbuntu操作系統

2021-09-04 19:04:14

配置LogbackJava

2018-09-28 14:06:25

前端緩存后端

2022-09-22 09:00:46

CSS單位

2025-04-03 10:56:47

2022-11-06 21:14:02

數據驅動架構數據

2023-11-27 17:35:48

ComponentWeb外層

2023-05-20 17:58:31

低代碼軟件

2022-07-05 06:30:54

云網絡網絡云原生

2022-07-26 00:00:03

語言模型人工智能

2022-10-20 08:01:23

2021-12-29 18:00:19

無損網絡網絡通信網絡

2022-12-01 17:23:45

2022-07-27 15:56:58

固態硬盤網絡存儲

2023-05-17 16:01:00

物聯網數據治理

2023-04-11 14:48:34

2023-11-21 09:41:00

緩存策略存儲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 2019天天操 | 亚洲国产一区二区三区在线观看 | 国产一区二区毛片 | 亚洲综合电影 | 成人免费网站 | 欧美又大粗又爽又黄大片视频 | av中文天堂 | 精品欧美一区二区三区久久久 | 日韩电影在线 | 欧美精品第一区 | 国产一级片一区二区 | 亚洲精品一区二区 | 亚洲一区二区久久 | 久久久xxx| 91视频观看 | 911影院 | 做a视频在线观看 | 天堂网avav | 精品欧美一区二区在线观看视频 | 丁香六月激情 | 羞羞视频免费在线观看 | 国产成人一区二区三区久久久 | 天天人人精品 | 免费的网站www | 91精品国产综合久久久久久蜜臀 | 电影午夜精品一区二区三区 | 亚洲精品欧美 | 成人一级片在线观看 | 亚洲一区二区中文字幕 | 欧洲色| 久久99精品国产麻豆婷婷 | 男女羞羞在线观看 | 第一区在线观看免费国语入口 | 欧美日韩亚 | 久久久久精 | 欧美国产91 | 黄色免费网站在线看 | 国产亚洲一区二区精品 | 91久久国产综合久久91精品网站 | 国产精品爱久久久久久久 | 夜夜草|