# sylar_server **Repository Path**: zhaohai_smart/sylar_server ## Basic Information - **Project Name**: sylar_server - **Description**: 学习sylar的服务器框架所写代码 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2021-12-20 - **Last Updated**: 2021-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # README.md ## 概述 本项目为C++高性能服务器框架,参照sylar的b站视频所写,b站地址https://www.bilibili.com/video/BV184411s7qF 目前完成了当前视频所述的所有基础模块的封装.包括`[日志模块, 配置模块, 线程模块, 协程模块, 协程调度模块, IO协程调度模块, IOhook模块, 文件管理模块, 网络Socket模块, 数据序列化模块, TCP/HTTP模块] `项目会在之后自己的学习中逐渐添加其他模块, 当前的最终目标是完整的使用c++封装一个高性能服务器框架, 并采用该框架作为服务端, 使用全CPP构建一个OnlineJudge系统后fengzhua端和服务端. 欢迎大家一起学习. 感谢sylar大佬提供的视频~ 本人wx联系方式: MildDec 欢迎大家一起学习 ## 项目拉取与配置 1. 首先通过gitee拉取模块 `git clone git@gitee.com:MildDec/sylar_server.git` 2. 修改CMakeLists.txt 的include路径到当前文件路径 3. 安装依赖库 * yaml-cpp的安装 ``` git clone https://github.com/jbeder/yaml-cpp.git cd yaml-cpp mkdir build cd build cmake -DBUILD_SHARED_LIBS=ON .. make sudo make install ``` * boost库的安装 ``` apt-get install mpi-default-dev apt-get install libicu-dev apt-get install libbz2-dev  apt-get install libboost-dev ``` * openssl的安装 ``` sudo apt-get install openssl sudo apt-get install libssl-dev ``` ## 项目路径 ``` bin -- 二进制文件 build -- 中间文件路径 cmake -- cmake函数文件夹 lib -- 库文件输出路径 sylar -- 源码路径 test -- 测试代码 example --一些实例 CMakeList.txt -- Cmake的定义文件 ``` ## 项目模块 ### 1. 日志模块 #### 接口 ``` 输出方式: 采用流式方式进行输出日志, 输出落地到logger的Appenders成员中. SYLAR_LOG_DEBUG(logger) SYLAR_LOG_INFO(logger) SYLAR_LOG_WARN(logger) SYLAR_LOG_ERROR(logger) SYLAR_LOG_FATAL(logger) ----------------------- 输出方式: 采用类似printf的按照FMT指定的formatter进行日志输出 SYLAR_LOG_FMT_DEBUG(logger, fmt, ...) SYLAR_LOG_FMT_INFO(logger, fmt, ...) SYLAR_LOG_FMT_WARN(logger, fmt, ...) SYLAR_LOG_FMT_ERROR(logger, fmt, ...) SYLAR_LOG_FMT_FATAL(logger, fmt, ...) ---------------------- 创建/获取logger SYLAR_LOG_ROOT() 得到root logger SYLAR_LOG_NAME(name) 根据name查询LoggerMgr中对应的日志器 ---------------------- 操作Logger的成员Appender void addAppender(LogAppender::ptr appender); void delAppender(LogAppender::ptr appender); void clearAppenders(); ---------------------- 日志formatter的格式化方法 * %m 消息体 * %p level * %r 启动后的时间 * %c 日志名称 * %t 线程id * %n 回车换行 * %d 时间 * %f 文件名 * %l 行号 * %T tab * %F 协程id 其他接口都无需直接操作.具体需要可到log.h源码中查看 日志配置最好直接配置在yaml中, 在程序运行前先加载配置yml文件 ``` #### 实现细节 通过一个LoggerManager的单例维护一个map管理所有的logger. Logger: 对于单个logger,拥有各自的日志名称,日志级别, 以及输出的落地位置LogAppender和输出格式LogFormatter. LogAppender: LogAppender也都运行拥有自己的LogFormatter, 可以针对不同的输出位置, 输出不同格式的日志. LogAppender根据输出位置不同, 分为标准输出appender和文件输出Appender. LogFormatter: 通过传入格式的字符串解析成一个个的FormatterItem, 针对不同的FormatterItem输出对应的内容. LogEvent: 真正输出的日志对象是LogEvent, 包含了所有可以输出的信息, 比如文件名, 行号, 线程id, 协程id等等信息, 将LogEvent作为参数, 传入Logger的log函数, 从而将LogEvent中的信息按照LogFormatter所指定的格式输出到对应的LogAppender中. LogEventWrap: 为了更方便的输出, 封装了一个LogEventWrap, 在析构函数中获取LogEvent需要输出的内容文本, 并将其输出到对应的appender中. 并通过宏传入对应的logEvent的信息, 加入LogEventWrap中, 构建局部空间, 放入LogEventWrap. ### 2. 配置模块 #### 接口 ``` --------------------------- Config:: 查询配置的值, 若不存在则设置默认值和配置描述, 配置名不区分大小写. static typename ConfigVar::ptr Lookup(const std::string& name, const T& default_value, const std::string& description = ""); 查询配置的值, 不存在则返回空指针, 配置名不区分大小写. static typename ConfigVar::ptr Lookup(const std::string& name); 通过自定义cb函数查看config的值. static void Visit(std::function cb); 从yaml文件中读取配置文件更新到配置中. static void LoadFromYaml(const YAML::Node& root); ConfigVar:: 获取配置项的值 const T getValue(); 设置配置项的值 void setValue(const T& v); 获取配置项类型名 std::string getTypeName(); 添加配置项的监听 uint64_t addListener(on_change_cb cb); ``` #### 实现细节 采用yaml格式文件进行配置文件的读写格式, 采用github开源库yaml-cpp库进行yaml文件的解析, 并通过实现LexicalCast的泛化特化实现了基本数据类型以及map, set等数据类型的支持, 并通过Config类存储所有的配置项的值. 并通过添加listener的方式进行配置项变动的更新监听. ConfigVarBase: 作为虚基类, 提供配置名和配置描述的获取 ConfigVar: 配置项, 实现从yaml文件中读取并通过LexicalCast转化为对应类型存储. LexicalCast: 仿函数实现string到特定类型/特定类型到string的转化, 从而实现configVar的存储. Config: 负责所有的配置项的管理, 提供查找配置项, 设置配置项初值的方法. ### 3. 线程模块 ### 4. 协程模块