构建自己的rpc protocol

rpc的的框架写过好几个了,协议部分大都是参照redis mysql mongodb 的协议来实现的,其中有一个已经在生产环境中运行了几个月了,到目前为止运行良好。用现有的一些协议来进行通信有一个好处就是,rpc的client部分只是简单的封装一下他们现有client 的实现就可以。不好的地方就是现有的协议有很多内容不是你真正想要的,比如我在用mongodb的协议在实现一个rpc的时候,我只用到了他的query请求,但是我要在server端实现跟query相关的一系列的协议处理。这并不是我想要的。

当然要完全实现自己的一套协议的话,需要做的也很多:要实现自己的client,rpc消息的打包解包啊之类的工作,和使用redis mysql mongodb 的协议相比我更喜欢一个纯粹的比较干净的rpc协议。

先说一下这个rpc的用途吧,前端用nodejs调用后端的接口然后进行视图的渲染,后端用golang提供数据层的封装。综合考虑之后决定使用bson来进行数据的编码和解码。

一个请求分为两部分:消息头 和 消息体。

消息头:

消息头用四个字节表示,采用大端字节序进行表示,这样的话每个数据包最大可以是2的32次方,如果消息体有20个字节的话。消息头应该就是这样的:

00000000 00000000 00000000 00010100

消息体:

消息体主要分为四种:call reply error info,并全部采用bson编码。

call 消息体的格式为:

{call:{funcname:'function name',arguments:'arguments'}}

reply 消息体的格式为:

{reply:'result'}  or  {reply:noreply}

error 消息体的格式为:

{error:{message:'message',detail:'detail'}}

message: 是一个标示符,用来表示错误类型

detail:是错误的描述 注意这里的错误信息有时候会返回给用户

info 消息体的格式:

暂时先保留

以上这些基本上能满足我的需求了,下一步就是实现了。

此条目发表在 未分类 分类目录。将固定链接加入收藏夹。

评论功能已关闭。