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/article/details/79263854socket