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 节

目前只有英文文档 ??,请见谅。

性能测试

最新的性能测试结果请见这个 issue:

https://github.com/cpv-project/cpv-framework/issues/14

写在最后

这个项目和 ZKWeb 一样是余业开发,目前的目标是添加更多功能,将来会配合之前基于 seastar framework 编写的 cassandra 驱动 cpv-cql-driver 做点东西。
因为国内关于 seastar framework 的资料很少,接下来有时间我还会专门写一篇文章介绍 seastar framework。

原文地址:https://www.cnblogs.com/zkweb/p/11730661.html

时间: 2024-09-28 11:59:55

cpv framework 0.1 正式发布 (C++ 网页框架)的相关文章

Firebug 2.0 正式发布,网页开发插件

Firebug 2.0 is compatible with Firefox 30 – 32 Firebug 2 UI: The screenshot shows Win OS theme other OSes (Linux and Mac) have own custom theme. New Features Firebug 2 introduces many new features and bug fixes also because we completely removed depe

NanUI | NanUI 0.7 正式发布

2020年2月10日 NanUI 0.7版正式发布. 回顾过去的一年,浑浑噩噩.生活上.工作上太多的压力和变数让我身心疲惫,目睹亲人被病痛的摧残的痛苦,无法释怀的生死别离令我沉沦许久:公司业务的变动,方向的调整,好基友的离职让我对未来的职业规划感到无比迷茫,太多的事情让我应接不暇,因此也搁置了NanUI项目的开发.在此向各位给予了NanUI期待的朋友表示深深的歉意.随着时间的流逝,不知不觉2019年的时光在我的生命中飞逝,一转眼来到了11月份,看着GitHub上空荡荡的Release Notes

网页开发是不是必须要用网页框架

网页开发是不是必须要用网页框架?个人感觉这分为两种情况,一种是能力超强,时间够用的情况,另外一种就是用前端网页框架,可以节约开发时间和减少工作量,这可以根据自身的情况作出正确的判断,并不是别人说什么就是什么. 小项目到底用不用前端网页框架? 小项目本身就是做的事情比较多,但是成本还小,如果让开发人员不停写代码可能会花很多的时间去做,这需要考虑到这个小项目开发时间和成本的.如果用前端网页框架相信大家都知道,可能会考虑到浏览器兼容性,还有功能不够自己用,我想这都不用担心,从QUICKUI开发以来,体

iOS开发——技术精华Swift篇&amp;Swift 2.0和Objective-C2.0混编之第三方框架的使用

Swift 2.0和Objective-C2.0混编之第三方框架的使用 swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引入了多种新功能,使得编程工作更加简便,灵活! 2015年6月9日苹果又一次给所有开发之者带来了一个惊喜,那就是今年年底swift讲开源,者队iOS开发着来说无疑是一个值得兴奋的消息,可是就在这短短的几个月里面swift吸引了越来

【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 (13)客户管理

声明:本系列为原创,分享本人现用框架,未经本人同意,禁止转载!http://yuangang.cnblogs.com 希望大家好好一步一步做,所有的技术和项目,都毫无保留的提供,希望大家能自己跟着做一套,还有,请大家放心,只要大家喜欢,有人需要,绝对不会烂尾,我会坚持写完~ 如果你感觉文章有帮助,点一下推荐,让更多的朋友参与进来,也是对本人劳动成果的鼓励,谢谢大家!由于还要工作,所以基本都是牺牲午休时间来写博客的,写博客呢不是简单的Ctrl+C.Ctrl+V,我是要挨着做一遍的,这也是对大家负责

从0开始,一起搭框架、做项目(3)公共基础数据操作类 RepositoryBase

索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目 目录索引 简述 今天我们写一个基础数据的操作类,如果里面有大家不理解的地方,可采取两种方式,第一:提出来,第二:会用就行.这个类呢我一般不去修改它,因为基础操作类,大家也可以直接拷贝到自己的项目中. 项目准备 我们用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家对ASP.NET MVC有一个初步的理解,理论性的东西我们不做过多解释,有些地方不理解也没关系,会用就行了,用的多

MongoDB3.0版正式发布

2015年3月3日,MongoDB3.0版正式发布. MongoDB3.0版在2015年3月3日如期而至,包含许多关键的新特性,比如可插拔式存储引擎API,支持新的WiredTiger存储引擎,SCRAM-SHA-1认知机制和升级优化完善的其它功能. 主要更新包括: 1.可插拔式存储引擎API MongoDB3.0发布了新的可插拔式存储引擎API,允许第三方为MongoDB开发特定功能的存储引擎. 2.WiredTiger MongoDB3.0增加了新的存储引擎WiredTiger,现在Mong

Brn系列商城3.0测试版正式发布,欢迎大家下载测试

BrnShop商城3.0测试版和BrnMall商城3.0测试版正式发布,欢迎大家下载测试(点击下载).测试结束后将会发布正式版和MySQL版本. 测试过程中发现bug欢迎大家给我们反馈,反馈邮箱:[email protected]

toddyang3.0版本 最新EASYUI后台框架兼容所有浏览器

        toddyang3.0版本 最新EASYUI后台框架兼容所有浏览器