Go 部落格
JSON-RPC:介面的故事
這裡我們展示了一個例子,Go 的 介面 使重構現有程式碼變得容易,使其更靈活和可擴充套件。最初,標準庫的 RPC 包 使用了一個名為 gob 的自定義網路傳輸格式。對於一個特定的應用,我們想使用 JSON 作為另一種網路傳輸格式。
我們首先定義了一對介面來描述現有網路傳輸格式的功能,一個用於客戶端,一個用於伺服器(如下所示)。
type ServerCodec interface {
ReadRequestHeader(*Request) error
ReadRequestBody(interface{}) error
WriteResponse(*Response, interface{}) error
Close() error
}
在伺服器端,我們將兩個內部函式的簽名改為接受 ServerCodec
介面,而不是我們現有的 gob.Encoder
。其中一個如下所示:
func sendResponse(sending *sync.Mutex, req *Request,
reply interface{}, enc *gob.Encoder, errmsg string)
變為
func sendResponse(sending *sync.Mutex, req *Request,
reply interface{}, enc ServerCodec, errmsg string)
然後我們編寫了一個簡單的 gobServerCodec
包裝器來重現原始功能。從那裡構建一個 jsonServerCodec
就變得簡單了。
在對客戶端進行了類似的更改後,這就是我們在 RPC 包上需要做的全部工作。整個過程大約花了20分鐘!整理並測試新程式碼後,最終的變更集 被提交了。
在像 Java 或 C++ 這樣的面向繼承的語言中,顯而易見的做法是泛化 RPC 類,並建立 JsonRPC 和 GobRPC 子類。然而,如果你想進行與該層級結構正交的進一步泛化,這種方法就會變得棘手。(例如,如果你要實現一個備用的 RPC 標準)。在我們的 Go 包中,我們採取了一條概念上更簡單且需要編寫或更改更少程式碼的路徑。
對於任何程式碼庫來說,可維護性都是一個至關重要的品質。隨著需求的改變,輕鬆乾淨地調整程式碼是必不可少的,否則程式碼會變得難以處理。我們相信 Go 輕量級、面向組合的型別系統提供了一種可擴充套件的程式碼結構化方式。
下一篇文章:新的講座和教程
上一篇文章:第三方庫:goprotobuf 及更多
部落格索引