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 是捷微团队开发的微信小程序商城开源项目,涵盖了微信商城的全部功能,能够快速发布简单易用的小 ...
随机推荐
- C# 异步并发操作,只保留最后一次操作
在我们业务操作时,难免会有多次操作,我们期望什么结果呢? 绝大部分情况,应该是只需要最后一次操作的结果,其它操作应该无效. 自定义等待的任务类 1. 可等待的任务类 AwaitableTask: // ...
- Python使用百度地图API根据地名获取相应经纬度
今天有个需求,要根据地名获取经纬度坐标值. 于是我第一想法:打开百度地图,手动输入地名,获取.显然当地名较少时,可实施.然而,当地名较多时,此方法显然工作量很大. 于是,第二想法:代码获取,请求百度地 ...
- Spring 框架基础(06):Mvc架构模式简介,执行流程详解
本文源码:GitHub·点这里 || GitEE·点这里 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集 ...
- ant 自动化构建环境。
ant 一个自动化构建的工具 可以帮你实现自动化打包和发布到web环境上. 项目目录如下: 项目一:common-framework 项目二:estun-platform-web 其中项目一是项目二 ...
- JAVA学习第一课-手工笔记
JVM:JAVA虚拟机,JAVA核心,跨平台,作用是翻译. JRE:运行环境,包含JVM和运行的核心类库. JDK:全新开发使用,包含JRE,编译工具: 核心是JVM 以下是关系库 安装路径不要有空格 ...
- JQuery之Ajax应用
众所周知JQuery中的Ajax主要用于数据传输,其数据传输格式为JSON格式数据,比XML格式数据传输更快. ajax 是 Asynchronous JavaScript and XML的简写,aj ...
- JSSDK制作思路
需求:对外提供一个js的SDK.相当于在原有的原生SDK基础上包装一层方法. SDK原生的方法通过JSExport 协议可以让js调用到原生的方法.你可以写一个协议继承JSExport ,将需要对js ...
- WWDC 2016 盛宴
转自:http://www.jianshu.com/p/72dd8306c817 整理和维护人:pmstGitHub 链接:WWDC-2016-Feast目前只是整理官方给出的 WWDC 2016 视 ...
- 主题: 002.04 Tkinter 星空大战
为了更加熟练 Tkinter 的应用,决定只用 Tkinter 来写一个游戏,而不是用 Pygame, 在过程中,出了很多很大的问题,最后留了一点已知的问题,不想在花时间去找出来,不过整个程序算跑的没 ...
- B.Box
题目:盒子 题目:排列p是一个整数序列 p = [p1, p2,...,pn],由n个唯一的正整数组成 唯一的线索是你需要打开上锁的盒子 你只知道前缀的最大数,q1, q2, ..., qn,保证qi ...