日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Dubbo基本原理机制

發(fā)布時(shí)間:2025/3/12 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dubbo基本原理机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

分布式服務(wù)框架:

  • 高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案
  • SOA服務(wù)治理方案
  • Apache MINA 框架基于Reactor模型通信框架,基于tcp長(zhǎng)連接

Dubbo缺省協(xié)議采用單一長(zhǎng)連接和NIO異步通訊,
適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,以及服務(wù)消費(fèi)者機(jī)器數(shù)遠(yuǎn)大于服務(wù)提供者機(jī)器數(shù)的情況
分析源代碼,基本原理如下:

  • client一個(gè)線程調(diào)用遠(yuǎn)程接口,生成一個(gè)唯一的ID(比如一段隨機(jī)字符串,UUID等),Dubbo是使用AtomicLong從0開(kāi)始累計(jì)數(shù)字的
  • 將打包的方法調(diào)用信息(如調(diào)用的接口名稱,方法名稱,參數(shù)值列表等),和處理結(jié)果的回調(diào)對(duì)象callback,全部封裝在一起,組成一個(gè)對(duì)象object
  • 向?qū)iT(mén)存放調(diào)用信息的全局ConcurrentHashMap里面put(ID, object)
  • 將ID和打包的方法調(diào)用信息封裝成一對(duì)象connRequest,使用IoSession.write(connRequest)異步發(fā)送出去
  • 當(dāng)前線程再使用callback的get()方法試圖獲取遠(yuǎn)程返回的結(jié)果,在get()內(nèi)部,則使用synchronized獲取回調(diào)對(duì)象callback的鎖, 再先檢測(cè)是否已經(jīng)獲取到結(jié)果,如果沒(méi)有,然后調(diào)用callback的wait()方法,釋放callback上的鎖,讓當(dāng)前線程處于等待狀態(tài)。
  • 服務(wù)端接收到請(qǐng)求并處理后,將結(jié)果(此結(jié)果中包含了前面的ID,即回傳)發(fā)送給客戶端,客戶端socket連接上專門(mén)監(jiān)聽(tīng)消息的線程收到消息,分析結(jié)果,取到ID,再?gòu)那懊娴腃oncurrentHashMap里面get(ID),從而找到callback,將方法調(diào)用結(jié)果設(shè)置到callback對(duì)象里。
  • 監(jiān)聽(tīng)線程接著使用synchronized獲取回調(diào)對(duì)象callback的鎖(因?yàn)榍懊嬲{(diào)用過(guò)wait(),那個(gè)線程已釋放callback的鎖了),再notifyAll(),喚醒前面處于等待狀態(tài)的線程繼續(xù)執(zhí)行(callback的get()方法繼續(xù)執(zhí)行就能拿到調(diào)用結(jié)果了),至此,整個(gè)過(guò)程結(jié)束。
  • 當(dāng)前線程怎么讓它“暫停”,等結(jié)果回來(lái)后,再向后執(zhí)行?

    答:先生成一個(gè)對(duì)象obj,在一個(gè)全局map里put(ID,obj)存放起來(lái),再用synchronized獲取obj鎖,再調(diào)用obj.wait()讓當(dāng)前線程處于等待狀態(tài),然后另一消息監(jiān)聽(tīng)線程等到服 務(wù)端結(jié)果來(lái)了后,再map.get(ID)找到obj,再用synchronized獲取obj鎖,再調(diào)用obj.notifyAll()喚醒前面處于等待狀態(tài)的線程。

    正如前面所說(shuō),Socket通信是一個(gè)全雙工的方式,如果有多個(gè)線程同時(shí)進(jìn)行遠(yuǎn)程方法調(diào)用,這時(shí)建立在client server之間的socket連接上會(huì)有很多雙方發(fā)送的消息傳遞,前后順序也可能是亂七八糟的,server處理完結(jié)果后,將結(jié)果消息發(fā)送給client,client收到很多消息,怎么知道哪個(gè)消息結(jié)果是原先哪個(gè)線程調(diào)用的?

    答:使用一個(gè)ID,讓其唯一,然后傳遞給服務(wù)端,再服務(wù)端又回傳回來(lái),這樣就知道結(jié)果是原先哪個(gè)線程的了。

    總結(jié)

    以上是生活随笔為你收集整理的Dubbo基本原理机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。