遠端過程呼叫 RPC——服務端註冊實現原理分析
rpc server 程式碼參考我前一篇博文:https://www.cnblogs.com/zuoyang/p/18146870
RPC Server端的RPC程式碼架構主要由兩大部分構成:
- 第一部分是服務方法的註冊過程。在這個過程中,我們首先透過呼叫
rpc.Register
介面將服務物件(如示例中的StringService
)的方法進行註冊。rpc.Register
函式內部會利用反射機制,自動提取出服務物件中滿足RPC介面要求的方法(即那些接收兩個引數且返回error
型別結果的方法),並將這些方法的資訊儲存在一個內部的方法對映表中。在我們的Server端程式碼中,rpc.Register(service)
這行程式碼就完成了StringService
中的Concat
和Diff
方法的註冊,使得這些方法可以被遠端呼叫。 - 第二部分是處理來自網路的RPC呼叫。Server端會監聽指定的埠(如示例中的
:1234
),等待客戶端的連線。一旦有客戶端連線成功,Server就會讀取傳入的資料包,解碼RPC請求,並根據請求中指定的方法名從方法對映表中查詢到對應的方法。然後,Server會透過反射呼叫該方法,將結果編碼後傳送回客戶端。在我們的Server端程式碼中,這部分邏輯是透過l.Accept()
接受連線,並使用rpc.ServeConn(conn)
來處理每一個RPC請求實現的。
- 第一部分是服務方法的註冊過程。在這個過程中,我們首先透過呼叫
關於第一部分的處理步驟,可以概括為以下幾個環節:
- 首先,透過
rpc.Register(service)
註冊StringService
中的RPC方法,如Concat
。 - 接著,
rpc
包利用Go語言的反射功能,自動獲取已註冊方法的詳細資訊,如方法名、引數型別和返回值型別等。 - 最後,這些資訊被儲存在RPC伺服器的內部資料結構中,以便在處理客戶端的RPC呼叫時能夠快速定位和執行相應的方法。
- 首先,透過