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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM