Dubbo併發通訊原理解析
阿新 • • 發佈:2019-02-26
1.消費者一個執行緒呼叫遠端介面,生成一個唯一的ID(比如一段隨機字串,UUID等),Dubbo是使用AtomicLong從0開始累計數字的。
2.將方法呼叫資訊(如呼叫的介面名稱,方法名稱,引數值列表等)和處理結果的回撥物件callback(即ResponseFuture物件),全部封裝在一起組成一個物件object。向專門存放呼叫資訊的全域性ConcurrentHashMap裡面put(ID, object)。
3.將ID和打包的方法呼叫資訊封裝成一物件connRequest,通過Netty非同步傳送出去。
4.當前執行緒再使用callback的get()方法試圖獲取遠端返回的結果,在get()內部,則使用lock.lock()獲取回撥物件callback的鎖, 再先檢測是否已經獲取到結果,如果沒有,然後呼叫callback的wait()方法,釋放callback上的鎖,讓當前執行緒處於等待狀態。
5.服務端接收到請求並處理後,將結果(此結果中包含了前面的ID,即回傳)傳送給客戶端,客戶端socket連線上專門監聽訊息的執行緒收到訊息,分析結果,取到ID,再從前面的ConcurrentHashMap裡面get(ID),從而找到callback,將方法呼叫結果設定到callback物件裡。
6.監聽執行緒接著使用lock.lock()獲取回撥物件callback的鎖,再呼叫signal()(類似notifyAll())方法喚醒前面處於等待狀態的執行緒繼續執行。至此,整個過程結束。
附原始碼:https://blog.csdn.net/u010942020/art