AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

快速掌握Spring異步請求接口,輕松解決并發問題

來源: 責編: 時間:2023-10-20 10:02:28 284觀看
導讀環境:SpringBoot2.7.121. 概述 在現代的互聯網應用中,隨著用戶數量的不斷增加和業務復雜性的提升,并發問題成為了開發中面臨的重大挑戰。傳統的同步請求接口往往無法滿足高并發場景的需要,不僅會阻塞調用線程,影響系

環境:SpringBoot2.7.12JO628資訊網——每日最新資訊28at.com


1. 概述JO628資訊網——每日最新資訊28at.com

      在現代的互聯網應用中,隨著用戶數量的不斷增加和業務復雜性的提升,并發問題成為了開發中面臨的重大挑戰。傳統的同步請求接口往往無法滿足高并發場景的需要,不僅會阻塞調用線程,影響系統的響應性能,而且還可能導致線程資源的浪費。為了解決這些問題,異步請求接口逐漸成為了開發者的首選。JO628資訊網——每日最新資訊28at.com

在SpringBoot框架中,異步請求接口的創建和使用非常方便,能夠讓你輕松解決并發問題,提高系統的可維護性和響應性能。本文將介紹如何快速掌握SpringBoot異步請求接口,以輕松解決并發問題。JO628資訊網——每日最新資訊28at.com

2. 異步請求接口優勢JO628資訊網——每日最新資訊28at.com

異步請求接口相比于傳統同步請求具有以下優勢:JO628資訊網——每日最新資訊28at.com

  1. 非阻塞性:異步請求不會阻塞調用線程,而是在請求處理過程中繼續執行其他任務或操作,從而提高了系統的并發性能和響應速度。
  2. 可用資源:異步請求可以釋放占用的線程等資源,避免阻塞,等到結果產生再重新獲取線程處理。這樣能夠節省資源,提高系統的資源利用率。
  3. 解耦:異步請求可以減少系統間的耦合度,使得不同的系統或服務之間可以更好地協同工作。因為請求處理過程中不會阻塞其他操作,可以更容易地實現分布式系統的調用。
  4. 異常處理:異步請求可以更容易地捕獲、處理異常,因為請求處理的結果是在另一個線程中返回的,不會影響到主線程的執行流程。
  5. 控制流程:異步請求可以通過回調函數或者Promise等方式來控制流程,使得流程更加靈活和可擴展。

總之,異步請求接口具有上述優勢,尤其是在高并發場景下,能夠提高系統的性能和可用性,是解決并發問題的有效方法之一。JO628資訊網——每日最新資訊28at.com

3. 應用場景JO628資訊網——每日最新資訊28at.com

異步請求接口可以應用于以下場景:JO628資訊網——每日最新資訊28at.com

  1. 高并發場景:在面對大量用戶請求時,異步請求接口能夠避免線程阻塞,提高系統的并發處理能力,減少等待時間,提升用戶體驗。
  2. 耗時操作處理:當需要進行一些耗時的操作,如網絡請求、IO磁盤等操作時,采用異步請求接口可以避免阻塞主線程,提高系統的響應性能。
  3. 實時數據處理:對于實時性要求較高的應用,如實時數據流處理、實時股票交易等場景,采用異步請求接口能夠快速處理數據,并實時反饋結果,提高系統的實時性。
  4. 異步業務流程:在某些業務流程中,涉及到多個異步任務,這些任務之間沒有依賴關系,可以采用異步請求接口進行實現,提高系統的并發性和響應性能。
  5. API接口的調用:當需要對其他API接口進行調用時,特別是對于一些耗時較長的接口,采用異步請求接口可以提高系統的響應性能和資源利用率。

總之,異步請求接口適用于那些需要避免阻塞、提高系統響應性能、處理耗時操作和實時數據處理等場景中,能夠提高系統的并發性能和資源利用率,減少系統瓶頸的出現。JO628資訊網——每日最新資訊28at.com

接下來我們進入正文,在Spring環境下如何將我們的接口異步化。JO628資訊網——每日最新資訊28at.com

4. 實戰異步接口JO628資訊網——每日最新資訊28at.com

Spring MVC 廣泛集成了 Servlet 3.0 異步請求處理功能:JO628資訊網——每日最新資訊28at.com

  • Controller方法中的 DeferredResult 和 Callable 返回值為單個異步返回值提供了基本支持。
  • Controller可以流式傳輸多個值,包括 SSE 和原始數據。
  • Controller可以使用反應式客戶端和返回反應式類型來處理響應。


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

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

