一、前言
在第五弹中我们对项目的功能进行了讲解,接下来我们就服务端的角度,来设计对应模块,帮助服务端实现项目的三个功能:
● rpc调用
● 服务的注册与发现以及服务的下线/上线通知
● 消息的发布订阅
二、正文
1. 服务端的功能需求
在进行服务端具体的模块划分之前,我们先来明确下服务端的功能需求
● 基于网络通信接受客户端的请求,提供rpc服务
● 基于网络通信接受客户端的请求,提供服务注册与发现,上线&下线通知
● 基于网络通信接受客户端的请求,提供主题操作(创建/删除/订阅/取消),消息发布
2. 服务端的模块划分
基于上述的功能,我们对服务端可以划分出这么几个模块
● ***work:网络通信模块
● Protocol: 应用层通信协议模块
● Dispatcher:消息分发处理模块
● RpcRouter: 远端调用路由功能模块
● Publish-Subcriber: 发布订阅模块
● Registry-Discovery:服务注册/发现/上线/下线功能模块
● Server:基于以上模块整合而出的服务端模块
3. ***work模块
该模块为网络通信模块,实现底层的网络通信功能,这个模块本质上也是一个比较复杂庞大的模块块,由于项目的重点在于Rpc,因此该模块我们使用陈硕大佬的Muduo库来进行搭建
4. Protocol
当我们有了***work模块,双方就可以进行通信了,但是由于采取的TCP协议,因此数据在传输的时候,有可能会出现粘包问题,因此就需要存在应用层通信协议模块:解析数据,解决通信中有可能存在的粘包问题,能够获取到一条完整的消息
在前面的muduo库的基本使用中,我们能够知道想要让一个服务端/客户端对消息处理,就要设置一个onMessage的回调函数,在这个函数中对收到的数据进行应用层协议处理
而Protocol模块就是网络通信协议模块的设计,也就是在网络通信中,我们必须设计一个应用层的网络通信协议出来,以解决网络通信中可能存在的粘包问题,而解决粘包问题有三种方式:特殊字符间隔,定长,LV格式