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 及其以外
博客索引