基于protobuf的RPC实现
来源:互联网 发布:易安卓播放器源码 编辑:程序博客网 时间:2024/04/30 07:47
可以对照使用google protobuf RPC实现echo service一文看,细节本文不再描述。
google protobuf只负责消息的打包和解包,并不包含RPC的实现,但其包含了RPC的定义。假设有下面的RPC定义:
那么要实现这个RPC需要最少做哪些事?总结起来需要完成以下几步:
客户端
RPC客户端需要实现google::protobuf::RpcChannel
。主要实现RpcChannel::CallMethod
接口。客户端调用任何一个RPC接口,最终都是调用到CallMethod
。这个函数的典型实现就是将RPC调用参数序列化,然后投递给网络模块进行发送。
服务端
服务端首先需要实现RPC接口,直接实现MyService
中定义的接口:
标示service&method
基于以上,可以看出服务端根本不知道客户端想要调用哪一个RPC接口。从服务器接收到网络消息,到调用到MyServiceImpl::Echo
还有很大一段距离。
解决方法就是在网络消息中带上RPC接口标识。这个标识可以直接带上service name和method name,但这种实现导致网络消息太大。另一种实现是基于service name和method name生成一个哈希值,因为接口不会太多,所以较容易找到基本不冲突的字符串哈希算法。
无论哪种方法,服务器是肯定需要建立RPC接口标识到protobuf service对象的映射的。
这里提供第三种方法:基于option的方法。
protobuf中option机制类似于这样一种机制:service&method被视为一个对象,其有很多属性,属性包含内置的,以及用户扩展的。用户扩展的就是option。每一个属性有一个值。protobuf提供访问service&method这些属性的接口。
首先扩展service&method的属性,以下定义这些属性的key:
应用层定义service&method时可以指定以上key的值:
以上相当于在整个应用中,每个service都被赋予了唯一的id,单个service中的method也有唯一的id。
然后可以通过protobuf取出以上属性值:
考虑到serviceId
methodId
的范围,可以直接打包到一个32位整数里:
uint32_t ret = (serviceId << 16) | methodId;
然后就可以把这个值作为网络消息头的一部分发送。
当然服务器端是需要建立这个标识值到service的映射的:
服务端收到RPC调用后,取出这个标识值,然后再从_rpcCallMap
中取出对应的service和method,最后进行调用:
参考
- 基于protobuf的RPC实现
- 基于protobuf的RPC实现
- 基于protobuf的RPC实现
- 基于protobuf的RPC实现
- 基于protobuf的RPC实现
- 基于protobuf的RPC实现
- 基于protobuf的RPC实现
- Hadoop 基于protobuf 的RPC的服务器端实现原理
- Hadoop 基于protobuf 的RPC的客户端实现原理
- 基于Protobuf和Libuv实现RPC
- protobuf+RPC的几个C++实现
- Protobuf+RPC的几个C++实现
- protobuf RPC实现
- 基于HTTP/2和protobuf的RPC框架GRPC
- 基于protobuf service使用rpc入门教程
- 以小见大——那些基于 protobuf 的五花八门的 RPC(1)
- 以小见大——那些基于 protobuf 的五花八门的 RPC(2)
- 以小见大——那些基于 protobuf 的五花八门的 RPC(3)
- Hadoop分布式文件系统:架构和设计要点
- 山东省第一届ACM大学生程序设计竞赛(原题) 回顾 4.18
- OC中简单内存开辟 初始化
- 第八周【项目1-实现复数类中的运算符重载】
- 疯狂JAVA之学习笔记(5)----------注释
- 基于protobuf的RPC实现
- shell条件判断之test命令实例详解
- 树分治(hdu5016-2014西安现场赛)
- UITableView---初始化
- 深入剖析jsp的工作原理
- SQL with as 的用法 以及递归函数的写法
- 神经网络与机器学习导言笔记——网络结构与知识表示
- 清除float常用方法(:after和clear:both)
- Unity3D修改脚本模板