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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

快速掌握Spring異步請(qǐng)求接口,輕松解決并發(fā)問(wèn)題

來(lái)源: 責(zé)編: 時(shí)間:2023-10-20 10:02:28 264觀看
導(dǎo)讀環(huán)境:SpringBoot2.7.121. 概述 在現(xiàn)代的互聯(lián)網(wǎng)應(yīng)用中,隨著用戶數(shù)量的不斷增加和業(yè)務(wù)復(fù)雜性的提升,并發(fā)問(wèn)題成為了開發(fā)中面臨的重大挑戰(zhàn)。傳統(tǒng)的同步請(qǐng)求接口往往無(wú)法滿足高并發(fā)場(chǎng)景的需要,不僅會(huì)阻塞調(diào)用線程,影響系

環(huán)境:SpringBoot2.7.12k7o28資訊網(wǎng)——每日最新資訊28at.com


1. 概述k7o28資訊網(wǎng)——每日最新資訊28at.com

      在現(xiàn)代的互聯(lián)網(wǎng)應(yīng)用中,隨著用戶數(shù)量的不斷增加和業(yè)務(wù)復(fù)雜性的提升,并發(fā)問(wèn)題成為了開發(fā)中面臨的重大挑戰(zhàn)。傳統(tǒng)的同步請(qǐng)求接口往往無(wú)法滿足高并發(fā)場(chǎng)景的需要,不僅會(huì)阻塞調(diào)用線程,影響系統(tǒng)的響應(yīng)性能,而且還可能導(dǎo)致線程資源的浪費(fèi)。為了解決這些問(wèn)題,異步請(qǐng)求接口逐漸成為了開發(fā)者的首選。k7o28資訊網(wǎng)——每日最新資訊28at.com

在SpringBoot框架中,異步請(qǐng)求接口的創(chuàng)建和使用非常方便,能夠讓你輕松解決并發(fā)問(wèn)題,提高系統(tǒng)的可維護(hù)性和響應(yīng)性能。本文將介紹如何快速掌握SpringBoot異步請(qǐng)求接口,以輕松解決并發(fā)問(wèn)題。k7o28資訊網(wǎng)——每日最新資訊28at.com

2. 異步請(qǐng)求接口優(yōu)勢(shì)k7o28資訊網(wǎng)——每日最新資訊28at.com

異步請(qǐng)求接口相比于傳統(tǒng)同步請(qǐng)求具有以下優(yōu)勢(shì):k7o28資訊網(wǎng)——每日最新資訊28at.com

  1. 非阻塞性:異步請(qǐng)求不會(huì)阻塞調(diào)用線程,而是在請(qǐng)求處理過(guò)程中繼續(xù)執(zhí)行其他任務(wù)或操作,從而提高了系統(tǒng)的并發(fā)性能和響應(yīng)速度。
  2. 可用資源:異步請(qǐng)求可以釋放占用的線程等資源,避免阻塞,等到結(jié)果產(chǎn)生再重新獲取線程處理。這樣能夠節(jié)省資源,提高系統(tǒng)的資源利用率。
  3. 解耦:異步請(qǐng)求可以減少系統(tǒng)間的耦合度,使得不同的系統(tǒng)或服務(wù)之間可以更好地協(xié)同工作。因?yàn)檎?qǐng)求處理過(guò)程中不會(huì)阻塞其他操作,可以更容易地實(shí)現(xiàn)分布式系統(tǒng)的調(diào)用。
  4. 異常處理:異步請(qǐng)求可以更容易地捕獲、處理異常,因?yàn)檎?qǐng)求處理的結(jié)果是在另一個(gè)線程中返回的,不會(huì)影響到主線程的執(zhí)行流程。
  5. 控制流程:異步請(qǐng)求可以通過(guò)回調(diào)函數(shù)或者Promise等方式來(lái)控制流程,使得流程更加靈活和可擴(kuò)展。

總之,異步請(qǐng)求接口具有上述優(yōu)勢(shì),尤其是在高并發(fā)場(chǎng)景下,能夠提高系統(tǒng)的性能和可用性,是解決并發(fā)問(wèn)題的有效方法之一。k7o28資訊網(wǎng)——每日最新資訊28at.com

3. 應(yīng)用場(chǎng)景k7o28資訊網(wǎng)——每日最新資訊28at.com

