cpv framework 0.1 正式发布 (C++ 网页框架)

项目地址

https://github.com/cpv-project/cpv-frameworknode

项目介绍

cpv framework 是一个 C++ 编写的网页框架,基于 seastar framework,主要着重性能与模块化。react

seastar framework 是一个网络应用框架,支持按 CPU 核心分割资源,各个 CPU 核心都拥有本身的数据与内存范围,使用 seastar framework 编写的程序能够不使用线程锁与原子变量,这能够从源头上防止由多线程引起的 bug 而且大幅度提升程序在多核心环境下的性能 (核心越多效果越高)。seastar framework 是为了开发 scylladb 而建立的,scylladb 是一个兼容 apache cassandra 协议的分布式数据库,而且性能是 cassandra 的十倍。git

由于 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 实现),不须要把它们复制到一个连续的缓冲区。github

cpv framework 还着重模块化,全部功能都是基于模块实现的,包括 HTTP 服务器与路由都是可选的模块,模块与模块之间的对接基于依赖注入容器,cpv framwork 提供了一个自带的依赖注入容器实现,支持构造函数注入与生命周期管理等功能。同时,HTTP 请求的处理器接口使用了中间件风格 (相似 Asp.NET Core 的中间件),捕捉异常并返回 500、页面找不到时返回 40四、按请求路径路由都是基于处理器实现的,能够简单的替换它们。数据库

更多功能能够参考下面的功能列表 (尽管 0.1 只有最基础的一些功能)。apache

功能列表 (0.1)

  • 支持按 CPU 核心分割资源
  • 普遍使用 std::string_view 与支持发送不连续的数据,以免内存复制
  • 使用基于 future promise 的异步接口
  • 提供依赖注入容器
  • 提供模块系统
    • 应用功能彻底由模块决定,包括 HTTP 服务器与路由都经过模块实现
    • 模块与模块之间的对接基于依赖注入容器
  • 提供 HTTP 服务器
    • 支持 HTTP 1.0/1.1 协议 (使用 http-parser)
    • 支持流水线处理
    • 支持使用中间件风格的处理器列表
    • 支持路由 (支持完整路径或通配符,路由功能是可选的单独模块)
    • 支持流式读取与返回内容

未来计划支持的功能能够参考项目中的路线图文档.ubuntu

安装方法

cpv framework 提供了 Ubuntu 18.04 的 PPA 包,使用如下命令便可简单地安装:promise

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。

相关文章
相关标签/搜索