一个基于protocol buffer的RPC实现
2015-04-15 22:52
155 查看
一个基于protocol
buffer的RPC实现
Protocol Buffer仅仅是提供了一套序列化和反序列化结构数据的机制,本身不具有RPC功能,但是可以基于其实现一套RPC框架。
Services
protocol buffer的Services类型是专门用来给RPC实现定义服务用的。定义示例如下:
一个RPC实现
代码在这(https://github.com/persistentsnail/easy_pb_rpc)
协议
| Length of Encoding Binary Data (unsigned int) | RpcRequestData or RpcResponseData |。
客户端
支持RPC同步异步调用,例如:
服务端
首先注册服务,就是创建Service的实现类对象,放到容器里面。然后在一个网络端口上监听连接,解析网络数据包,根据不同请求在服务容器里面找合适的service调用相应method。实现的比较简单,一个单线程服务器,同时只能处理一个请求。一个提供EchoService服务的server代码看起来是这样:
一些protocol buffer的细节
1. 之前用到了service_id,要在双端同时维护一份service id和name互相对应的配置文件,不利于部署和更新。protocol buffer可以通过DescriptorPool自省出自己有哪些服务和方法的,可以参见http://www.cnblogs.com/Solstice/archive/2011/04/03/2004458.html。所以在定义协议的时候可以直接用servicename而不是id,而那份配置文件自然也不需要。客户端用服务名字做一个RPC请求,服务端通过名字判断是否自己存在这个服务。相应的method_id也可以考虑用method name。但是用id也是有好处,id是数值类型使用的Base 128 Varints变长编码比字符串表示的name生成的数据包更小,另外数值做的哈希应该比DescriptorPool通过名字查找服务类更快。
2.应该充分使用protocol buffer错误处理方式,那就是使用RpcController 来做错误跟踪。
3.协议字段类型多使用optional,因为required字段是必须有数据的,相反optional却不一定需要,如果没有就是一个默认值。optional类型通常用来升级协议,比如一个Message添加了一个新的optinal字段,以前使用老的Message格式的代码序列出来的Message仍然能够被使用新的Message格式的代码正确解析,因为optional字段不存在,他会使用默认值;类似的,使用新的Message格式的代码序列出来的Message也能够被使用老的Message格式的代码正确解析,因为他会忽略不认识的字段,而且他不丢掉这个字段,也就是这个Message还能被继续正确的传输。
相关文章推荐
- 采用Best effort 1pc + 回滚补偿机制实现的一个distributed transaction (分布式事务框架).基于dubbo rpc服务上实现。
- Hadoop基于Protocol Buffer的RPC实现代码分析-Server端
- Hadoop基于Protocol Buffer的RPC实现代码分析-Server端
- 基于akka与scala实现一个简单rpc框架
- Java实现一个简单的RPC框架(五) 基于Socket的传输层实现
- Hadoop基于Protocol Buffer的RPC实现代码分析-Server端
- Hadoop基于Protocol Buffer的RPC实现代码分析-Server端--转载
- Hadoop基于Protocol Buffer的RPC实现代码分析-Server端
- 在DNS中为一个域名配置多个IP地址实现负载和分流---基于WINDOWS服务器
- js如何判断一个对象是array ,instanceof 是基于什么实现的呢?
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
- 基于httpclient的一个简单刷票器实现
- 用Silverlight 1.0实现一个基于客户端系统时间的电子表。
- 基于protobuf的RPC实现
- Java实现简单的RPC调用(基于TCP协议)
- 生产消费者4 - 实现一个基于优先级的传输队列【消费顺序是由优先级决定的而不是抵达时间】
- 基于非阻塞socket的多线程服务器的实现------一个服务器如何与多个客户端进行通信?
- enginx:基于openresty,一个前后端统一,生态共享的webstack实现
- 在Linux下基于tcp协议实现一个简单的通信
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!