背景与目标
回顾之前的功能规划,我们明确了项目的核心目标。现在聚焦于服务端架构,进行模块划分,以支撑以下三个关键功能:
- RPC 调用
- 服务的注册与发现,以及上线/下线通知
- 消息的发布与订阅
需求分析与模块设计
服务端功能需求
在具体划分模块前,先明确服务端需要承担的职责:
- 基于网络通信接收客户端请求,提供 RPC 服务
- 基于网络通信接收请求,提供服务注册与发现、上线及下线通知
- 基于网络通信接收请求,提供主题操作(创建/删除/订阅/取消)及消息发布
模块划分方案
基于上述需求,我们将服务端划分为以下几个核心模块:
- Network:负责底层的网络通信功能
- Protocol:负责应用层通信协议的设计与解析
- Dispatcher:负责消息的分发与处理
- RpcRouter:负责远端调用的路由功能
- Publish-Subscriber:负责发布订阅机制
- Registry-Discovery:负责服务注册、发现及状态通知
- Server:整合以上模块的最终服务端入口
Network 模块
该模块是网络通信的基础,负责实现底层的网络通信功能。虽然这是一个相对庞大且复杂的模块,但考虑到项目重点在于 RPC 业务逻辑的实现,我们可以复用成熟的开源库来降低开发成本。这里选用陈硕开发的 Muduo 库 来搭建网络层。
Protocol 模块
有了 Network 模块后,双方具备了通信能力。但由于 TCP 协议本身是流式的,数据传输过程中可能会出现粘包问题。因此,必须引入应用层通信协议模块:解析数据,解决通信中可能存在的粘包问题,确保能获取到一条完整的消息。
在使用 Muduo 库时,我们需要设置 onMessage 回调函数来处理收到的数据。Protocol 模块的核心设计就在于此,即定义一套应用层协议规范。解决粘包问题通常有三种常见方式:特殊字符间隔、定长格式或 LV(Length-Value)格式。根据实际场景选择合适的方案至关重要。


