GitHub 開源推薦 | 一個輕量級、高性能的 C++ Web 框架

一去丶二三裏 2021-09-19 20:30:40 阅读数:726

github 高性能 性能 c++ web

星標/置頂 公眾號,硬核文章第一時間送達!

 Github 開源推薦

專注分享 GitHub 上有趣、好玩的開源項目,以幫助大家提高編程技巧,找到編程樂趣。

如果你對開源感興趣,想和大家分享一些優質項目,隨時歡迎投稿(微信號:iwaleon)。

說起 Web 開發,大多數人會想到 Java、Python、Golang ... 因為它們的主流 Web 框架有很多,Java 有非常知名的 Spring 全家桶,Python 有大而全的 Django、小而精的 Flask、高性能的 Tornado,Golang 也有快速靈活的 Gin、Echo 等框架。

相比之下,C/C++ 陣營則遜色不少。之前,我曾寫過一篇《C++ Web(HTTP)開發 10 大利器》,其中介紹了一些 C/C++ Web 框架。有一個名為 Oat++ 的很不錯,輕量、跨平臺、高性能、完全零依賴,非常值得學習!

b07327118a24f9dba13b8830058bfad8.png

1

Oat++ 介紹

要深入了解 Oat++,離不開這幾個網址:

  • Oat++ 主頁:https://oatpp.io

  • Oat++ 文檔:https://oatpp.io/docs/start

  • GitHub 地址:https://github.com/oatpp/oatpp

其主要特性有:

  • 隨處運行

    Oat++ 沒有任何依賴性,可以很容易地移植到各種支持的平臺上(Linux、MacOS、Windows)。

  • 構建健壯的api

    使用 Oat++ Simple-API,構建靈活而健壯的 API 既簡單又有趣。

  • 處理 500 萬個連接

    使用 Oat++ Async-API,可以在單個服務器上處理超過 500 萬個並發連接。

  • 訪問數據庫

    Oat++ ORM 提供了一種簡單而統一的方式來訪問數據庫

  • 保持代碼一致

    Oat++ 在整個代碼庫中依靠對象映射來確保 API 和數據模型的一致性

  • 生成 API 文檔

    使用 Swagger-UI 和 OpenAPI 3.0.0 自動記錄 endpoints

最吸引我的是 HTTP/HTTPS、文件上傳/下載、以及强大的  Swagger API 功能。

2

編譯 Oat++

進入 Oat++ 的 GitHub 頁面,你會發現 Star 多達 4K+,貢獻者有 30 多個,且最近幾天還有代碼提交,所以不用擔心熱度和活躍度,這個框架一直有人在積極地維護。

ab503bdfd200e590ad2a3fe69f8da5f2.png

環境要求

Oat++ 的編譯過程很簡單,只需要有基本的開發環境就行了:

  • Git

  • 編譯器支持的 C++ 版本 >= 11

  • Make

  • CMake 版本 >= 3.1

如果沒有的話,按照下述步驟安裝,以 Ubuntu 為例:

$ sudo apt install git
$ sudo apt install cmake
$ sudo apt install build-essential

編譯安裝

下載 Oat++ 源碼:

$ git clone https://github.com/oatpp/oatpp.git

隨後,執行編譯安裝四部曲:

$ cd oatpp/
$ mkdir build && cd build
$ cmake ..
$ sudo make && sudo make install

3

示例程序

為了演示 Oat++,我們從最簡單的“Hello, World!”開始!

創建一個 CMake 項目,CMakeLists.txt 配置如下:

cmake_minimum_required(VERSION 3.1)
project(helloworld)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp handler.h)
# 查找 oatpp 依賴
find_package(oatpp REQUIRED)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
# 將目標文件與庫文件進行鏈接
target_link_libraries(${PROJECT_NAME} oatpp::oatpp)

默認情况下,Oat++ 會對客戶端請求響應 404,除此之外什麼都不做。

若要添加自定義響應,必須實現 HttpRequestHandler:

// handler.h
#ifndef HANDLER_H
#define HANDLER_H
#include "oatpp/web/server/HttpRequestHandler.hpp"
#define O_UNUSED(x) (void)x;
// 自定義請求處理程序
class Handler : public oatpp::web::server::HttpRequestHandler
{
public:
    // 處理傳入的請求,並返回響應
    std::shared_ptr<OutgoingResponse> handle(const std::shared_ptr<IncomingRequest>& request) override {
        O_UNUSED(request);
        return ResponseFactory::createResponse(Status::CODE_200, "Hello, World!");
    }
};
#endif // HANDLER_H

有了處理程序之後,需要通過 Router 將請求路由到它:

// main.cpp
#include "oatpp/web/server/HttpConnectionHandler.hpp"
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"
#include "oatpp/network/Server.hpp"
#include "handler.h"
void run()
{
    // 為 HTTP 請求創建路由器
    auto router = oatpp::web::server::HttpRouter::createShared();
    // 路由 GET - "/hello" 請求到處理程序
    router->route("GET", "/hello", std::make_shared<Handler>());
    // 創建 HTTP 連接處理程序
    auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared(router);
    // 創建 TCP 連接提供者
    auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared({"localhost", 8000, oatpp::network::Address::IP_4});
    // 創建服務器,它接受提供的 TCP 連接並將其傳遞給 HTTP 連接處理程序
    oatpp::network::Server server(connectionProvider, connectionHandler);
    // 打印服務器端口
    OATPP_LOGI("MyApp", "Server running on port %s", connectionProvider->getProperty("port").getData());
    // 運行服務器
    server.run();
}
int main()
{
    // 初始化 oatpp 環境
    oatpp::base::Environment::init();
    // 運行應用
    run();
    // 銷毀 oatpp 環境
    oatpp::base::Environment::destroy();
    return 0;
}

4

請求驗證

運行程序,在瀏覽器中訪問 http://localhost:8000/hello,就會顯示“Hello, World!”信息了:

7d5d9a3fd78f7f8af576c35163121c36.png

或者使用 curl 請求 http://127.0.0.1:8000/hello,效果一樣:

$ curl http://127.0.0.1:8000/hello
Hello, World!

感興趣?還在等什麼,趕緊關注吧,後面的內容更加精彩!

往期推薦

專輯 | 趣味設計模式6e9c4967a455f86b293dae8560c1b05f.gif

專輯 | 音視頻開發

專輯 | C++ 進階2f486c6b64fc3259e1ee37cd390911a0.gif

專輯 | 超硬核 Qta76e99b5be055a071fa5d1c3b6f2ae81.gif

專輯 | 玩轉 Linux

專輯 | GitHub 開源推薦91609cac6b498c71b0bd634be11418b9.gif

專輯 | 程序人生

關注公眾「高效程序員」,一起優秀!

回複 “入群” 進技術交流群,回複 “1024” 獲取海量學習資源。

版权声明:本文为[一去丶二三裏]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210919203039630h.html