異步請(qǐng)求接口可以應(yīng)用于以下場(chǎng)景:k7o28資訊網(wǎng)——每日最新資訊28at.com

  1. 高并發(fā)場(chǎng)景:在面對(duì)大量用戶請(qǐng)求時(shí),異步請(qǐng)求接口能夠避免線程阻塞,提高系統(tǒng)的并發(fā)處理能力,減少等待時(shí)間,提升用戶體驗(yàn)。
  2. 耗時(shí)操作處理:當(dāng)需要進(jìn)行一些耗時(shí)的操作,如網(wǎng)絡(luò)請(qǐng)求、IO磁盤等操作時(shí),采用異步請(qǐng)求接口可以避免阻塞主線程,提高系統(tǒng)的響應(yīng)性能。
  3. 實(shí)時(shí)數(shù)據(jù)處理:對(duì)于實(shí)時(shí)性要求較高的應(yīng)用,如實(shí)時(shí)數(shù)據(jù)流處理、實(shí)時(shí)股票交易等場(chǎng)景,采用異步請(qǐng)求接口能夠快速處理數(shù)據(jù),并實(shí)時(shí)反饋結(jié)果,提高系統(tǒng)的實(shí)時(shí)性。
  4. 異步業(yè)務(wù)流程:在某些業(yè)務(wù)流程中,涉及到多個(gè)異步任務(wù),這些任務(wù)之間沒(méi)有依賴關(guān)系,可以采用異步請(qǐng)求接口進(jìn)行實(shí)現(xiàn),提高系統(tǒng)的并發(fā)性和響應(yīng)性能。
  5. API接口的調(diào)用:當(dāng)需要對(duì)其他API接口進(jìn)行調(diào)用時(shí),特別是對(duì)于一些耗時(shí)較長(zhǎng)的接口,采用異步請(qǐng)求接口可以提高系統(tǒng)的響應(yīng)性能和資源利用率。

總之,異步請(qǐng)求接口適用于那些需要避免阻塞、提高系統(tǒng)響應(yīng)性能、處理耗時(shí)操作和實(shí)時(shí)數(shù)據(jù)處理等場(chǎng)景中,能夠提高系統(tǒng)的并發(fā)性能和資源利用率,減少系統(tǒng)瓶頸的出現(xiàn)。k7o28資訊網(wǎng)——每日最新資訊28at.com

接下來(lái)我們進(jìn)入正文,在Spring環(huán)境下如何將我們的接口異步化。k7o28資訊網(wǎng)——每日最新資訊28at.com

4. 實(shí)戰(zhàn)異步接口k7o28資訊網(wǎng)——每日最新資訊28at.com

Spring MVC 廣泛集成了 Servlet 3.0 異步請(qǐng)求處理功能:k7o28資訊網(wǎng)——每日最新資訊28at.com

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


k7o28資訊網(wǎng)——每日最新資訊28at.com

4.1 DeferredResultk7o28資訊網(wǎng)——每日最新資訊28at.com

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

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

控制臺(tái)輸出結(jié)果:k7o28資訊網(wǎng)——每日最新資訊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 - 開始時(shí)間:1697696730335http-nio-8808-exec-1 - 結(jié)束時(shí)間:1697696730335總耗時(shí):0毫秒

從結(jié)果看出,處理請(qǐng)求的tomcat線程幾乎沒(méi)有占用時(shí)間,線程被快速的釋放,這樣就可以去處理其它的連接請(qǐng)求,整個(gè)系統(tǒng)的吞吐量就的到了明顯的提升。k7o28資訊網(wǎng)——每日最新資訊28at.com

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

4.2 Callablek7o28資訊網(wǎng)——每日最新資訊28at.com

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

