一个C++编写的服务器框架 - bifang
- 框架简介
- 1. 源代码目录结构
- 2. 日志模块
- 3. 协程相关
- 4. Socket相关
- 5. TcpServer模块
- 6. HTTP模块
- 7. 配置模块
- 8. 模块生成脚本
- 9. 应用模块目录
- 联系方式
框架简介
bifang是一个依赖少,可复刻性高的基于协程的简单服务器框架
1. 源代码目录结构
-
configs/ 配置文件目录
-
create/ 应用生成脚本目录
-
html/ html文件目录(与对应的网络服务配合使用)
-
module/ 应用文件目录
-
src/ 源代码目录
-
test/ 测试文件目录
2. 日志模块
-
支持流式和格式化的日志风格, 支持日志格式自定义, 可通过配置文件进行配置
-
目前支持文件名, 文件行号, 程序运行时间, 线程id, 协程id, 日志时间, 线程名称, 日志级别等配置
-
使用之前需在当前代码文件调用NameLogger(name), RootLogger()或者SystemLogger(), 以定义一个全局的日志器
-
流式日志使用: log_debug << “bifang log”;
-
格式化日志使用: log_fmt_debug("%s", “bifang log”);
-
更多使用方法详见src/, src/, configs/
3. 协程相关
-
协程封装: 该协程基于ucontext_t来实现用户态的线程, 比线程更轻量级
-
协程调度器: 用于管理协程的调度, 内部为一个线程池, 协程可以在多个线程中切换, 也可以指定协程在固定的线程中执行. 是一个N-M的协程调度模型, N个线程, M个协程, 重复利用每一个线程
-
IO协程调度模块: 继承于协程调度器, 内部封装了epoll, 支持定时器功能, 支持任意fd读写事件的添加,删除,取消功能. 支持一次性定时器, 循环定时器, 条件定时器等
-
hook封装: 参考腾讯的libco代码, 通过hook系统层面上的部分API, 使协程调度器接管系统api的非阻塞的过程, 可以把复杂的异步调用,封装成同步操作. 降低业务逻辑的编写复杂度. hook的开启控制是线程粒度的, 可以*选择(在实现对应的hook函数的情况下任何fd均可被接管)
4. Socket相关
- 封装了Socket类, 提供所有socket API功能, 统一封装了地址类,将IPv4和IPv6地址在一定程度上统一起来. 并提供对应的域名, IP解析功能。
5. TcpServer模块
- 基于Socket类, 封装了一个通用的TcpServer类, 可以快速绑定一个或多个地址, 启动服务, 监听端口, 接收连接, 处理socket连接等功能. 后续的http, websocket均继承自该类
6. HTTP模块
-
使用Ragel来编写HTTP/1.1和uri解析的代码
-
uri正则表达式可参照(RFC 3986: /rfc/), 里面有详细的说明, 官方的正则与ragel的语法稍有不同, 需参照ragel官方使用文档来进行适当修改
-
http请求和响应解析参照了Mongrel2进行实现的
-
Servlet模块: 仿照java的servlet, 实现了一套Servlet接口, 并支持uri的精准匹配, 模糊匹配等功能.
-
websocket模块: 基于http实现了简单的websocket模块, 和HTTP, servlet一起配合提供网络服务
7. 配置模块
使用JSON格式文件作为配置文件(JSON不支持注释, 所以不能对配置文件注释, 可以自行保存一份备份文件后再去大幅度修改配置信息). 支持变更通知功能, 支持STL容器(vector, forward_list, list, set, unordered_set, map, unordered_map), 支持自定义类型的支持(需要自行实现序列化和反序列化方法)
8. 模块生成脚本
- 进入 create/ 目录, 执行命令 ./ 模块名, 即可在module目录下生成对应名称的模块模板, 并且自动添加编译信息进Makefile里面, 可在生成之后进去module目录编译以验证是否生成成功
9. 应用模块目录
目前基于前面的http, websocket, servlet来实现了几个简单模块, 需要根据系统环境作出适当修改才可以正确运行
联系方式
作者: bifang
QQ: 1125498083
邮箱: 1125498083@
博客地址: /weixin_43798887
github: /bifang-fyh/bifang