JSON-RPC:建立一个接口的流程|Go主题月

882 阅读2分钟

在这里,我们展示了一个例子,Go的接口使重构现有代码变得更加容易,从而使其更加灵活和可扩展,标准库的RPC包使用了一种名为gob的自定义线格式。对于一个特定的应用程序,我们希望使用JSON作为一种替代的线格式。

我们首先定义了一对接口来描述现有wire格式的功能,一个用于客户机,一个用于服务器(如下所示)。

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)

to

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 的轻量级、面向组合的类型系统提供了一种可扩展的代码结构化手段。

GO外文翻译计划blog.golang.org/json-rpc