项目概述:该项目使用C++17编写,从零设计并实现了一个高性能网络库,整体参考muduo的核心设计理念采用了多Reactor模型。在此基础上使用不同的通信协议分别开发了三个应用系统:轻量级HTTP服务器、RPC微服务框架以及支持集群部署的聊天服务器。
1.网络库服务端采用了one loop per thread的主从Reactor模型,每个IO线程对应一个处理IO事件的循环。每个事件循环底层基于epoll + LT的非阻塞IO多路复用模式高效处理网络IO,并采用eventfd作为事件通知描述符实现跨线程的唤醒和派发任务,同时基于红黑树定时器结构,通过timerfd高效处理定时任务。网络库客户端采用单Reactor模型,支持连接失败或者连接断开后的自动重试或重连机制。 2.网络库为每个 TCP 连接设计实现了用户态发送与接收缓冲区,有效避免网络IO阻塞问题。完整处理 TCP 通信的”三个半事件”,并精准管理连接生命周期。 3.依靠自实现的内存缓冲区输出流构建了网络库的日志系统,支持同步日志和异步日志两种写入方式。异步日志采用双缓冲复用技术减少动态内存分配开销,由独立的后端线程定时将前端日志批量写入磁盘,避免数据落盘时阻塞网络服务线程。 4.基于已实现的网络库,开发了简易的HTTP服务器。通过有限状态机解析HTTP请求报文,支持GET方法及静态资源的响应服务。 5.基于已实现的网络库,实现了接口易用的RPC通信框架。采用Protobuf实现RPC方法调用及其参数的二进制序列化与反序列化,并利用其反射机制生成的服务接口编写具体RPC服务。自定义二进制通信协议,有效解决粘包与拆包问题,精准传输服务名、方法名及参数。集成ZooKeeper实现服务注册与发现,支持动态扩缩容与故障节点剔除,构建可扩展的微服务通信体系。 6.基于已实现的网络库,实现了一个包含用户注册与登录、添加好友、单人聊天和群组聊天等功能的集群聊天服务器。私有通信协议采用JSON对消息进行序列化与反序列化。数据持久化使用MySQL数据库,并实现数据库连接池从而显著提升数据库访问效率。通过配置Nginx基于TCP的负载均衡,实现聊天服务器的集群部署,提升后端服务的并发处理能力。借助Redis的发布—订阅功能,实现多个在线客户端之间的跨服务器消息通信。