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
std::string_view
與支持發送不連續的數據,以免內存複製未來計劃支持的功能能夠參考項目中的路線圖文檔.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。