Go 部落格

JSON-RPC:介面趣聞軼事

Andrew Gerrand
2010 年 4 月 27 日

在此我們說明一個範例,顯示 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 及其他
部落格索引