已完成分布式通信C++17项目 01

RPC Framework

从一次远程调用出发,把协议、网络、服务发现和连接复用拆成可理解、可运行的 C++ 工程。

核心依赖Protobuf · muduo · ZooKeeper
关键能力多 Reactor · 服务发现 · 一致性哈希
最新压测原生 16952 · Docker 16633 QPS

项目做了什么

客户端不直接依赖服务端地址,而是通过服务名找到可用节点。Protobuf 负责消息定义与序列化,muduo 提供 Reactor 网络模型,Zookeeper 保存服务注册信息并通过 Watcher 感知节点变化。

项目还包含连接池和一致性哈希,让调用方可以复用 TCP 长连接,并把请求稳定地分配到服务节点。

一次调用经过哪些层

Caller
  │
  ├─ RpcChannel:根据服务名选择节点
  ├─ ConnectionPool:复用 TCP 长连接
  ├─ Protobuf:序列化请求与响应
  ├─ Zookeeper:注册、发现、Watcher 更新
  └─ Provider:反序列化并分发到具体方法
  │
  └─ Response

这条链路把业务方法和传输细节分离开来:业务只描述服务和方法,框架负责寻址、编码、连接和回包。

技术取舍

  • TCP + 自定义消息头:在 Protobuf 二进制数据外增加长度和类型信息,处理粘包与拆包。
  • 临时节点 + Watcher:服务进程退出或会话断开后,注册信息可以随连接状态清理,客户端收到变化后刷新本地节点列表。
  • 连接池 + 一致性哈希:减少重复建连,并让节点变化时的请求迁移范围更可控。

实验记录

最新测试包含 100 个并发线程、每线程 1,000 次调用,共 100,000 次请求,两种环境均为 0 次失败。Ubuntu 原生环境约 16952 QPS,Docker Compose 环境约 16633 QPS。

该结果只描述当前实现、配置和测试环境,不作为跨机器性能结论。后续优化清单已经记录服务就绪等待、请求超时重试、连接失效检测、连接池动态扩缩容、协议版本和集成测试。