JSON-RPC: a tale of interfaces
Last updated: Nov 21, 2022
JSON-RPC: 接口的故事
原文信息
- 地址:JSON-RPC: a tale of interfaces
- 作者:Andrew Gerrand
- 时间:2010年4月27号
中文译文
这里(这篇文章)我们提供一个例子,Go的interfaces 重构代码后会让代码更加灵活并具有更好的拓展性。
最初,标准库里面的RPC package使用了一个叫gob 的自定义连接(传输)格式。对于一个特定的应用,我们希望能使用JSON作为一个可选连接(传输)格式。
我们先定义了一对interface去描述存在的连接(传输)格式,一个给到客户端,一个给到服务端(如下所示)。
type ServerCodec interface {
ReadRequestHeader(*Request) error
ReadRequestBody(interface{}) error
WriteResponse(*Response, interface{}) error
Close() error
}
在服务端代码,我们将两个内部方法的声明进行改变,输入参数从之前的gob.Encoder
变为ServerCodec
。下面就是其中一个内部方法。
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的轻量级、面向组合的类型系统提供了一种构建可伸缩代码的方法。
下一篇文章:New Talk and Tutorials
上一篇文章:Third-party libraries: goprotobuf and beyond
博客地址