@GetMapping("/callable")public Callable<Map<String, Object>> callable() {  long start = System.currentTimeMillis() ;  System.out.printf("%s - 開始時(shí)間:%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 {        // 這里模擬耗時(shí)操作        TimeUnit.SECONDS.sleep(3) ;        // 將執(zhí)行結(jié)果保存        result.put("code", 1) ;        result.put("data", "你的業(yè)務(wù)數(shù)據(jù)") ;      } catch (InterruptedException e) {}      return result ;    }  } ;  long end = System.currentTimeMillis() ;  System.out.printf("%s - 結(jié)束時(shí)間:%d%n", Thread.currentThread().getName(), end) ;  System.out.printf("總耗時(shí):%d毫秒%n", (end - start)) ;  return callable ;}

控制臺(tái)輸出結(jié)果:k7o28資訊網(wǎng)——每日最新資訊28at.com

http-nio-8808-exec-2 - 開始時(shí)間:1697697345385http-nio-8808-exec-2 - 結(jié)束時(shí)間:1697697345386總耗時(shí):1毫秒

執(zhí)行結(jié)果與上面一樣。
注意:這里Callable中的代碼執(zhí)行是在系統(tǒng)默認(rèn)的一個(gè)TaskExecutor線程池中運(yùn)行,我們可以通過(guò)配置自己的TaskExecutor來(lái)執(zhí)行。如下:
k7o28資訊網(wǎng)——每日最新資訊28at.com

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

4.3 ResponseBodyEmitterk7o28資訊網(wǎng)——每日最新資訊28at.com

你可以將 DeferredResult 和 Callable 用于單個(gè)異步返回值。如果要生成多個(gè)異步值并將其寫入響應(yīng),該怎么辦?本節(jié)將介紹如何做到這一點(diǎn)。k7o28資訊網(wǎng)——每日最新資訊28at.com

ResponseBodyEmitter 的返回值生成一個(gè)對(duì)象流,其中每個(gè)對(duì)象都會(huì)被 HttpMessageConverter 序列化并寫入響應(yīng),如下例所示:k7o28資訊網(wǎng)——每日最新資訊28at.com

// 這里應(yīng)該保存到一個(gè)集合中private ResponseBodyEmitter emitter ;@GetMapping("/emitter")public ResponseBodyEmitter emitter() throws Exception {  ResponseBodyEmitter bodyEmitter = new ResponseBodyEmitter(-1L);  this.emitter = bodyEmitter ;  return bodyEmitter;}// 可以不斷調(diào)用該接口進(jìn)行消息的發(fā)送@GetMapping("/sender")public void sender() throws Exception {  this.emitter.send(System.currentTimeMillis()) ;}// 調(diào)用該j接口后請(qǐng)求結(jié)束@GetMapping("/complete")public void complete() throws Exception {  this.emitter.complete() ;}

當(dāng)訪問(wèn)/emitter接口時(shí),瀏覽器會(huì)一直轉(zhuǎn)圈,一直等待。只有調(diào)用了/complete接口后請(qǐng)求內(nèi)容才會(huì)被發(fā)送到客戶端并結(jié)束請(qǐng)求。k7o28資訊網(wǎng)——每日最新資訊28at.com

4.4 StreamingResponseBodyk7o28資訊網(wǎng)——每日最新資訊28at.com

有時(shí),繞過(guò)消息轉(zhuǎn)換并直接流式傳輸?shù)巾憫?yīng)的 OutputStream(例如,文件下載)非常有用。為此,可以使用 StreamingResponseBody 返回值類型,如下例所示:k7o28資訊網(wǎng)——每日最新資訊28at.com

@GetMapping("/stream")public ResponseEntity<StreamingResponseBody> stream() {  long start = System.currentTimeMillis() ;  System.out.printf("%s - 開始時(shí)間:%d%n", Thread.currentThread().getName(), start) ;  // 內(nèi)部執(zhí)行還是用的系統(tǒng)內(nèi)部的線程池  StreamingResponseBody stream = new StreamingResponseBody() {    @Override    public void writeTo(OutputStream outputStream) throws IOException {      outputStream.write(String.valueOf("當(dāng)前時(shí)間: " + System.currentTimeMillis() + "<br/>").getBytes()) ;      try {        TimeUnit.SECONDS.sleep(1) ;      } catch (InterruptedException e) {}      outputStream.write(String.valueOf("當(dāng)前時(shí)間: " + System.currentTimeMillis() + "<br/>").getBytes()) ;      try {        TimeUnit.SECONDS.sleep(1) ;      } catch (InterruptedException e) {}      outputStream.write(String.valueOf("當(dāng)前時(shí)間: " + 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 - 結(jié)束時(shí)間:%d%n", Thread.currentThread().getName(), end) ;  System.out.printf("總耗時(shí):%d毫秒%n", (end - start)) ;  return response ;}

控制臺(tái)輸出:k7o28資訊網(wǎng)——每日最新資訊28at.com

http-nio-8808-exec-1 - 開始時(shí)間:1697700256912http-nio-8808-exec-1 - 結(jié)束時(shí)間:1697700256915總耗時(shí):3毫秒

tomcat線程非常短的時(shí)間內(nèi)釋放,這樣就可以處理更多的請(qǐng)求,提升系統(tǒng)整體的吞吐量。這種最適合文件下載。k7o28資訊網(wǎng)——每日最新資訊28at.com

瀏覽器輸出:k7o28資訊網(wǎng)——每日最新資訊28at.com

圖片k7o28資訊網(wǎng)——每日最新資訊28at.com

4.5 SSEk7o28資訊網(wǎng)——每日最新資訊28at.com

該方式請(qǐng)閱讀《實(shí)時(shí)數(shù)據(jù)推送并非只有WebSocket一種選擇》詳細(xì)介紹了如何使用。
k7o28資訊網(wǎng)——每日最新資訊28at.com

4.6 基于反應(yīng)式k7o28資訊網(wǎng)——每日最新資訊28at.com

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

@GetMapping("/mono")public Mono<Map<String, Object>> mono() {  long start = System.currentTimeMillis() ;  System.out.printf("%s - 開始時(shí)間:%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", "你的業(yè)務(wù)數(shù)據(jù)") ;    return Mono.just(result) ;  }) ;  long end = System.currentTimeMillis() ;  System.out.printf("%s - 結(jié)束時(shí)間:%d%n", Thread.currentThread().getName(), end) ;  System.out.printf("總耗時(shí):%d毫秒%n", (end - start)) ;  return mono ;}

