cpv framework 0.1 正式发布 (C++ 网页框架)
项目地址
https://github.com/cpv-project/cpv-framework
项目介绍
cpv framework 是一个 C++ 编写的网页框架,基于 seastar framework,主要着重性能与模块化。
seastar framework 是一个网络应用框架,支持按 CPU 核心分割资源,各个 CPU 核心都拥有自己的数据与内存范围,使用 seastar framework 编写的程序可以不使用线程锁与原子变量,这可以从源头上防止由多线程引发的 bug 并且大幅度提高程序在多核心环境下的性能 (核心越多效果越高)。seastar framework 是为了开发 scylladb 而创建的,scylladb 是一个兼容 apache cassandra 协议的分布式数据库,并且性能是 cassandra 的十倍。
因为 cpv framework 基于 seastar framework 开发,cpv framework 也支持按 CPU 核心分割资源,cpv framework 会在各个 cpu 核心上分别创建与初始化各个模块,并且隔离它们的数据。除此之外,cpv framework 还支持减少收发数据时的内存复制,例如处理 http 请求时,url 与 http 头等等都是 std::string_view,也就是它们都是原始发过来的数据包中的一部分 (像 go 中的 slice 与 .NET Core 中的 Span),并且发送 http 回应时可以使用不连续的数据 (基于 posix 的 iovec 实现),不需要把它们复制到一个连续的缓冲区。
cpv framework 还着重模块化,所有功能都是基于模块实现的,包括 HTTP 服务器与路由都是可选的模块,模块与模块之间的对接基于依赖注入容器,cpv framwork 提供了一个自带的依赖注入容器实现,支持构造函数注入与生命周期管理等功能。同时,HTTP 请求的处理器接口使用了中间件风格 (类似 Asp.NET Core 的中间件),捕捉异常并返回 500、页面找不到时返回 404、按请求路径路由都是基于处理器实现的,可以简单的替换它们。
更多功能可以参考下面的功能列表 (尽管 0.1 只有最基础的一些功能)。
功能列表 (0.1)
- 支持按 CPU 核心分割资源
- 广泛使用
std::string_view与支持发送不连续的数据,以避免内存复制 - 使用基于 future promise 的异步接口
- 提供依赖注入容器
- 提供模块系统
- 应用功能完全由模块决定,包括 HTTP 服务器与路由都通过模块实现
- 模块与模块之间的对接基于依赖注入容器
- 提供 HTTP 服务器
- 支持 HTTP 1.0/1.1 协议 (使用 http-parser)
- 支持流水线处理
- 支持使用中间件风格的处理器列表
- 支持路由 (支持完整路径或通配符,路由功能是可选的单独模块)
- 支持流式读取与返回内容
将来计划支持的功能可以参考项目中的路线图文档.
安装方法
cpv framework 提供了 Ubuntu 18.04 的 PPA 包,使用以下命令即可简单地安装:
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:compiv/cpv-project
sudo apt-get update
sudo apt-get install cpvframework
目前 cpv framework 要求 GCC 9,可以通过以下命令安装:
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt-get install g++-9
如果想在其他 Linux 发行版上使用,可以参考项目 README.md 中的手动编译安装方法。
代码例子
这是一个简单的例子:
#include <seastar/core/app-template.hh>
#include <CPVFramework/Application/Application.hpp>
#include <CPVFramework/Application/Modules/LoggingModule.hpp>
#include <CPVFramework/Application/Modules/HttpServerModule.hpp>
#include <CPVFramework/Application/Modules/HttpServerRoutingModule.hpp>
#include <CPVFramework/Http/HttpResponseExtensions.hpp>
int main(int argc, char** argv) {
seastar::app_template app;
app.run(argc, argv, [] {
cpv::Application application;
application.add<cpv::LoggingModule>();
application.add<cpv::HttpServerModule>([] (auto& module) {
module.getConfig().setListenAddresses({ "0.0.0.0:8000", "127.0.0.1:8001" });
});
application.add<cpv::HttpServerRoutingModule>([] (auto& module) {
module.route(cpv::constants::GET, "/", [] (cpv::HttpContext& context) {
return cpv::extensions::reply(context.getResponse(), "Hello World!");
});
});
return application.runForever();
});
return 0;
}
使用以下命令即可编译与运行:
g++-9 $(pkg-config --cflags seastar) \
$(pkg-config --cflags cpvframework) \
hello.cpp \
$(pkg-config --libs seastar) \
$(pkg-config --libs cpvframework)
// --reactor-backend epoll 可以省略,省略了会用 aio,但推荐使用更稳定的 epoll
./a.out --reactor-backend epoll
运行以后访问 http://localhost:8000 即可看到 "Hello World!"。
这个示例程序运行时的内部结构与工作流程可以参考下图,下图假设了当前环境有 2 个 cpu 核心:

