cpv framework is a web framework written in c++ based on seastar framework, it focus on high performance and modular design.
seastar framework is an application framework that use the share nothing programming model, which isolate resources explicitly for each cpu core. cpv framework use this model too, a cpv application will initialize services on each cpu core, execute them on each cpu core and avoid sharing data between cpu cores, you don't need thread locks or atomic variables in cpv application because all code will be thread safe by design.
In addition, cpv framework avoid memory copies by using reference counted slice of string (cpv::SharedString
) and scattered message (cpv::Packet
) everywhere. You can get a slice of url path, query parameter, http header, and body content of request from the original packet without allocate a new string and copy them (there few cases require copy such as http header value splited in two packets, or query parameter different after decoded), and you can construct a scattered message contains multiple non-continuous fragments as http response body (based on posix vectored I/O api).
For more features, see the feature list and documents below.
cpv::SharedString
and cpv::Packet
everywhereYou can also check the roadmap to see which features will be added in the next release.
If you're using ubuntu 18.04, you can install cpv framework from PPA, this is the easiest way:
sudo apt-get install software-properties-common sudo add-apt-repository ppa:compiv/cpv-project sudo apt-get update sudo apt-get install cpvframework
In addition, you need gcc-9 to compile cpv application.
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test sudo apt-get install g++-9
If you're using other linux distribution, you can install from source:
# please ensure seastar framework is installed # please ensure `pkg-config --cflags seastar` works # please ensure `pkg-config --libs seastar` works mkdir -p build/cpvframework-custom cd build/cpvframework-custom cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_C_COMPILER=gcc-9 \ -DCMAKE_CXX_COMPILER=g++-9 \ ../../src make V=1 make install V=1
If you're using windows or macosx, you can use docker with ubuntu 18.04 image because seastar framework is basiclly linux only.
Write a hello world applicationThis is the source code of a hello world cpv application, it's same as examples/HelloWorld/Main.cpp
:
#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; }
It creates a cpv application, add 3 modules, route GET "/" to a custom handle function which replies "Hello World!" and run the cpv application on seastar framework forever (until Ctrl+C pressed).
Compile and execute the hello world applicationNow you can compile the hello world application:
g++-9 $(pkg-config --cflags seastar) \ $(pkg-config --cflags cpvframework) \ hello.cpp \ $(pkg-config --libs seastar) \ $(pkg-config --libs cpvframework)
And execute it with:
# --reactor-backend epoll is recommended because it's stable but not required ./a.out --reactor-backend epoll
It will initialize services and handle requests like this graphic describe (assume it used 2 cpu cores):
Finally you can test the application with curl:
curl -v http://localhost:8000
To see history results please check the change log of the wiki page.
Please check tests/travis_run_tests.sh for how to setup a environment for testing and run the tests.
You should follow these rules when contributing code, pull request or patch is welcome.
SomeClass
)someFunction
)someInt
)SomeGlobalValue
)_
(e.g. someMember_
)LICENSE: MIT LICENSE
Copyright © 2018-2020 303248153@github
If you have any license issue please contact 303248153@qq.com.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4