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