文档
可以参考项目 README.md 中的 Documents 节。
目前只有英文文档
cpv framework 0.1 正式发布 (C++ 网页框架)的更多相关文章
- ZKWeb网页框架3.0正式发布
3.0 更新的内容有 更新 .NET 框架 替换项目模版的 netcoreapp2.2 到 netcoreapp3.0 目前支持的 .NET 框架有: net461, netcoreapp2.0, n ...
- NanUI | NanUI 0.7 正式发布
2020年2月10日 NanUI 0.7版正式发布. 回顾过去的一年,浑浑噩噩.生活上.工作上太多的压力和变数让我身心疲惫,目睹亲人被病痛的摧残的痛苦,无法释怀的生死别离令我沉沦许久:公司业务的变动, ...
- 【Python】web.py-简单轻量级网页框架python
简单轻量级网页框架python web.py的安装 python 3.x中安装web.py 最近决定从python2.7转移到3.x上工作. 使用数据库的时候,依然选用了之前比较感兴趣的web.py ...
- Volcano社区v1.6.0版本正式发布
摘要:Volcano社区v1.6.0版本正式发布.此次版本增加了弹性作业管理.基于真实负载的动态调度. 基于真实负载的重调度.Volcano Job插件--MPI等多个新特性. 本文分享自华为云社区& ...
- 一篇文章带你了解网页框架——Vue简单入门
一篇文章带你了解网页框架--Vue简单入门 这篇文章将会介绍我们前端入门级别的框架--Vue的简单使用 如果你以后想从事后端程序员,又想要稍微了解前端框架知识,那么这篇文章或许可以给你带来帮助 温馨提 ...
- 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引
索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目(1)搭建MVC环境 注册区域 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目(2)创建 ...
- Brn系列商城3.0测试版正式发布,欢迎大家下载测试
BrnShop商城3.0测试版和BrnMall商城3.0测试版正式发布,欢迎大家下载测试(点击下载).测试结束后将会发布正式版和MySQL版本. 测试过程中发现bug欢迎大家给我们反馈,反馈邮箱:br ...
- Robot Framework作者建议如何选择自动化测试框架
本文摘自:InfoQ中文站http://www.infoq.com/cn/news/2012/06/robot-author-suggest-autotest Robot Framework作者建议如 ...
- 微信小程序商城开源项目,Weixin-App-Shop 1.0 版本正式发布!!!
微信小程序商城开源项目,Weixin-App-Shop 1.0 版本正式发布 Weixin-App-Shop 是捷微团队开发的微信小程序商城开源项目,涵盖了微信商城的全部功能,能够快速发布简单易用的小 ...
随机推荐
- Djangoday1 入门及第一个apphelloworld
1 Django基础指令新建一个django project新建app创建数据库表,更新数据库表或字段使用开发服务器清空数据库创建超级管理员导出数据 导入数据Django 项目环境终端数据库命令行更多 ...
- 虚拟机中linux操作系统raid5(5块磁盘,3块做raid,2块做备份)配置流程及损坏磁盘的移除
1.打开所要用的虚拟机,点击编辑虚拟机设置,点击硬盘,添加 2.一直点击下一步不做修改,直到最后完成 3.按照以上步骤添加5块磁盘 4.点击开启虚拟机,输入用户名root密码登录进去 5.进入虚拟机后 ...
- Java8 格式化时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");LocalDateTime. ...
- mysql那些事(4)建库建表编码的选择
mysql建数据库或者建表的时候会遇到选择编码的问题,以前我们都是习惯性的选择utf8,但是在mysql在5.5.3版本后加了utf8mb4的编码,utf8mb4可以存4个字节Unicode,mb4就 ...
- Linux-Ubuntu学习笔记
因学习Python需求,特开此贴用于记录Linux-Ubuntu操作系统的学习笔记. Linux命令-基础版 Linux命令-高级版 此贴终结了,主要用于开发过程中忘记命令时使用.
- 用C#写小工具:将圆柱面贴图映射到半球贴图
最近在写GBA的程序.GBA运行的是C的裸机代码,而中途使用的很多小工具则用C#写的,例如:图片转换到.h头文件,制作三角函数表,还有像这次介绍的将圆柱面贴图映射到半球贴图的小工具.这样的小功能,用C ...
- Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: REFERENCES command denied to user 'nali'@'localhost' for table 'dbs'
按照教程 Install hive on Mac with Homebrew,在 mac 上安装 Hive 时, 最后执行 hive 命令后,出现错误: Exception in thread &qu ...
- 16.Django学习之文件上传和下载
上传就这么六步! 一. settings配置文件中配置 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'medias').repl ...
- Java修炼——String类_常用方法_常量池
String类的定义:String 是不可变字符序列 String 类的常用方法(全部都是不能改变String本身的值,都是在常量池里输出,没有改变其值) String string="ab ...
- [TimLinux] JavaScript table的td内容超过宽度缩为三个点
1. 思路 CSS控制td内容自动缩为三个点 JS控制鼠标悬浮显示td全部内容 2. 实现 HTML代码: <!DOCTYPE html> <html> <head> ...