-
Notifications
You must be signed in to change notification settings - Fork 990
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: sylar-yin <564628276@qq.com>
- Loading branch information
Showing
1 changed file
with
53 additions
and
160 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,161 +1,54 @@ | ||
# sylar | ||
|
||
## 项目介绍 | ||
C++的高性能服务器框架,支持协程,线程,hook,Http,Websocket,SSL,日志模块,配置模块等模块 | ||
支持动态库方式,加载业务代码,支持业务热更新 | ||
使用方式: | ||
|
||
### 编译库 | ||
``` | ||
git clone https://github.com/sylar-yin/sylar.git | ||
cd sylar | ||
make | ||
make -j | ||
``` | ||
|
||
### 使用库创建项目 | ||
sh generate.sh ${project-name} ${name-space} | ||
cd ${project-name} | ||
make | ||
make -j | ||
sh move.sh #编译完成后,move可执行文件和动态库 | ||
bin/${project-name} -s #执行 | ||
|
||
### 依赖环境和安装 | ||
请参考下面链接 | ||
http://www.sylar.top/blog/?p=135 | ||
|
||
## 视频教程地址 | ||
0. [C++高级教程-从零开始开发服务器框架(sylar)](https://www.bilibili.com/video/av53602631/ "") | ||
1. [C++服务器框架01_日志系统01](https://www.bilibili.com/video/av52778994/?from=www.sylar.top "") | ||
2. [C++服务器框架02_日志系统02_logger](https://www.bilibili.com/video/av52906685/?from=www.sylar.top "") | ||
3. [C++服务器框架03_日志系统03_appender](https://www.bilibili.com/video/av52906934/?from=www.sylar.top "") | ||
4. [C++服务器框架04_日志系统04_formatter](https://www.bilibili.com/video/av52907828/?from=www.sylar.top "") | ||
5. [C++服务器框架05_日志系统05_formatter2](https://www.bilibili.com/video/av52907987/?from=www.sylar.top "") | ||
6. [C++服务器框架06_日志系统06_编译调试](https://www.bilibili.com/video/av52908593/?from=www.sylar.top "") | ||
7. [C++服务器框架07_日志系统07_完善日志系统](https://www.bilibili.com/video/av52908471/?from=www.sylar.top "") | ||
8. [C++服务器框架08_日志系统08_完善日志系统2](https://www.bilibili.com/video/av52908727/?from=www.sylar.top "") | ||
9. [C++服务器框架09_配置系统01_基础配置](https://www.bilibili.com/video/av52909181/?from=www.sylar.top "") | ||
10. [C++服务器框架10_配置系统02_yaml](https://www.bilibili.com/video/av52909223/?from=www.sylar.top "") | ||
11. [C++服务器框架11_配置系统03_yaml整合](https://www.bilibili.com/video/av52909256/?from=www.sylar.top "") | ||
12. [C++服务器框架12_配置系统04_复杂类型的支持](https://www.bilibili.com/video/av52990220/?from=www.sylar.top "") | ||
13. [C++服务器框架13_配置系统05_更多stl容器支持](https://www.bilibili.com/video/av52991045/?from=www.sylar.top "") | ||
14. [C++服务器框架14_配置系统06_自定义类型的支持](https://www.bilibili.com/video/av52992071/?from=www.sylar.top "") | ||
15. [C++服务器框架15_配置系统07_配置变更事件](https://www.bilibili.com/video/av52992614/?from=www.sylar.top "") | ||
16. [C++服务器框架16_配置系统08_日志系统整合01](https://www.bilibili.com/video/av52993407/?from=www.sylar.top "") | ||
17. [C++服务器框架17_配置系统09_日志系统整合02](https://www.bilibili.com/video/av52994250/?from=www.sylar.top "") | ||
18. [C++服务器框架18_配置系统10_日志系统整合03](https://www.bilibili.com/video/av52995442/?from=www.sylar.top "") | ||
|
||
## 开发环境 | ||
Centos7 | ||
gcc 9.1 | ||
cmake | ||
ragel | ||
|
||
## 项目路径 | ||
bin -- 二进制 | ||
build -- 中间文件路径 | ||
cmake -- cmake函数文件夹 | ||
CMakeLists.txt -- cmake的定义文件 | ||
lib -- 库的输出路径 | ||
Makefile | ||
sylar -- 源代码路径 | ||
tests -- 测试代码 | ||
|
||
## 日志系统 | ||
1) | ||
Log4J | ||
|
||
Logger (定义日志类别) | ||
| | ||
|-------Formatter(日志格式) | ||
| | ||
Appender(日志输出地方) | ||
|
||
|
||
## 配置系统 | ||
|
||
Config --> Yaml | ||
|
||
yamp-cpp: github 搜 | ||
mkdir build && cd build && cmake .. && make install | ||
|
||
```cpp | ||
YAML::Node node = YAML::LoadFile(filename); | ||
node.IsMap() | ||
for(auto it = node.begin(); | ||
it != node.end(); ++it) { | ||
it->first, it->second | ||
} | ||
|
||
node.IsSequence() | ||
for(size_t i = 0; i < node.size(); ++i) { | ||
|
||
} | ||
|
||
node.IsScalar(); | ||
``` | ||
|
||
配置系统的原则,约定优于配置: | ||
|
||
```cpp | ||
template<T, FromStr, ToStr> | ||
class ConfigVar; | ||
|
||
template<F, T> | ||
LexicalCast; | ||
|
||
//容器片特化,目前支持vector | ||
//list, set, map, unordered_set, unordered_map | ||
// map/unordered_set 支持key = std::string | ||
// Config::Lookup(key) , key相同, 类型不同的,不会有报错。这个需要处理一下 | ||
``` | ||
|
||
自定义类型,需要实现sylar::LexicalCast,片特化 | ||
实现后,就可以支持Config解析自定义类型,自定义类型可以和常规stl容器一起使用。 | ||
|
||
配置的事件机制 | ||
当一个配置项发生修改的时候,可以反向通知对应的代码,回调 | ||
|
||
# 日志系统整合配置系统 | ||
```yaml | ||
logs: | ||
- name: root | ||
level: (debug,info,warn,error,fatal) | ||
formatter: '%d%T%p%T%t%m%n' | ||
appender: | ||
- type: (StdoutLogAppender, FileLogAppender) | ||
level:(debug,...) | ||
file: /logs/xxx.log | ||
``` | ||
```cpp | ||
sylar::Logger g_logger = sylar::LoggerMgr::GetInstance()->getLogger(name); | ||
SYLAR_LOG_INFO(g_logger) << "xxxx log"; | ||
``` | ||
|
||
# 视频地址 | ||
[\[C++高级教程\]从零开始开发服务器框架(sylar)](https://www.bilibili.com/video/av53602631/?from=www.sylar.top "") | ||
# 视频教程内容: | ||
## 1.日志模块 | ||
支持流式日志风格写日志和格式化风格写日志,支持日志格式自定义,日志级别,多日志分离等等功能 | ||
流式日志使用:SYLAR_LOG_INFO(g_logger) << "this is a log"; | ||
格式化日志使用:SYLAR_LOG_FMT_INFO(g_logger, "%s", "this is a log"); | ||
支持时间,线程id,线程名称,日志级别,日志名称,文件名,行号等内容的自由配置 | ||
## 2.配置模块 | ||
采用约定由于配置的思想。定义即可使用。不需要单独去解析。支持变更通知功能。使用YAML文件做为配置内容。支持级别格式的数据类型,支持STL容器(vector,list,set,map等等),支持自定义类型的支持(需要实现序列化和反序列化方法)使用方式如下: | ||
```cpp | ||
static Logger::ptr g_log = SYLAR_LOG_NAME("system"); //m_root, m_system-> m_root 当logger的appenders为空,使用root写logger | ||
``` | ||
|
||
```cpp | ||
//定义LogDefine LogAppenderDefine, 偏特化 LexicalCast, | ||
//实现日志配置解析 | ||
``` | ||
|
||
|
||
## 协程库封装 | ||
|
||
## socket函数库 | ||
|
||
## http协议开发 | ||
|
||
## 分布协议 | ||
|
||
## 推荐系统 | ||
|
||
## 联系方式 | ||
QQ:564628276 | ||
邮箱:564628276@qq.com | ||
微信:sylar-yin | ||
QQ群:8151915(sylar技术群) | ||
个人主页:http://www.sylar.top | ||
static sylar::ConfigVar<int>::ptr g_tcp_connect_timeout = | ||
sylar::Config::Lookup("tcp.connect.timeout", 5000, "tcp connect timeout"); | ||
``` | ||
定义了一个tcp连接超时参数,可以直接使用 g_tcp_connect_timeout->getValue() 获取参数的值,当配置修改重新加载,该值自动更新 | ||
上述配置格式如下: | ||
```sh | ||
tcp: | ||
connect: | ||
timeout: 10000 | ||
``` | ||
## 3.线程模块 | ||
线程模块,封装了pthread里面的一些常用功能,Thread,Semaphore,Mutex,RWMutex,Spinlock等对象,可以方便开发中对线程日常使用 | ||
为什么不适用c++11里面的thread | ||
本框架是使用C++11开发,不使用thread,是因为thread其实也是基于pthread实现的。并且C++11里面没有提供读写互斥量,RWMutex,Spinlock等,在高并发场景,这些对象是经常需要用到的。所以选择了自己封装pthread | ||
## 4.协程模块 | ||
协程:用户态的线程,相当于线程中的线程,更轻量级。后续配置socket hook,可以把复杂的异步调用,封装成同步操作。降低业务逻辑的编写复杂度。 | ||
目前该协程是基于ucontext_t来实现的,后续将支持采用boost.context里面的fcontext_t的方式实现 | ||
## 5.协程调度模块 | ||
协程调度器,管理协程的调度,内部实现为一个线程池,支持协程在多线程中切换,也可以指定协程在固定的线程中执行。是一个N-M的协程调度模型,N个线程,M个协程。重复利用每一个线程。 | ||
## 6.IO协程调度模块 | ||
继承与协程调度器,封装了epoll(Linux),并支持定时器功能(使用epoll实现定时器,精度毫秒级),支持Socket读写时间的添加,删除,取消功能。支持一次性定时器,循环定时器,条件定时器等功能 | ||
## 7.Hook模块 | ||
hook系统底层和socket相关的API,socket io相关的API,以及sleep系列的API。hook的开启控制是线程粒度的。可以自由选择。通过hook模块,可以使一些不具异步功能的API,展现出异步的性能。如(mysql) | ||
## 8.Socket模块 | ||
封装了Socket类,提供所有socket API功能,统一封装了地址类,将IPv4,IPv6,Unix地址统一起来。并且提供域名,IP解析功能。 | ||
## 9.ByteArray序列化模块 | ||
ByteArray二进制序列化模块,提供对二进制数据的常用操作。读写入基础类型int8_t,int16_t,int32_t,int64_t等,支持Varint,std::string的读写支持,支持字节序转化,支持序列化到文件,以及从文件反序列化等功能 | ||
## 10.TcpServer模块 | ||
基于Socket类,封装了一个通用的TcpServer的服务器类,提供简单的API,使用便捷,可以快速绑定一个或多个地址,启动服务,监听端口,accept连接,处理socket连接等功能。具体业务功能更的服务器实现,只需要继承该类就可以快速实现 | ||
## 11.Stream模块 | ||
封装流式的统一接口。将文件,socket封装成统一的接口。使用的时候,采用统一的风格操作。基于统一的风格,可以提供更灵活的扩展。目前实现了SocketStream | ||
## 12.HTTP模块 | ||
采用Ragel(有限状态机,性能媲美汇编),实现了HTTP/1.1的简单协议实现和uri的解析。基于SocketStream实现了HttpConnection(HTTP的客户端)和HttpSession(HTTP服务器端的链接)。基于TcpServer实现了HttpServer。提供了完整的HTTP的客户端API请求功能,HTTP基础API服务器功能 | ||
## 13.Servlet模块 | ||
仿照java的servlet,实现了一套Servlet接口,实现了ServletDispatch,FunctionServlet。NotFoundServlet。支持uri的精准匹配,模糊匹配等功能。和HTTP模块,一起提供HTTP服务器功能 | ||
## 14.其他相关 | ||
联系方式: | ||
QQ:564628276 | ||
邮箱:564628276@qq.com | ||
微信:sylar-yin | ||
QQ群:8151915(sylar技术群) | ||
个人主页:www.sylar.top | ||
github:https://github.com/sylar-yin/sylar |