日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

一文讀懂WebClient和RestTemplate的差異

來源: 責編: 時間:2023-10-23 17:02:32 295觀看
導讀自 Spring 5 以來,WebClient已成為Spring WebFlux的一部分,并且是發出 HTTP 請求的首選方式。它是經典RestTemplate的首選替代方案,后者自 Spring 5.0 以來一直處于維護模式。本文將討論 Spring WebClient和RestTemplate

自 Spring 5 以來,WebClient已成為Spring WebFlux的一部分,并且是發出 HTTP 請求的首選方式。它是經典RestTemplate的首選替代方案,后者自 Spring 5.0 以來一直處于維護模式。Aam28資訊網——每日最新資訊28at.com

Aam28資訊網——每日最新資訊28at.com

本文將討論 Spring WebClient和RestTemplate類之間的主要區別。Aam28資訊網——每日最新資訊28at.com

1. WebClient和RestTemplate快速比較

特征Aam28資訊網——每日最新資訊28at.com

WebClientAam28資訊網——每日最新資訊28at.com

RestTemplateAam28資訊網——每日最新資訊28at.com

反應式編程Aam28資訊網——每日最新資訊28at.com

基于反應式原則構建并支持反應式編程。Aam28資訊網——每日最新資訊28at.com

同步而不是為反應式編程而設計。Aam28資訊網——每日最新資訊28at.com

技術Aam28資訊網——每日最新資訊28at.com

構建在反應式技術棧上。Aam28資訊網——每日最新資訊28at.com

構建在 Servlet 技術棧上。Aam28資訊網——每日最新資訊28at.com

線程模型Aam28資訊網——每日最新資訊28at.com

采用非阻塞I/O,適合處理大量并發請求。Aam28資訊網——每日最新資訊28at.com

使用阻塞 I/O,在高并發場景下可能會導致線程阻塞。Aam28資訊網——每日最新資訊28at.com

Java版本Aam28資訊網——每日最新資訊28at.com

需要 Java 8+ 或更高版本。支持函數式編程。Aam28資訊網——每日最新資訊28at.com

與 Java 6+ 或更高版本兼容。Aam28資訊網——每日最新資訊28at.com

錯誤處理Aam28資訊網——每日最新資訊28at.com

使用onErrorResume、onErrorReturn等運算符提供強大的錯誤處理。Aam28資訊網——每日最新資訊28at.com

錯誤處理通常使用 try-catch 塊完成。Aam28資訊網——每日最新資訊28at.com

流媒體Aam28資訊網——每日最新資訊28at.com

支持使用FluxMono流式傳輸數據,適合反應式流式場景。Aam28資訊網——每日最新資訊28at.com

對流的支持有限,不太適合反應式流。Aam28資訊網——每日最新資訊28at.com

用例Aam28資訊網——每日最新資訊28at.com

最適合微服務、反應式應用以及需要高并發的場景。Aam28資訊網——每日最新資訊28at.com

適用于傳統的整體應用程序和簡單的用例。Aam28資訊網——每日最新資訊28at.com

依賴關系Aam28資訊網——每日最新資訊28at.com

需要Spring WebFlux依賴項。Aam28資訊網——每日最新資訊28at.com

需要Spring Web依賴。Aam28資訊網——每日最新資訊28at.com

未來的支持Aam28資訊網——每日最新資訊28at.com

與反應式編程模型保持一致,并可能會得到持續的開發和支持。Aam28資訊網——每日最新資訊28at.com

可能會維護更新,將來可能不會受到那么多關注。Aam28資訊網——每日最新資訊28at.com

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

2.1.RestTemplate

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

請注意,RestTemplate 是線程安全的,并且可以隨時在多個連接之間共享單個實例。Aam28資訊網——每日最新資訊28at.com

@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,客戶端無需等待響應返回。相反,當服務器有響應時,它將使用回調方法收到通知。Aam28資訊網——每日最新資訊28at.com

當我們通過WebClient調用返回 Mono或 Flux 的API 時,API 會立即返回。而調用結果將通過 mono 或 flux 回調傳遞給調用端。Aam28資訊網——每日最新資訊28at.com

請注意,如果需要,我們可以通過WebClient.block()方法實現類似RestTemplate的同步處理。Aam28資訊網——每日最新資訊28at.com

@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無法發出異步請求。Aam28資訊網——每日最新資訊28at.com

雖然WebClient是未來使用的首選方式,但 RestTemplate 應該會長期保留,盡管沒有添加任何新的核心功能。Aam28資訊網——每日最新資訊28at.com

在考慮使用WebClient 構建新應用程序時,我們必須記住,要構建真正的非阻塞應用程序,必須以非阻塞方式創建/使用其所有組件,即客戶端、控制器、中間服務,甚至數據庫。如果其中之一阻塞了請求,目的就會落空。Aam28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-14555-0.html一文讀懂WebClient和RestTemplate的差異

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 你的 JavaScript 正在泄漏內存而你卻不知道

下一篇: 甲骨文為 Visual Studio Code 推出 Java 擴展插件,號稱涵蓋全開發周期

標簽:
  • 熱門焦點
  • 28個SpringBoot項目中常用注解,日常開發、求職面試不再懵圈

    前言在使用SpringBoot開發中或者在求職面試中都會使用到很多注解或者問到注解相關的知識。本文主要對一些常用的注解進行了總結,同時也會舉出具體例子,供大家學習和參考。注解
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現手段有以下幾種方式:Object 類下
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • WebRTC.Net庫開發進階,教你實現屏幕共享和多路復用!

    WebRTC.Net庫:讓你的應用更親民友好,實現視頻通話無痛接入! 除了基本用法外,還有一些進階用法可以更好地利用該庫。自定義 STUN/TURN 服務器配置WebRTC.Net 默認使用 Google 的
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • iQOO 11S或7月上市:搭載“雞血版”驍龍8Gen2 史上最強5G Soc

    去年底,iQOO推出了“電競旗艦”iQOO 11系列,作為一款性能強機,iQOO 11不僅全球首發2K 144Hz E6全感屏,搭載了第二代驍龍8平臺及144Hz電競屏,同時在快充
  • iQOO Neo8 Pro搶先上架:首發天璣9200+ 安卓性能之王

    經過了一段時間的密集爆料,昨日iQOO官方如期對外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級性能調校的作品。隨著發布時
Top 主站蜘蛛池模板: 河北区| 旅游| 建阳市| 新河县| 古浪县| 策勒县| 醴陵市| 桃江县| 云安县| 宕昌县| 越西县| 哈密市| 霍州市| 孟津县| 保靖县| 汕尾市| 和龙市| 塘沽区| 靖宇县| 当雄县| 扶余县| 大石桥市| 灌阳县| 陇川县| 青阳县| 岗巴县| 宜章县| 攀枝花市| 屏山县| 醴陵市| 洪湖市| 顺平县| 宣武区| 澳门| 新安县| 阿巴嘎旗| 时尚| 台江县| 江门市| 开化县| 象山县|