一个C++编写的服务器框架 - bifang

一个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/log.cpp, src/log.h, configs/log.json

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: http://www.ietf.org/rfc/rfc3986.txt), 里面有详细的说明, 官方的正则与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/ 目录, 执行命令 ./create.sh 模块名, 即可在module目录下生成对应名称的模块模板, 并且自动添加编译信息进Makefile里面, 可在生成之后进去module目录编译以验证是否生成成功

9. 应用模块目录

目前基于前面的http, websocket, servlet来实现了几个简单模块, 需要根据系统环境作出适当修改才可以正确运行

联系方式

作者: bifang
QQ: 1125498083
邮箱: [email protected]
博客地址: https://blog.csdn.net/weixin_43798887
github: https://github.com/bifang-fyh/bifang

你可能感兴趣的:(C/C++技术实战,c++,http,websocket,rpc,后端)