控制臺(tái)輸出:k7o28資訊網(wǎng)——每日最新資訊28at.com

http-nio-8808-exec-2 - 開始時(shí)間:1697700686250http-nio-8808-exec-2 - 結(jié)束時(shí)間:1697700686251總耗時(shí):1毫秒


k7o28資訊網(wǎng)——每日最新資訊28at.com

以上就是Spring中異步請(qǐng)求接口的實(shí)現(xiàn)方式。k7o28資訊網(wǎng)——每日最新資訊28at.com

異步請(qǐng)求接口是解決并發(fā)問(wèn)題的有效方法之一,特別是在高并發(fā)、耗時(shí)操作、實(shí)時(shí)數(shù)據(jù)處理等場(chǎng)景中具有顯著優(yōu)勢(shì)。通過(guò)異步請(qǐng)求,系統(tǒng)能夠避免阻塞線程,提高系統(tǒng)的響應(yīng)性能和資源利用率。k7o28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-14324-0.html快速掌握Spring異步請(qǐng)求接口,輕松解決并發(fā)問(wèn)題

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 圖形編輯器開發(fā):實(shí)現(xiàn)自定義規(guī)則輸入框組件

下一篇: Kubernetes中的優(yōu)雅關(guān)閉和零停機(jī)時(shí)間部署

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 一文看懂為蘋果Vision Pro開發(fā)應(yīng)用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現(xiàn)實(shí)(MR)頭戴設(shè)備。Vision Pro結(jié)合了虛擬現(xiàn)實(shí)(VR)和增強(qiáng)現(xiàn)實(shí)(AR)的沉浸感。其高分辨率顯示屏、先進(jìn)的傳感器和強(qiáng)大的處理能力
  • 使用LLM插件從命令行訪問(wèn)Llama 2

    最近的一個(gè)大新聞是Meta AI推出了新的開源授權(quán)的大型語(yǔ)言模型Llama 2。這是一項(xiàng)非常重要的進(jìn)展:Llama 2可免費(fèi)用于研究和商業(yè)用途。(幾小時(shí)前,swyy發(fā)現(xiàn)它已從LLaMA 2更名為L(zhǎng)la
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個(gè)月我寫過(guò)一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當(dāng)時(shí)用的是 GDIView + WinDbg 把問(wèn)題搞定,前者用來(lái)定位泄露資源,后者用來(lái)定位泄露代碼,后面有朋友反
  • Python異步IO編程的進(jìn)程/線程通信實(shí)現(xiàn)

    這篇文章再講3種方式,同時(shí)講4中進(jìn)程間通信的方式一、 Python 中線程間通信的實(shí)現(xiàn)方式共享變量共享變量是多個(gè)線程可以共同訪問(wèn)的變量。在Python中,可以使用threading模塊中的L
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會(huì)涉及各種各樣的安全任務(wù),包括但不限于:開發(fā)某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 得物寵物生意「狂飆」,發(fā)力“它經(jīng)濟(jì)”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過(guò)得物App內(nèi)的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項(xiàng)。通過(guò)上傳自家寵物的部位細(xì)節(jié),就能收獲擁有專業(yè)資質(zhì)認(rèn)證的得物鑒
  • 超級(jí)標(biāo)準(zhǔn)版旗艦!iQOO 11S全球首發(fā)iQOO超算獨(dú)顯芯片

    上半年已接近尾聲,截至目前各大品牌旗下的頂級(jí)旗艦都已悉數(shù)亮相,而下半年即將推出的頂級(jí)旗艦已經(jīng)成為了數(shù)碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • 華為舉行春季智慧辦公新品發(fā)布會(huì) 首次推出電子墨水屏平板

    北京時(shí)間2月27日晚,華為在巴塞羅那舉行春季智慧辦公新品發(fā)布會(huì),在海外市場(chǎng)推出之前已經(jīng)在中國(guó)市場(chǎng)上市的筆記本、平板、激光打印機(jī)等辦公產(chǎn)品,并首次推出搭載
  • 上海舉辦人工智能大會(huì)活動(dòng),建設(shè)人工智能新高地

    人工智能大會(huì)在上海浦江兩岸隆重拉開帷幕,人工智能新技術(shù)、新產(chǎn)品、新應(yīng)用、新理念集中亮相。8月30日晚,作為大會(huì)的特色活動(dòng)之一的上海人工智能發(fā)展盛典人工
Top