# server **Repository Path**: lastbreath/server ## Basic Information - **Project Name**: server - **Description**: No description available - **Primary Language**: C++ - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-25 - **Last Updated**: 2025-05-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # server ## 开发环境 Ubuntu22.04 gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) cmake version 3.22.1 ## 项目路径 bin -- 可执行二进制文件 CMakeLists.txt -- cmake的定义文件 lib -- 库文件 Makefile -- make依赖文件 (由cmake生成) server -- 源码路径 test -- 测试代码 include -- 第三方库头文件路径(yaml-cpp), 第三方库编译安装后复制而来 conf -- 配置文件夹 ## 日志系统 类Log4J日志系统 ```mermaid graph TD A[Logger] --Formatter--> B[Appender] ``` ## 配置系统 ```mermaid graph LR A[Config]-->B[Yaml] ``` yaml-cpp: ```bash git clone https://github.com/jbeder/yaml-cpp.git cd yaml-cpp mkdir build && cd build cmake .. && make sudo make install ``` ```cpp YAML::Node node = YAML::LoadFile(filename); node.IsMap() for(auto it : node) { it->first; it->second; } node.IsSequence() for(auto i : node.size()) { } node.IsScalar(); 配置系统的原则, 约定优于配置: ```cpp template class ConfigVar; template LexicalCast; //容器偏特化, 目前只支持vector //list, set, map unordered_set, unordered_map 2025.5.8 //! Config""Lookup(key), key相同,类型不同,不会报错 ``` 自定义类型,需要实现server::LexicalCast片特化后,就可以支持Config解析自定义类型,自定义类型可以和常规的stl容器使用。 配置的事件机制(观察者模式) 当一个配置项发生修改的时候,可以通过反向通知对应的代码,回调 ## 日志系统整合配置系统 25.5.9 ```yaml log: - name: root level: (debug, info, warn, erro, fatal) formatter: '%d%T%p%T%t%m%m' appender: - type: (StdoutLogAppender, FileLogAppender) level: (debug, ...) file: /logs/xxx.log ``` ```cpp server::Logger g_logger = server::LoggerMgr::GetInstance()->getLogger(name); SERVER_LOG_INFO(g_logger) << "XXXX"; // 一般情况下,在没有自己定义日志的时候,写日志时自动写入根日志,那么在定义好一个日志器时,如何在使用时自动的去找到这个日志器。 ``` ```cpp static Logger::ptr g_log = SERVER_LOG_NAME("system"); //m_root, m_system->m_root 当logger的appenders为空时,使用root写logger ``` ```cpp //定义LogDefine以及LogAppenderDefine, 偏特化 LexicalCast, //实现日志配置解析 ``` ```cpp ``` 遗留问题: 1. appender人定义的formatter读取yaml的时候,没有被初始化 2. 去掉额外的std::out调试信息 3. 修改绝对路径为相对路径(日志输出时) 4. 添加从yaml中正常读取level UML总结 ## 线程库 Thread, Mutex Pthread pthread pthread_create 互斥量 mutex 信号量 semaphore ! 为什么使用pthread而不直接使用c++11的std线程 因为c++11中只有一种互斥量没有读写分离的方式,在大并发的情况下,往往许多数据是写少读多,如果读写分离,则性能会大大提升。 整合日志和线程同步互斥 logger, appender 但是锁的性能很差,(spinlock性能好一点)不需要目态和管态之间切换,不需要涉及上下文的这种切换,占据cpu忙等 spinlock替换mutex(性能好) 写文件 周期性 reopen 整合配置的同步和互斥 ## 协程库封装 协程:用户态,线程中的线程 定义协程接口 ucontext_t 制定一些自己的macro方便调试 非对称协程 每个线程里面只有一个main协程, Thread->main_fiber <------> sub_fiber ^ | | V sub_fiber ## sockect函数库 ## http协议开发 ## 分布协议 ## 推荐系统 ## busybox制作根文件系统时最好使用静态链接