# CoServer-C++基于协程实现的Tcp/Http服务器
## 模块概述
### 日志模块
支持流式日志风格写日志和格式化风格写日志,支持日志格式自定义,日志级别,多日志分离等等功能。
流式日志使用:
```cpp
SYLAR_LOG_INFO(g_logger) << "this is a log";
```
格式化日志使用:
```cpp
SYLAR_LOG_FMT_INFO(g_logger, "%s", "this is a log");
```
日志支持自由配置日期时间,累计运行毫秒数,线程id,线程名称,协程id,日志线别,日志名称,文件名,行号。
### 配置模块
采用约定优于配置的思想。定义即可使用。支持变更通知功能。使用YAML文件做为配置内容,配置名称大小写不敏感。支持级别格式的数据类型,支持STL容器(vector,list,set,map等等),支持自定义类型的支持(需要实现序列化和反序列化方法)。
使用方式如下:
```cpp
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()`获取参数的值,当配置修改重新加载,该值自动更新(并触发对应的值更新回调函数),上述配置格式如下:
```yaml
tcp:
connect:
timeout: 10000
```
### 线程模块
线程模块,封装了pthread里面的一些常用功能,Thread,Semaphore,Mutex,RWMutex等对象,可以方便开发中对线程日常使用。
线程模块相关的类:
`Thread`:线程类,构造函数传入线程入口函数和线程名称,线程入口函数类型为void(),如果带参数,则需要用std::bind进行绑定。线程类构造之后线程即开始运行,构造函数在线程真正开始运行之后返回。
### 协程模块
协程:用户态的线程,相当于线程中的线程,更轻量级。后续配置socket hook,可以把复杂的异步调用,封装成同步操作。降低业务逻辑的编写复杂度。 目前该协程是基于ucontext_t来实现的。
### 协程调度模块
协程调度器,管理协程的调度,内部实现为一个线程池,支持协程在多线程中切换,也可以指定协程在固定的线程中执行。是一个N-M的协程调度模型,N个线程,M个协程。重复利用每一个线程。
限制:
一个线程只能有一个协程调度器
潜在问题:
调度器在idle情况下会疯狂占用CPU,所以,创建了几个线程,就一定要有几个类似while(1)这样的协程参与调度。
### IO协程调度模块
继承自协程调度器,封装了epoll(Linux),支持注册socket fd事件回调。只支持读写事件。IO协程调度器解决了协程调度器在idle情况下CPU占用率高的问题,当调度器idle时,调度器会阻塞在epoll_wait上,当IO事件发生或添加了新调度任务时再返回。通过一对pipe fd来实现通知调度协程有新任务。
### 定时器模块
在IO协程调度器之上再增加定时器调度功能,也就是在指定超时时间结束之后执行回调函数。定时的实现机制是idle协程的epoll_wait超时,大体思路是创建定时器时指定超时时间和回调函数,然后以当前时间加上超时时间计算出超时的绝对时间点,然后所有的定时器按这个超时时间点排序,从最早的时间点开始取出超时时间作为idle协程的epoll_wait超时时间,epoll_wait超时结束时把所有已超时的定时器收集起来,执行它们的回调函数。
### Hook模块
hook系统底层和socket相关的API,socket io相关的API,以及sleep系列的API。hook的开启控制是线程粒度的。可以自由选择。通过hook模块,可以使一些不具异步功能的API,展现出异步的性能。如(mysql)
hook实际就是把系统提供的api再进行一层封装,以便于在执行真正的系统调用之前进行一些操作。hook的目的是把socket io相关的api都转成异步,以便于提高性能。hook和io调度是密切相关的,如果不使用IO协程调度器,那hook没有任何意义。
该框架对以下函数进行了hook,并且只对socket fd进行了hook,如果操作的不是socket fd,那会直接调用系统原本的api,而不是hook之后的api:
```cpp
sleep
usleep
nanosleep
socket
connect
accept
read
readv
recv
recvfrom
recvmsg
write
writev
send
sendto
sendmsg
close
fcntl
ioctl
getsockopt
setsockopt
```
## **Example-TinyHttpServer**
---
基于上述高性能框架,实现一个简易**httpServer**——支持访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件。
服务器启动函数如下所示:
```
void run() {
sylar::http::HttpServer::ptr server(new sylar::http::HttpServer);
sylar::Address::ptr addr = sylar::Address::LookupAnyIPAddress("0.0.0.0:8020");
while(!server->bind(addr)) {
sleep(2);
}
auto sd = server->getServletDispatch();
sd->addServlet("/sylar", func_1); // func_1返回初始界面
sd->addServlet("/sylar/register", func_2); // func_2返回注册界面
sd->addServlet("/sylar/log", func_3); // func_3返回登录界面
sd->addServlet("/check_register", func_4); // func_4 处理用户注册请求
sd->addServlet("/check_log", func_5); // func_5 处理用户登录请求
sd->addServlet("/picture/1", func_6); // func_6处理请求服务器图片请求
sd->addServlet("/video/1", func_7); // func_7处理请求服务器视频文件请求
sd->addGlobServlet("/*", func_1);
server->start();
}
```
### Demo演示
> **注册**
![Image text](https://github.com/liwentaoCH/sylar-server/blob/main/picture_gif/%E7%99%BB%E5%BD%95.gif)
> **登录**
![Image text](https://github.com/liwentaoCH/sylar-server/blob/main/picture_gif/%E6%B3%A8%E5%86%8C%E7%94%A8%E6%88%B7.gif)
> **请求图片**
![Image text](https://github.com/liwentaoCH/sylar-server/blob/main/picture_gif/%E8%AF%B7%E6%B1%82%E5%9B%BE%E7%89%87%E6%96%87%E4%BB%B6.gif)
> **请求视频**
![Image text](https://github.com/liwentaoCH/sylar-server/blob/main/picture_gif/%E8%AF%B7%E6%B1%82%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6.gif)
## 运行
### 生成动态链接库libsylar.so
依据个人文件位置,修改CMakeList.txt文件中的相应输出文件路径,之后进入build文件夹,执行:
```shell
cmake ..
make
```
之后要编写服务器程序只需要新建一个文件,包含头文件**sylar.h**,并在编译时指定链接libsylar.so即可。
## 压力测试
使用jmeter压力测试工具,对xxxx:8020/sylar以及xxxx:8020/video/1两个接口进行压力测试。
### 硬件
处理器:AMD Ryzen7 4800H 四核
内存: 4GB
主频:2.9Hz
### 软件
操作系统:CentOS 7.9(VMware虚拟机)
### 接口一:xxxx:8020/sylar(请求初始界面)
![Image text](https://github.com/liwentaoCH/sylar-server/blob/main/picture_gif/sylar.png)
**吞吐量为1642/sec**
### 接口二:xxxx:8020/picture/1(请求图片)
![Image text](https://github.com/liwentaoCH/sylar-server/blob/main/picture_gif/video.png)
**吞吐量为1303/sec**
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。
资源推荐
资源详情
资源评论
收起资源包目录
毕设&课设&项目&实训-基于协程的C++服务器网络框架.zip (122个子文件)
libyaml-cpp.a 947KB
feature_tests.bin 12KB
CMakeDetermineCompilerABI_CXX.bin 8KB
CMakeDetermineCompilerABI_C.bin 8KB
CMakeCCompilerId.c 16KB
feature_tests.c 688B
uri.cc 208KB
http11_parser.cc 132KB
httpclient_parser.cc 68KB
log.cc 25KB
sockaddr.cc 16KB
bytearray.cc 14KB
hook.cc 14KB
socket.cc 12KB
iomanager.cc 12KB
http.cc 9KB
http_parser.cc 9KB
scheduler.cc 8KB
test_http_server.cc 7KB
http_server.cc 7KB
fiber.cc 6KB
mysql_pool.cc 5KB
timer.cc 5KB
servlet.cc 5KB
test_bytearray.cc 4KB
tcp_server.cc 3KB
test_socket.cc 3KB
config.cc 3KB
http_session.cc 2KB
fd_manager.cc 2KB
test_iomanager.cc 2KB
socket_stream.cc 2KB
test_fiber.cc 2KB
thread.cc 2KB
http_server.cc 2KB
test_hook.cc 2KB
test_thread.cc 2KB
test_address.cc 2KB
stream.cc 1KB
test_http_connection.cc 883B
test_tcp_server.cc 638B
test_http.cc 626B
test_schedule.cc 616B
test_uri.cc 602B
test_util.cc 568B
mutex.cc 501B
test_mysql.cc 353B
cmake.check_cache 85B
CMakeCXXCompiler.cmake 4KB
CMakeCCompiler.cmake 2KB
CMakeSystem.cmake 422B
CMakeCXXCompilerId.cpp 16KB
feature_tests.cxx 10KB
请求视频文件.gif 12.49MB
picture.gif 5.77MB
video.gif 5.7MB
请求图片文件.gif 433KB
loginnew.gif 339KB
registernew.gif 268KB
login.gif 251KB
register.gif 211KB
注册用户.gif 153KB
登录.gif 113KB
http.h 23KB
config.h 16KB
bytearray.h 15KB
log.h 15KB
sockaddr.h 9KB
servlet.h 7KB
mutex.h 7KB
scheduler.h 6KB
timer.h 4KB
iomanager.h 4KB
socket.h 3KB
http_parser.h 3KB
fd_manager.h 3KB
hook.h 3KB
socket_stream.h 3KB
uri.h 3KB
httpclient_parser.h 3KB
fiber.h 2KB
endan.h 2KB
tcp_server.h 2KB
http_server.h 1KB
thread.h 1KB
mysql_pool.h 1KB
singleton.h 1KB
macro.h 1KB
http11_parser.h 884B
noncopyable.h 775B
stream.h 747B
http_session.h 407B
http11_common.h 255B
logError.html 820B
registerError.html 790B
register.html 728B
log.html 724B
judge.html 609B
welcome.html 601B
fans.html 392B
共 122 条
- 1
- 2
资源评论
妄北y
- 粉丝: 1w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (大赛作品)STM32实现的F072RB NUCLEO智能家居控制.zip
- STM32实现的数字示波器源码+数字信号处理教程、配套实例.zip
- 【cookie续续】【cookie续续】【cookie续续】
- 低功耗STM32实现的F411开发板(原理图+PCB源文件+官方例程+驱动等).zip
- 基于stm32实现的 nucleo-L476的智能灯(操作说明+源码).zip
- 基于STM32实现的 NUCLEO板设计彩色LED照明灯(纯cubeMX开发).zip
- 基于STM32实现的 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频).zip
- 基于STM32实现的 人群定位、调速智能风扇设计(程序、设计报告、视频演示).zip
- 哔哩下载姬(DownKyi)
- 千纬认字app再次更新,增加部首、笔画动画功能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功