该项目是在 Linux 环境下基于 muduo、Protobuf 和 Zookeeper 实现的一个轻量级 RPC 框架。可以把单体架构系统的本地方法调用,重构成基于 TCP 网络通信的 RPC 远程方法调用,实现统一台机器不同进程或者不同机器之间的服务调用。
- 基于 muduo 网络库实现高并发网络通信模块,作为 RPC 同步调用的基础。
- 基于 Protobuf 实现 RPC 方法调用和参数的序列化和反序列化,并根据其提供得 RPC 接口编写 RPC 服务。
- 基于 ZooKeeper 分布式协调服务中间件提供服务注册和服务发现功能。
- 设计了基于 TCP 传输的二进制协议,解决粘包问题,且能够高效传输服务名、方法名以及参数。
- 操作系统:
Ubuntu 18.04.6 LTS
- 编译器:
g++ 7.5.0
- 编辑器:
vscode
- 版本控制:
git
- 项目构建:
cmake 3.10.2
运行脚本,其会自动编译项目
bash autobuild.sh
我们需要在 zookeeper 上获取注册的服务信息,因此先必须保证启动了 zookeeper。我的 zookeeper 目录在 /home/shang/thirdparty/zookeeper-3.4.10
。
在里面的 bin
目录下有客户端和服务端的启动脚本,先启动 zookeeper 服务。
root@iZwz9eojvzsrz78f673t51Z:# ./zkServer.sh start
此时可以在进程中查找到 zookeeper
再启动服务端脚本,启动客户端主要是为了看是否会因为我们的 RPC 框架插入新服务信息。
root@iZwz9eojvzsrz78f673t51Z:# ./zkCli.sh
在 bin
目录下有客户端和服务端两个文件,分别启动。
client server test.conf
./server -i test.conf
我们观察下打印的信息,可以看到它打印了 test.conf
配置文件的信息,至少说明 RPC 框架读取配置是成功的。
重点是下面的信息,其显示在 zookeeper 上注册了服务。
我们去 zookeeper 上查看是否真的插入了新服务,发现确实如此。
./client -i test.conf
有很多的提示信息,也是解析了配置文件,并且有许多 zookeeper 相关日志信息。这里注意最重要的几个地方,它打印显示了 rpc Login response success:0
。响应为 0,RPC 方法调用成功!
- 引入 Nginx 负载均衡模块
- 封装 RPC 连接池,重用连接
- 增加 Router 层次,在 RPC 服务的众多服务器集群中选择某一节点