精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Dubbo 同步調用太慢,也許你可以試試異步處理

開發 前端
異步調用配置其實與普通 xml服務引用配置類似,只不過我們還需要增加一個 dubbo:method將指定方法配置成異步調用。

[[378981]]

 本文轉載自微信公眾號「小黑十一點半」,作者樓下小黑哥 。轉載本文請聯系小黑十一點半公眾號。

Hello,大家好,我是樓下小黑哥~

今天原本是想解析一道朋友在大廠面試的時候碰到問題:

「Dubbo 異步調用的底層原理是什么?」

之前其實聽說過 Dubbo 異步調用,但是沒有在實際業務中使用過,所以使用方法比較陌生。

再加上 Dubbo 2.7 版本對于異步調用進行了一些修改,網上找到的一些資料也比較老,所以今天先寫一篇介紹一下 Dubbo 2.7 版本之后的異步調用使用方式。

后續我們從源碼出發再介紹一下 Dubbo 底層原理。

異步調用

我們平常大部分都是使用 Dubbo 的同步調用,即調用 Dubbo 請求之后,調用線程將會阻塞,直到服務提供者返回結果。

那相反,Dubbo 異步調用就不會阻塞調用線程,那么在服務提供者返回結果這段時間,我們就可以執行其他業務邏輯。

下面我們從代碼示例,來學習一下如何使用 Dubbo 異步調用。

PS:下面例子 Dubbo 版本為 2.7。

第一種方式

Dubbo 異步調用是針對方法級別,所以我們需要對引用接口中指定方法做一些專門的配置。

異步調用配置其實與普通 xml服務引用配置類似,只不過我們還需要增加一個 dubbo:method將指定方法配置成異步調用。

示例 xml 配置如下:

  1. <dubbo:reference id="asyncService" interface="org.apache.dubbo.samples.governance.api.AsyncService"
  2.       <dubbo:method name="sayHello" async="true" /> 
  3. </dubbo:reference> 

服務引用配置完成之后,此時如果直接調用這個方法,將會立即返回 null,內部將會異步執行服務端調用邏輯。

  1. // 此調用會立即返回null 
  2. String world = asyncService.sayHello("world"); 

// 畫個時序圖

如果我們需要獲取服務提供者返回的結果,那么此時需要借助 RpcContext。這個類是 Dubbo 中專門用于保存 「RPC」 調用過程中一些關鍵信息。

因此我們可以借助這個類可以獲取到 「RPC」 很多信息,這次我們主要使用下面的方法獲取 CompletableFuture。

  1. RpcContext.getContext().getCompletableFuture() 

CompletableFuture 是 JDK1.8 之后提供的異步任務增強類,我們可以直接調用其 get 方法直接獲取返回結果。

  1. // 此調用會立即返回null 
  2. String world = asyncService.sayHello("world"); 
  3. // 拿到調用的Future引用,當結果返回后,會被通知和設置到此Future 
  4. CompletableFuture<String> helloFuture = RpcContext.getContext().getCompletableFuture(); 
  5. helloFuture.get(); 

這里需要注意一點。調用get 方法之后,線程就會被阻塞,「直到服務端返回結果或者服務調用超時」。

另外如果不想線程被阻塞,我們可以使用 whenComplete,添加回調方法,然后異步處理返回結果。

  1. // 此調用會立即返回null 
  2. String world = asyncService.sayHello("world"); 
  3. // 拿到調用的Future引用,當結果返回后,會被通知和設置到此Future 
  4. CompletableFuture<String> helloFuture = RpcContext.getContext().getCompletableFuture(); 
  5. // 為Future添加回調 
  6. helloFuture.whenComplete((retValue, exception) -> { 
  7.     if (exception == null) { 
  8.         System.out.println("return value: " + retValue); 
  9.     } else { 
  10.         exception.printStackTrace(); 
  11.     } 
  12. }); 

從上面的例子我們可以看到, Dubbo 消費端異步調用借助了JDK 提供的 CompletableFuture,這個類非常強大,提供的方法也非常多。

小黑哥之前寫過一篇文章,比較完整的介紹了 CompletableFuture的用法,感興趣可以深入學習一下。

// TODO 文章

上面的方式我們使用 xml引用服務,不過現在很多同學應該直接使用 Dubbo 注解引用服務。

如果想直接使用注解方式,其實也非常簡單,只要使用 @Method注解即可。

配置方法如下:

  1. @Reference(interfaceClass = AsyncService.class, 
  2.         timeout = 1000, 
  3.         methods = {@Method(name = "sayHello", async = true)}) 
  4. private AsyncService asyncService; 

第二種方式

