- 采用了muduo网络库中的主从Reactor反应堆模型, 借用epoll技术实现多路IO复用, 增加并行服务的数量。
- 针对客户端与服务器端的RPC请求和响应,使用Protobuf作为数据序列化和反序列化的私有通信协议。
- 以Zookeeper作为消息中间件, 建立了分布式服务配置中心,所有服务器端的RPC节点均需要向配置中心注册服。客户端在配置中心可以查询到要调用的对应服务的ip地址、端口号等信息,进行远程调用。
- 日志系统采用了单例设计模式,提供了线程安全的异步日志缓冲队列写入操作。
远程调用需传递服务对象、函数方法、函数参数,经序列化成字节流后传给提供服务的服务器,服务器接收到数据后反序列化成服务对象、函数方法、函数参数,并发起本地调用,将响应结果序列化成字节流,发送给调用方,调用方接收到后反序列化得到结果,并传给本地调用。
- 序列化:对象转为字节序列称为对象的序列化
- 反序列化:字节序列转为对象称为对象的反序列化
常见序列化和反序列化协议有XML、JSON、PB,相比于其他PB更有优势:跨平台语言支持,序列化和反序列化效率高速度快,且序列化后体积比XML和JSON都小很多,适合网络传输。
XML | JSON | PB | |
---|---|---|---|
保存方式 | 文本 | 文本 | 二进制 |
可读性 | 较好 | 较好 | 不可读 |
解析效率 | 慢 | 一般 | 快 |
语言支持 | 所有语言 | 所有语言 | C++/Java/Python及第三方支持 |
适用范围 | 文件存储、数据交互 | 文件存储、数据交互 | 文件存储、数据交互 |
注意:序列化和反序列化可能对系统的消耗较大,因此原则是:远程调用函数传入参数和返回值对象要尽量简单,具体来说应避免:
远程调用函数传入参数和返回值对象体积较大,如传入参数是List或Map,序列化后字节长度较长,对网络负担较大 远程调用函数传入参数和返回值对象有复杂关系,传入参数和返回值对象有复杂的嵌套、包含、聚合关系等,性能开销大 远程调用函数传入参数和返回值对象继承关系复杂,性能开销大
ubuntu18.04 + cmake + protobuf + muduo + zookeeper
./autobuild.sh
- rpc服务器端
- rpc客户端
- zookeeper查看节点信息 可查看到注册成功的节点
- zk查看节点的值
- tcpdump抓包分析