
前言
在上一节梳理完项目功能后,本节从服务端视角出发,设计对应模块以实现 RPC 调用、服务注册发现及消息发布订阅三大核心功能。
服务端功能需求
在进行具体的模块划分之前,我们先明确一下服务端需要承担的职责:
- 基于网络通信接收客户端请求,提供 RPC 服务
- 基于网络通信接收客户端请求,提供服务注册与发现及上下线通知
- 基于网络通信接收客户端请求,提供主题操作(创建/删除/订阅/取消)及消息发布
服务端模块划分
基于上述功能需求,我们可以将服务端划分为以下几个核心模块:
- Network:网络通信模块
- Protocol:应用层通信协议模块
- Dispatcher:消息分发处理模块
- RpcRouter:远端调用路由功能模块
- Publish-Subscriber:发布订阅模块
- Registry-Discovery:服务注册/发现/上线/下线功能模块
- Server:整合以上模块的服务端主入口
Network 模块
该模块负责底层的网络通信功能。虽然这是一个相对复杂庞大的模块,但鉴于项目的重点在于 RPC 业务逻辑的实现,我们直接采用陈硕开发的 Muduo 库来搭建,以节省底层开发成本并保证稳定性。
Protocol 协议层
有了 Network 模块,双方即可建立连接进行通信。但由于底层采用的是 TCP 协议,数据在传输过程中可能会出现粘包问题,因此必须引入应用层通信协议模块。
Protocol 模块的设计目标是在网络通信中定义一套规则,解析数据流,解决可能存在的粘包问题,确保能够获取到一条完整的消息。在前面的 Muduo 库使用中,我们知道可以通过设置 onMessage 回调函数来处理收到的数据,而 Protocol 模块正是这一处理逻辑的核心载体。
解决粘包问题通常有三种方式:特殊字符间隔、定长以及 LV 格式(Length-Value)。在实际设计中,我们需要根据业务场景选择最合适的方案。