第一種方式我們還需要額外修改 Dubbo 相關配置,相對來說比較繁瑣。那第二種方式就不需要做額外配置了,它只要使用 RpcContext#asyncCall就可以直接完成異步調用。

示例代碼如下:

  1. // 使用  asyncCall 異步調用 
  2. CompletableFuture<String> f = RpcContext.getContext().asyncCall(() -> asyncService.sayHello("async call request")); 
  3. // get 將會一直阻塞到服務端返回,或者直到服務調用超時 
  4. System.out.println("async call returned: " + f.get()); 
  5.  
  6. // 異步調用,不關心服務端返回 
  7. RpcContext.getContext().asyncCall(() -> { 
  8.     asyncService.sayHello("one way call request1"); 
  9. }); 

這種方式返回依然是 CompletableFuture對象,操作方式就如同第一種方式。

第三種方式

終于到了最后一種方式了,這種方式與上面兩種方式都不太一樣,其完全不需要借助RpcContext就可以完成,開發流程與普通 Dubbo 服務一樣。

首先需要服務提供者事先定義 CompletableFuture 簽名的服務:

  1. public interface AsyncService { 
  2.     CompletableFuture<String> sayHello(String name); 

「注意接口的返回類型是 CompletableFuture。」

服務端接口實現邏輯如下:

  1. public class AsyncServiceImpl implements AsyncService { 
  2.     private static Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class); 
  3.  
  4.     @Override 
  5.     public CompletableFuture<String> sayHello(String name) { 
  6.         return CompletableFuture.supplyAsync(() -> { 
  7.             try { 
  8.                 Thread.sleep(10000); 
  9.             } catch (InterruptedException e) { 
  10.                 e.printStackTrace(); 
  11.             } 
  12.             return "async response from provider."
  13.         }); 
  14.     } 
  15.  

服務端需要使用 CompletableFuture 完成業務邏輯。

消費端這時就不需要借助了 RpcContext,可以直接調用服務提供者。

  1. // 調用直接返回CompletableFuture 
  2. CompletableFuture<String> future = asyncService.sayHello("async call request"); 
  3. // 增加回調 
  4. future.whenComplete((v, t) -> { 
  5.     if (t != null) { 
  6.         t.printStackTrace(); 
  7.     } else { 
  8.         System.out.println("Response: " + v); 
  9.     } 
  10. }); 
  11. // 早于結果輸出 
  12. System.out.println("Executed before response return."

這種方式對于調用者來就比較方便,無需引入其他對象,可以像使用同步的方式使用異步調用。

其他參數

上面介紹了三種的 Dubbo 異步調用的使用方式,下面主要介紹一下異步調用涉及其他參數。

sent

我們可以在 dubbo:method 設置:

  1. <dubbo:method name="findFoo" async="true" sent="true" /> 

也可以在注解中設置:

  1. @Reference(interfaceClass = XXX.class, 
  2.         version = AnnotationConstants.VERSION, 
  3.         timeout = 1000, 
  4.         methods = {@Method(name = "greeting", timeout = 3000, retries = 1, sent = false)}) 

默認情況下sent=false, Dubbo 將會把消息放入 IO 隊列,然后立刻返回。那這時如果宕機,消息就有可能沒有發送給服務端。

那如果我們將其設置成 sent=true,Dubbo 將會等待消息發送發出才會返回,否則將會拋出異常。

return

Dubbo 異步調用默認將會創建 Future 對象,然后設置到 RpcContext 中。那我們如果不關心返回值,只想單純的異步執行,那我們可以配置 return="false",以此減少 Future 對象的創建和管理成本。

  1. <dubbo:method name="findFoo" async="true" return="false" /> 

總結

今天的文章介紹三種 Dubbo 異步調用的使用方式:

第一種需要修改 Dubbo xml 配置文件或者注解,然后再通過 RpcContext獲取異步 Future對象。

第二種無需修改任何配置文件,我們可以直接通過RpcContext#asyncCall異步完成方法調用,然后獲取異步 Future對象。

第三種無需修改任何配置文件,也無需使用 RpcContext,我們需要定義一個返回值是 CompletableFuture方法,然后服務端與消費端正常開發即可。

這三種方式,第三種對于消費者使用起來最方便,不過個人覺得服務提供者開發起來比較麻煩。

第二種相當于第一種,無需修改配置文件,個人覺得還是比較方便的,所以小黑哥還是傾向于使用第二種方式。

好了,今天的文章就到這里了,下次我們詳細聊聊 Dubbo 異步調用的原理。

 

責任編輯:武曉燕 來源: 小黑十一點半
相關推薦

2009-10-20 16:48:30

C#委托

2022-07-01 08:14:28

Dubbo異步代碼

2009-12-21 14:10:26

WCF異步調用

2009-11-09 10:50:30

WCF異步調用

2009-07-01 13:58:00

JavaScript異

2009-11-06 15:54:15

WCF異步調用

2022-06-17 11:10:43

PandasPolarsPython

2009-07-01 14:05:23

JavaScript異

2009-07-01 14:23:46

JavaScript異

2009-07-01 14:37:14

JavaScript異

2010-02-22 13:28:05

WCF異步調用

2009-08-21 11:24:16

C#異步調用

2009-07-01 14:31:01

JavaScript異

2011-03-02 08:57:22

jQueryJavaScript

2012-10-29 10:59:27

Windows 8

2021-03-29 09:26:44

SpringBoot異步調用@Async

2010-01-11 17:24:19

VB.NET異步調用

2009-12-07 14:26:47

WCF異步調用

2009-12-07 14:35:42

WCF異步調用

2024-07-31 15:57:41

點贊
收藏

51CTO技術棧公眾號

中老年在线免费视频| 蜜桃久久一区二区三区| 99久久99视频只有精品| 91精品一区二区三区在线观看| 亚洲国产欧美不卡在线观看 | 亚洲国产影院| 亚洲网址你懂得| 日本特黄在线观看| 蜜桃av在线| 亚洲日本va在线观看| 精品中文字幕一区| 国产精品特级毛片一区二区三区| 日韩一区二区久久| 日韩一中文字幕| 久久久久久久久久久国产精品| 激情久久一区二区| 天天综合色天天| 男人天堂成人网| 国产玉足榨精视频在线观看| 国产精品91xxx| 久久久久久久久久久人体| 中字幕一区二区三区乱码| 日本少妇精品亚洲第一区| 欧美综合视频在线观看| 可以在线看黄的网站| 日本精品专区| 成人午夜短视频| 亚洲www永久成人夜色| 亚洲欧美另类在线视频| 老熟女高潮一区二区三区| 精品人妻无码一区二区色欲产成人| 亚洲黄色免费| 欧美日韩电影在线观看| av在线播放中文字幕| 最新亚洲精品| 亚洲国产一区二区三区在线观看 | 亚洲欧美激情在线视频| 一级黄色电影片| 久久国产精品免费一区二区三区| 欧美性一区二区| 日韩精品一区二区三区色欲av| av人人综合网| 亚洲综合一区二区精品导航| 中文字幕色一区二区| jizz在线免费观看| 国产欧美精品国产国产专区| 欧美裸体网站| 激情小视频在线观看| 91啦中文在线观看| 裸模一区二区三区免费| 性猛交xxxx| 99久久伊人精品| 精品国产一区二区三区麻豆小说 | 性一交一乱一伧老太| 韩国女主播成人在线观看| 国产欧美精品久久久| 亚洲性猛交富婆| 麻豆一区二区99久久久久| 国产精品日韩电影| 怡春院在线视频| 精品一区二区免费看| 成人天堂噜噜噜| 国产深喉视频一区二区| 国产高清不卡一区| 国产精品国产精品| 五月婷婷丁香网| 久久久精品黄色| 午夜精品福利一区二区| 香蕉视频免费在线播放| 亚洲三级在线播放| 福利在线一区二区| 午夜影视一区二区三区| 色噜噜夜夜夜综合网| 在线观看免费视频高清游戏推荐| 香蕉久久一区| 欧美成人性战久久| 少妇光屁股影院| 成人免费av| 免费不卡在线观看av| 国产在线欧美在线| 久久天堂成人| 国产欧美va欧美va香蕉在| 精品毛片一区二区三区| 91在线免费视频观看| 欧美亚洲丝袜| a级毛片免费观看在线| 亚洲一区在线电影| 国产熟人av一二三区| 中文成人在线| 亚洲精品福利在线观看| 国产激情av在线| 黄色成人在线网址| 日韩免费视频在线观看| 国产精品怡红院| a级精品国产片在线观看| 日韩高清av电影| 2021国产在线| 91成人国产精品| 国内自拍偷拍视频| 日韩国产一区| 高清一区二区三区日本久| 超碰在线观看91| 国产999精品久久久久久绿帽| 欧洲亚洲一区二区三区四区五区| 国内精品久久久久久野外| 欧美日韩亚洲精品内裤| 在线一区二区不卡| 精品一区在线| 欧美极品少妇xxxxⅹ裸体艺术| 久草视频在线免费| 成人晚上爱看视频| 一区二区冒白浆视频| 性欧美freesex顶级少妇| 欧美高清视频一二三区 | 亚洲欧美怡红院| 男人揉女人奶房视频60分| 精品国模一区二区三区欧美 | 免费黄色片网站| 亚洲国产激情| 92国产精品久久久久首页| 国产午夜视频在线观看| 无码av免费一区二区三区试看 | 爱爱精品视频| 久久视频在线播放| 亚洲av人无码激艳猛片服务器| 成人午夜短视频| 久久久久福利视频| 9.1麻豆精品| 综合欧美国产视频二区| 黄色av网站免费观看| av一区二区三区四区| 无码毛片aaa在线| 亚洲精品无播放器在线播放| 中国人与牲禽动交精品| 手机看片久久久| 97久久精品人人爽人人爽蜜臀 | 97人人爽人人澡人人精品| 制服丝袜亚洲播放| 亚洲欧美另类日本| 日本欧美在线观看| 日韩在线三级| 精品成人免费一区二区在线播放| 精品无人国产偷自产在线| 日产精品久久久久久久| 成人美女视频在线观看18| 国产美女作爱全过程免费视频| 国产日韩中文在线中文字幕| 北条麻妃在线一区二区| 国产精品亚洲lv粉色| 亚洲欧美日韩一区| 在线播放黄色av| 欧美a级在线| 国产精华一区| av日韩国产| 日韩精品在线免费观看| av大全在线观看| 久久奇米777| 国产精品人人爽人人爽| 91麻豆精品国产91久久久平台| 国产精品毛片a∨一区二区三区|国| 岛国在线大片| 欧美日韩免费一区二区三区视频| 貂蝉被到爽流白浆在线观看| 精品一区二区三区在线视频| 中日韩在线视频| 欧州一区二区三区| 97视频在线观看免费高清完整版在线观看 | 蜜桃一区二区三区在线| 伊人久久99| 日韩一区二区三区高清在线观看| 欧美激情综合亚洲一二区| 天天操天天射天天| 在线免费观看成人短视频| 国产黄色片在线| 国产大陆a不卡| 久久久999视频| 欧美色婷婷久久99精品红桃| 91精品视频播放| 1区2区3区在线| 国产一区二区免费| 国产精品一区二区免费视频| 亚洲第一在线综合网站| av男人的天堂av| 国产一区欧美二区| 国产视频九色蝌蚪| 久久资源中文字幕| 国产欧美亚洲日本| 欧美日韩精品一区二区三区视频| 久久精品久久精品亚洲人| 黄色av免费观看| 欧美在线免费观看视频| 久艹视频在线观看| 中文字幕欧美国产| 97人妻精品一区二区三区免费| 日韩不卡一二三区| 成年在线观看视频| 成人情趣视频网站| 国产日本一区二区三区| 欧美一级做a| 欧美制服第一页| 在线免费观看污| 亚洲少妇激情视频| 欧美 中文字幕| 欧美日韩国产影片| 欧美一区二区激情视频| 亚洲欧美日韩系列| 国产成人免费观看网站| aaa亚洲精品| 亚洲综合在线一区二区| 日韩制服丝袜av| 真人抽搐一进一出视频| 91精品亚洲| 深田咏美在线x99av| 欧洲vs亚洲vs国产| av成人免费观看| 色成人综合网| 国产精品成人一区二区| 亚洲风情在线资源| 欧美精品久久久久a| 免费网站黄在线观看| 亚洲性av网站| 毛片在线播放网址| 精品亚洲一区二区三区| 刘亦菲久久免费一区二区| 91精品国产全国免费观看| 姑娘第5集在线观看免费好剧| 欧美性猛交xxxx富婆| 国产在线视频你懂的| 一区二区三区免费网站| 天天色影综合网| 中文字幕一区二区三区蜜月| 一级特黄曰皮片视频| 国产无一区二区| 欧洲美一区二区三区亚洲| 91免费观看视频| 亚洲一区二区三区综合| 成人动漫av在线| 影音先锋资源av| 成人一区二区三区视频| 国产精品熟妇一区二区三区四区| 国产精品一二三| 九九热99视频| 久久 天天综合| 激情文学亚洲色图| 黄色小说综合网站| 交换做爰国语对白| 国产精品自拍在线| 色诱av手机版| 成人激情动漫在线观看| 人妻换人妻a片爽麻豆| 成人国产电影网| 2一3sex性hd| 26uuu亚洲婷婷狠狠天堂| 免费看黄色aaaaaa 片| 91丝袜美腿高跟国产极品老师| 特大黑人巨人吊xxxx| 久久久久久久综合| 欧美成人久久久免费播放| 国产精品国产精品国产专区不蜜| 日本 欧美 国产| 一区二区三区在线视频免费| 欧美日韩在线视频免费| 亚洲大片一区二区三区| 亚洲一区欧美在线| 色婷婷精品大在线视频| 亚洲视屏在线观看| 欧美电影影音先锋| 成人小说亚洲一区二区三区| 亚洲国产欧美在线成人app | 久久久久99精品久久久久| www视频在线看| 97国产精品视频人人做人人爱| 成人免费直播| 国产精品亚洲片夜色在线| 国产亚洲精aa在线看| 精品久久久久久亚洲| 欧美日韩伦理| 日本精品福利视频| 免费一级欧美片在线播放| 国产视频1区2区3区| 成人听书哪个软件好| 东方伊人免费在线观看| 亚洲精品v日韩精品| 日韩一区二区视频在线| 欧美三级视频在线播放| 亚洲狼人综合网| 国产亚洲成av人片在线观看桃| 久久精品视频观看| 91sao在线观看国产| 亚州欧美在线| 久久亚洲综合网| 欧美激情四色| 黄色av免费在线播放| 国产成人免费视频一区| 中文字幕免费高清| 一区二区三区日韩| 高潮毛片又色又爽免费| 日韩视频一区在线观看| 毛片在线播放网站| 欧美乱大交做爰xxxⅹ性3| 希岛爱理一区二区三区av高清| 成人黄色午夜影院| 美日韩中文字幕| 白白操在线视频| 久久精品国产秦先生| 性欧美丰满熟妇xxxx性久久久| 中文字幕中文在线不卡住| 国产精品久久久久久久久久久久久久久久久 | 亚洲一区电影777| 亚洲在线视频播放| 亚洲欧美日韩在线高清直播| 欧美草逼视频| 成人黄色大片在线免费观看| 国产亚洲电影| 亚洲熟妇av一区二区三区漫画| 国内精品视频一区二区三区八戒| 无码 人妻 在线 视频| 午夜精品在线看| 亚洲国产精品国自产拍久久| 精品国产欧美一区二区三区成人| 黄色综合网址| 精品综合久久久| 国产日韩欧美一区在线| 欧美xxxx日本和非洲| 亚洲精品乱码久久久久久| 在线免费一级片| 视频直播国产精品| 亚洲永久av| 久久精品一区二区三区不卡免费视频| 欧美国产精品| 初高中福利视频网站| 日韩理论片在线| 国产精品色综合| 久久久国产成人精品| 欧美91在线|欧美| 这里只有精品66| 毛片一区二区三区| 国精产品视频一二二区| 欧美视频在线播放| 在线观看a视频| 国产精品一久久香蕉国产线看观看| 久久av资源| 青青在线免费观看视频| 国产精品网站在线播放| 这里只有久久精品视频| 国产亚洲精品久久久久久777 | 色狠狠一区二区三区香蕉| 蝌蚪视频在线播放| 国产91精品在线播放| 精品成av人一区二区三区| 亚洲乱码国产一区三区| 国产欧美日韩在线观看| 在线免费观看日韩视频| 日韩中文字幕免费看| 日韩三级不卡| 真人抽搐一进一出视频| 久久免费精品国产久精品久久久久| 啦啦啦免费高清视频在线观看| 亚洲欧美中文日韩v在线观看| 性欧美hd调教| 在线观看日本一区| 国产成人激情av| 日本三级视频在线| 亚洲欧洲中文天堂| 久久久久久久性潮| 天天做天天躁天天躁| 99国产精品99久久久久久| 无码人妻精品一区二区三区不卡| 伊人亚洲福利一区二区三区| 日韩一级视频| 可以在线看的av网站| 国产午夜亚洲精品午夜鲁丝片| 97成人在线观看| 久久久久久中文| 精品午夜久久| 岛国大片在线免费观看| 精品欧美一区二区三区| 自拍视频在线| 国产精品乱子乱xxxx| 日韩精品一卡二卡三卡四卡无卡| 天海翼在线视频| 亚洲国产私拍精品国模在线观看| 国产香蕉久久| 日本精品久久久久久久久久| 欧美激情一区二区在线| 亚洲第一精品网站| 国产经典一区二区| 欧美日本中文| 成人黄色a级片| 精品国产一区二区三区不卡 | 国产精品扒开腿做爽爽| 777奇米四色成人影色区| 咪咪网在线视频| 久久久久久久久影视| 久久精品视频一区二区三区| 国产av无码专区亚洲av| 国产成人av网址| 亚洲精品极品| 暗呦丨小u女国产精品| 亚洲欧美成人精品|