一旦在 Servlet 容器中啟用異步請求處理功能,控制器方法就可以用 DeferredResult 封裝任何受支持的控制器方法返回值,如下例所示:JO628資訊網——每日最新資訊28at.com

@GetMapping("/deferred")@ResponseBodypublic DeferredResult<Map<String, Object>> deferred(){  long start = System.currentTimeMillis() ;  System.out.printf("%s - 開始時間:%d%n", Thread.currentThread().getName(), start) ;  DeferredResult<Map<String, Object>> deferredResult = new DeferredResult<>();  // 為了演示方便直觀,這里直接創建線程  new Thread(() -> {    try {      // 這里模擬耗時操作      TimeUnit.SECONDS.sleep(3) ;      // 將執行結果保存      Map<String, Object> result = new HashMap<>() ;      result.put("code", 1) ;      result.put("data", "你的業務數據") ;      deferredResult.setResult(result) ;    } catch (InterruptedException e) {}  }).start() ;  long end = System.currentTimeMillis() ;  System.out.printf("%s - 結束時間:%d%n", Thread.currentThread().getName(), end) ;  System.out.printf("總耗時:%d毫秒%n", (end - start)) ;  return deferredResult ;}

控制臺輸出結果:JO628資訊網——每日最新資訊28at.com

2023-10-19 14:25:30.321  INFO 3884 --- [nio-8808-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 mshttp-nio-8808-exec-1 - 開始時間:1697696730335http-nio-8808-exec-1 - 結束時間:1697696730335總耗時:0毫秒

從結果看出,處理請求的tomcat線程幾乎沒有占用時間,線程被快速的釋放,這樣就可以去處理其它的連接請求,整個系統的吞吐量就的到了明顯的提升。JO628資訊網——每日最新資訊28at.com

Controller可以從不同的線程異步生成返回值。JO628資訊網——每日最新資訊28at.com

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

Controller可以用 java.util.concurrent.Callable 封裝任何受支持的返回值,如下例所示:JO628資訊網——每日最新資訊28at.com

@GetMapping("/callable")public Callable<Map<String, Object>> callable() {  long start = System.currentTimeMillis() ;  System.out.printf("%s - 開始時間:%d%n", Thread.currentThread().getName(), start) ;  Callable<Map<String, Object>> callable  = new Callable<Map<String, Object>>() {    public Map<String, Object> call() throws Exception {      Map<String, Object> result = new HashMap<>() ;      try {        // 這里模擬耗時操作        TimeUnit.SECONDS.sleep(3) ;        // 將執行結果保存        result.put("code", 1) ;        result.put("data", "你的業務數據") ;      } catch (InterruptedException e) {}      return result ;    }  } ;  long end = System.currentTimeMillis() ;  System.out.printf("%s - 結束時間:%d%n", Thread.currentThread().getName(), end) ;  System.out.printf("總耗時:%d毫秒%n", (end - start)) ;  return callable ;}

控制臺輸出結果:JO628資訊網——每日最新資訊28at.com

http-nio-8808-exec-2 - 開始時間:1697697345385http-nio-8808-exec-2 - 結束時間:1697697345386總耗時:1毫秒

執行結果與上面一樣。
注意:這里Callable中的代碼執行是在系統默認的一個TaskExecutor線程池中運行,我們可以通過配置自己的TaskExecutor來執行。如下:
JO628資訊網——每日最新資訊28at.com

@Beanpublic ThreadPoolTaskExecutor myAsyncTaskExecutor() {  // 配置ThreadPoolTaskExecutor相關參數,比如核心線程數等  return ... ;}

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

你可以將 DeferredResult 和 Callable 用于單個異步返回值。如果要生成多個異步值并將其寫入響應,該怎么辦?本節將介紹如何做到這一點。JO628資訊網——每日最新資訊28at.com

ResponseBodyEmitter 的返回值生成一個對象流,其中每個對象都會被 HttpMessageConverter 序列化并寫入響應,如下例所示:JO628資訊網——每日最新資訊28at.com

// 這里應該保存到一個集合中private ResponseBodyEmitter emitter ;@GetMapping("/emitter")public ResponseBodyEmitter emitter() throws Exception {  ResponseBodyEmitter bodyEmitter = new ResponseBodyEmitter(-1L);  this.emitter = bodyEmitter ;  return bodyEmitter;}// 可以不斷調用該接口進行消息的發送@GetMapping("/sender")public void sender() throws Exception {  this.emitter.send(System.currentTimeMillis()) ;}// 調用該j接口后請求結束@GetMapping("/complete")public void complete() throws Exception {  this.emitter.complete() ;}

當訪問/emitter接口時,瀏覽器會一直轉圈,一直等待。只有調用了/complete接口后請求內容才會被發送到客戶端并結束請求。JO628資訊網——每日最新資訊28at.com

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

有時,繞過消息轉換并直接流式傳輸到響應的 OutputStream(例如,文件下載)非常有用。為此,可以使用 StreamingResponseBody 返回值類型,如下例所示:JO628資訊網——每日最新資訊28at.com

@GetMapping("/stream")public ResponseEntity<StreamingResponseBody> stream() {  long start = System.currentTimeMillis() ;  System.out.printf("%s - 開始時間:%d%n", Thread.currentThread().getName(), start) ;  // 內部執行還是用的系統內部的線程池  StreamingResponseBody stream = new StreamingResponseBody() {    @Override    public void writeTo(OutputStream outputStream) throws IOException {      outputStream.write(String.valueOf("當前時間: " + System.currentTimeMillis() + "<br/>").getBytes()) ;      try {        TimeUnit.SECONDS.sleep(1) ;      } catch (InterruptedException e) {}      outputStream.write(String.valueOf("當前時間: " + System.currentTimeMillis() + "<br/>").getBytes()) ;      try {        TimeUnit.SECONDS.sleep(1) ;      } catch (InterruptedException e) {}      outputStream.write(String.valueOf("當前時間: " + System.currentTimeMillis() + "<br/>").getBytes()) ;    }  };  MultiValueMap<String, String> headers = new HttpHeaders() ;  headers.add("Content-Type", "text/html;charset=UTF-8") ;  ResponseEntity<StreamingResponseBody> response = new ResponseEntity<StreamingResponseBody>(stream, headers , HttpStatus.OK) ;  long end = System.currentTimeMillis() ;  System.out.printf("%s - 結束時間:%d%n", Thread.currentThread().getName(), end) ;  System.out.printf("總耗時:%d毫秒%n", (end - start)) ;  return response ;}

控制臺輸出:JO628資訊網——每日最新資訊28at.com

http-nio-8808-exec-1 - 開始時間:1697700256912http-nio-8808-exec-1 - 結束時間:1697700256915總耗時:3毫秒

tomcat線程非常短的時間內釋放,這樣就可以處理更多的請求,提升系統整體的吞吐量。這種最適合文件下載。JO628資訊網——每日最新資訊28at.com

瀏覽器輸出:JO628資訊網——每日最新資訊28at.com

圖片JO628資訊網——每日最新資訊28at.com

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

該方式請閱讀《實時數據推送并非只有WebSocket一種選擇》詳細介紹了如何使用。
JO628資訊網——每日最新資訊28at.com

4.6 基于反應式JO628資訊網——每日最新資訊28at.com

Spring MVC 支持在控制器中使用反應式客戶端庫。這包括 spring-webflux 中的 WebClient 以及 Spring Data 反應式數據存儲庫等其他庫。在這種情況下,從控制器方法中返回反應類型是很方便的。如下例所示:JO628資訊網——每日最新資訊28at.com

@GetMapping("/mono")public Mono<Map<String, Object>> mono() {  long start = System.currentTimeMillis() ;  System.out.printf("%s - 開始時間:%d%n", Thread.currentThread().getName(), start) ;  Mono<Map<String, Object>> mono = Mono.defer(() -> {    try {      TimeUnit.SECONDS.sleep(3) ;    } catch (InterruptedException e) {}    Map<String, Object> result = new HashMap<>() ;    result.put("code", 1) ;    result.put("data", "你的業務數據") ;    return Mono.just(result) ;  }) ;  long end = System.currentTimeMillis() ;  System.out.printf("%s - 結束時間:%d%n", Thread.currentThread().getName(), end) ;  System.out.printf("總耗時:%d毫秒%n", (end - start)) ;  return mono ;}

控制臺輸出:JO628資訊網——每日最新資訊28at.com

http-nio-8808-exec-2 - 開始時間:1697700686250http-nio-8808-exec-2 - 結束時間:1697700686251總耗時:1毫秒


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

以上就是Spring中異步請求接口的實現方式。JO628資訊網——每日最新資訊28at.com

異步請求接口是解決并發問題的有效方法之一,特別是在高并發、耗時操作、實時數據處理等場景中具有顯著優勢。通過異步請求,系統能夠避免阻塞線程,提高系統的響應性能和資源利用率。JO628資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-14319-0.html快速掌握Spring異步請求接口,輕松解決并發問題

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

上一篇: 圖形編輯器開發:實現自定義規則輸入框組件

下一篇: 前端項目重構的深度思考和復盤

標簽:
  • 熱門焦點
Top