Oat++: 一个轻量级、高性能、零依赖的 C++ Web 框架

目录

1.简介

2.安装与配置

3.快速入门

3.1.同步版本 (Simple-API)

3.2.异步版本 (Async-API)

[3.3.API 控制器](#3.3.API 控制器)

3.4.DTO (数据传输对象)

3.5.依赖注入 (DI)

4.完整开发web服务示例

4.1.完整项目结构

4.2.CMakeLists.txt

4.3.src/dto/UserDto.hpp

4.4.src/AppComponent.hpp

4.5.src/controller/UserController.hpp

[4.6.src/App.cpp 主入口](#4.6.src/App.cpp 主入口)

4.7.编译并启动服务

5.性能与对比

6.适用场景

7.总结


1.简介

Oat++(Oatpp)是一个现代、轻量级、高性能、零依赖的 C++ Web 框架,专为构建可扩展的 Web 服务、RESTful API 和高并发应用而设计。它以纯 C++ 实现,无需外部依赖,可轻松移植到各种平台,从嵌入式设备到云服务器,特别适合 IoT、机器人和微服务开发场景

核心特点有:

特性 说明
零依赖 纯 C++ 实现,无需第三方库,编译简单,移植性极强
双 API 模式 Simple-API (同步,基于线程池) 适合 CPU 密集型任务;Async-API (异步,基于协程) 可处理500 万 + 并发连接
高性能 异步 I/O 模型,内存池优化,低延迟高吞吐量,单位 CPU 周期处理请求数最多
REST 框架 强大的路由系统,支持路径参数、查询参数、请求体映射,自动文档生成
对象映射 内置 JSON 序列化 / 反序列化,支持 DTO (数据传输对象),确保 API 一致性
ORM 支持 内置轻量级 ORM,简化数据库操作
WebSocket 原生支持 WebSocket,适合实时通信应用
Swagger 集成 自动生成 OpenAPI 3.0 文档,通过 Swagger-UI 可视化 API
依赖注入 内置 DI 框架,简化组件管理和测试
跨平台 支持 Linux、macOS、Windows 等,可移植到任何有线程和网络栈的环境

2.安装与配置

https://github.com/oatpp/oatpp
https://gitee.com/mirrors/oatpp

1.获取源码

cpp 复制代码
git clone https://github.com/oatpp/oatpp.git
cd oatpp && mkdir build && cd build
cmake .. -DOATPP_BUILD_EXAMPLES=OFF -DOATPP_BUILD_TESTS=OFF
make -j4
sudo make install

CMake 高级配置选项(可选)

选项 说明 默认值
-DCMAKE_INSTALL_PREFIX 安装路径 /usr/local
-DOATPP_BUILD_EXAMPLES 编译示例 ON
-DOATPP_BUILD_TESTS 编译测试 ON
-DOATPP_DISABLE_ENV_OBJECT_COUNTER 禁用对象计数 OFF
-DOATPP_COMPAT_BUILD_NO_THREAD_LOCAL 兼容无 thread_local 环境 OFF

2.CMake 集成示例

cpp 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyOatppProject)

set(CMAKE_CXX_STANDARD 17)

find_package(oatpp REQUIRED)

add_executable(myapp main.cpp)
target_link_libraries(myapp oatpp::oatpp)

3.Oat++ 扩展模块安装(如 Swagger)

Oat++ 提供多个扩展模块,常用的有:

cpp 复制代码
# 安装oatpp-swagger(API文档生成)
git clone https://github.com/oatpp/oatpp-swagger.git
cd oatpp-swagger && mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install

# 其他常用扩展
git clone https://github.com/oatpp/oatpp-orm.git       # ORM数据库模块
git clone https://github.com/oatpp/oatpp-websocket.git # WebSocket模块
git clone https://github.com/oatpp/oatpp-curl.git      # HTTP客户端模块

3.快速入门

3.1.同步版本 (Simple-API)

cpp 复制代码
#include "oatpp/web/server/HttpConnectionHandler.hpp"
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"
#include "oatpp/network/Server.hpp"
#include "oatpp/web/server/HttpRouter.hpp"
#include "oatpp/parser/json/mapping/ObjectMapper.hpp"

class HelloHandler : public oatpp::web::server::HttpRequestHandler {
public:
  std::shared_ptr<OutgoingResponse> handle(const std::shared_ptr<IncomingRequest>& request) override {
    auto dto = oatpp::parser::json::mapping::ObjectMapper::createShared()->writeToString(
      oatpp::Fields<oatpp::String>::createShared({{"message", "Hello, Oat++!"}})
    );
    return createResponse(Status::CODE_200, dto, "application/json");
  }
};

void run() {
  auto router = oatpp::web::server::HttpRouter::createShared();
  router->route("GET", "/hello", std::make_shared<HelloHandler>());
  
  auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared(
    {"0.0.0.0", 8000, oatpp::network::Address::IP_4}
  );
  
  auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared(router);
  oatpp::network::Server server(connectionProvider, connectionHandler);
  
  OATPP_LOGI("Server", "Running on port 8000");
  server.run();
}

int main() {
  oatpp::base::Environment::init();
  run();
  oatpp::base::Environment::destroy();
  return 0;
}

3.2.异步版本 (Async-API)

cpp 复制代码
#include "oatpp/web/server/AsyncHttpConnectionHandler.hpp"
#include "oatpp/async/Coroutine.hpp"

class HelloAsyncHandler : public oatpp::web::server::HttpRequestHandler {
public:
  class Coroutine : public oatpp::async::Coroutine<Coroutine> {
  private:
    std::shared_ptr<IncomingRequest> m_request;
  public:
    Coroutine(const std::shared_ptr<IncomingRequest>& request) : m_request(request) {}
    
    Action act() override {
      auto dto = oatpp::Fields<oatpp::String>::createShared({{"message", "Hello, Async Oat++!"}});
      auto response = createDtoResponse(Status::CODE_200, dto);
      return _return(response);
    }
  };
  
  std::shared_ptr<AsyncAction> actAsync(const std::shared_ptr<IncomingRequest>& request) override {
    return Coroutine::start(request);
  }
};

void runAsyncServer() {
  auto router = oatpp::web::server::HttpRouter::createShared();
  router->route("GET", "/async/hello", std::make_shared<HelloAsyncHandler>());
  
  auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared(
    {"0.0.0.0", 8000, oatpp::network::Address::IP_4}
  );
  
  auto connectionHandler = oatpp::web::server::AsyncHttpConnectionHandler::createShared(router);
  oatpp::network::Server server(connectionProvider, connectionHandler);
  
  OATPP_LOGI("AsyncServer", "Running on port 8000");
  server.run();
}

3.3.API 控制器

使用ENDPOINT宏简化路由定义,支持自动参数绑定:

cpp 复制代码
class UserController : public oatpp::web::server::api::ApiController {
public:
  UserController(OATPP_COMPONENT(std::shared_ptr<ObjectMapper>, objectMapper))
    : oatpp::web::server::api::ApiController(objectMapper) {}
  
  ENDPOINT_INFO(getUser) {
    info->summary = "Get user by ID";
    info->pathParams["userId"].description = "User ID";
    info->responses[200].description = "User DTO";
  }
  ENDPOINT("GET", "/users/{userId}", getUser,
           PATH(Int64, userId)) 
  {
    auto user = m_userService->getUserById(userId);
    return createDtoResponse(Status::CODE_200, user);
  }
  
  ENDPOINT("POST", "/users", createUser,
           BODY_DTO(Object<UserDto>, userDto)) 
  {
    auto createdUser = m_userService->createUser(userDto);
    return createDtoResponse(Status::CODE_201, createdUser);
  }
  
  static std::shared_ptr<UserController> createShared(
    OATPP_COMPONENT(std::shared_ptr<ObjectMapper>, objectMapper)
  ) {
    return std::make_shared<UserController>(objectMapper);
  }
};

3.4.DTO (数据传输对象)

定义强类型数据结构,自动 JSON 序列化:

cpp 复制代码
#include "oatpp/core/Types.hpp"

class UserDto : public oatpp::DTO {
  DTO_INIT(UserDto, DTO)
  
  DTO_FIELD(Int64, id);
  DTO_FIELD(String, name, "username"); // JSON字段映射
  DTO_FIELD(String, email, "email");
  DTO_FIELD(Boolean, active, "is_active");
};

3.5.依赖注入 (DI)

通过组件配置实现松耦合:

cpp 复制代码
class AppComponent {
public:
  OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper)
  ([] {
    auto objectMapper = oatpp::parser::json::mapping::ObjectMapper::createShared();
    // 配置序列化选项
    return objectMapper;
  }());
  
  OATPP_CREATE_COMPONENT(std::shared_ptr<UserService>, userService)
  ([] {
    return std::make_shared<UserService>();
  }());
};

4.完整开发web服务示例

RESTful API + DTO 自动序列化 + Swagger 接口文档 + 依赖注入 + 标准项目结构

全程使用同步 Simple API,代码极简、可直接复制使用。

4.1.完整项目结构

cpp 复制代码
oatpp-demo/
├── CMakeLists.txt
├── src/
│   ├── AppComponent.hpp   // 依赖注入&全局组件
│   ├── dto/
│   │   └── UserDto.hpp     // 数据传输对象
│   ├── controller/
│   │   └── UserController.hpp  // API控制器
│   └── App.cpp             // 主入口

4.2.CMakeLists.txt

cpp 复制代码
cmake_minimum_required(VERSION 3.12)
project(oatpp-demo)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 查找 oatpp 核心与 swagger
find_package(oatpp REQUIRED)
find_package(oatpp-swagger REQUIRED)

add_executable(oatpp-app
  src/App.cpp
)

# 链接库
target_link_libraries(oatpp-app
  oatpp::oatpp
  oatpp::oatpp-swagger
)

# 头文件路径
target_include_directories(oatpp-app PUBLIC src)

4.3.src/dto/UserDto.hpp

DTO 自动 JSON 序列化 / 反序列化

cpp 复制代码
#ifndef UserDto_hpp
#define UserDto_hpp

#include "oatpp/core/Types.hpp"
#include "oatpp/core/macro/codegen.hpp"

#include OATPP_CODEGEN_BEGIN(DTO)

class UserDto : public oatpp::DTO {

  DTO_INIT(UserDto, DTO)

  DTO_FIELD(Int64, id);
  DTO_FIELD(String, username, "username");
  DTO_FIELD(String, email, "email");
  DTO_FIELD(Int32, age, "age");
  DTO_FIELD(Boolean, active, "active") = true;

};

#include OATPP_CODEGEN_END(DTO)

#endif /* UserDto_hpp */

4.4.src/AppComponent.hpp

全局组件:对象映射器、Swagger、HTTP 路由、连接池

cpp 复制代码
#ifndef AppComponent_hpp
#define AppComponent_hpp

#include "oatpp/web/server/HttpRouter.hpp"
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"
#include "oatpp/parser/json/mapping/ObjectMapper.hpp"
#include "oatpp/core/macro/component.hpp"

// Swagger
#include "oatpp-swagger/Model.hpp"
#include "oatpp-swagger/Resources.hpp"

class AppComponent {
public:

  /**
   * 注入 JSON 序列化器
   */
  OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper)
  ([] {
    return oatpp::parser::json::mapping::ObjectMapper::createShared();
  }());

  /**
   * 注入 HTTP 路由器
   */
  OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::web::server::HttpRouter>, httpRouter)
  ([] {
    return oatpp::web::server::HttpRouter::createShared();
  }());

  /**
   * 注入 TCP 连接提供者
   */
  OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, serverConnectionProvider)
  ([] {
    return oatpp::network::tcp::server::ConnectionProvider::createShared({"0.0.0.0", 8000});
  }());

  /**
   * Swagger 文档信息
   */
  OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::swagger::DocumentInfo>, swaggerDocumentInfo)
  ([] {
    return oatpp::swagger::DocumentInfo::Builder()
      .setTitle("Oat++ 用户管理 API")
      .setDescription("完整 Web 服务示例")
      .setVersion("1.0.0")
      .build();
  }());

  /**
   * Swagger 静态资源
   */
  OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::swagger::Resources>, swaggerResources)
  ([] {
    return oatpp::swagger::Resources::loadResources(OATPP_SWAGGER_RES_PATH);
  }());

};

#endif /* AppComponent_hpp */

4.5.src/controller/UserController.hpp

RESTful 接口:查单个、查列表、新增、修改、删除

cpp 复制代码
#ifndef UserController_hpp
#define UserController_hpp

#include "dto/UserDto.hpp"
#include "oatpp/web/server/api/ApiController.hpp"
#include "oatpp/core/macro/codegen.hpp"
#include "oatpp/core/macro/component.hpp"

#include OATPP_CODEGEN_BEGIN(ApiController)

class UserController : public oatpp::web::server::api::ApiController {
private:
  // 模拟数据库
  std::unordered_map<oatpp::Int64, oatpp::Object<UserDto>> m_db;
  std::atomic<oatpp::Int64> m_idCounter{1};
public:
  UserController(const std::shared_ptr<ObjectMapper>& objectMapper)
    : oatpp::web::server::api::ApiController(objectMapper)
  {}

public:

  static std::shared_ptr<UserController> createShared(
    OATPP_COMPONENT(std::shared_ptr<ObjectMapper>, objectMapper)
  ){
    return std::make_shared<UserController>(objectMapper);
  }

  /**
   * 查单个用户
   */
  ENDPOINT("GET", "/users/{userId}", getUserById,
           PATH(Int64, userId))
  {
    auto it = m_db.find(userId);
    if(it == m_db.end()){
      return createResponse(Status::CODE_404, "user not found");
    }
    return createDtoResponse(Status::CODE_200, it->second);
  }

  /**
   * 查所有用户
   */
  ENDPOINT("GET", "/users", listUsers) {
    auto list = oatpp::List<oatpp::Object<UserDto>>::createShared();
    for(auto& pair : m_db) {
      list->push_back(pair.second);
    }
    return createDtoResponse(Status::CODE_200, list);
  }

  /**
   * 新增用户
   */
  ENDPOINT("POST", "/users", createUser,
           BODY_DTO(Object<UserDto>, userDto))
  {
    userDto->id = m_idCounter++;
    m_db[userDto->id] = userDto;
    return createDtoResponse(Status::CODE_201, userDto);
  }

  /**
   * 修改用户
   */
  ENDPOINT("PUT", "/users/{userId}", updateUser,
           PATH(Int64, userId),
           BODY_DTO(Object<UserDto>, userDto))
  {
    auto it = m_db.find(userId);
    if(it == m_db.end()){
      return createResponse(Status::CODE_404, "user not found");
    }
    userDto->id = userId;
    m_db[userId] = userDto;
    return createDtoResponse(Status::CODE_200, userDto);
  }

  /**
   * 删除用户
   */
  ENDPOINT("DELETE", "/users/{userId}", deleteUser,
           PATH(Int64, userId))
  {
    m_db.erase(userId);
    return createResponse(Status::CODE_200, "user deleted");
  }

};

#include OATPP_CODEGEN_END(ApiController)

#endif /* UserController_hpp */

4.6.src/App.cpp 主入口

cpp 复制代码
#include "AppComponent.hpp"
#include "controller/UserController.hpp"

#include "oatpp-swagger/Controller.hpp"
#include "oatpp/network/Server.hpp"

#include <iostream>

void run() {
  // 初始化组件
  AppComponent components;

  // 获取路由
  OATPP_COMPONENT(std::shared_ptr<oatpp::web::server::HttpRouter>, router);

  // 注册控制器
  router->addController(UserController::createShared());
  // 注册 Swagger
  router->addController(oatpp::swagger::Controller::createShared());

  // 获取连接处理器 & 服务
  OATPP_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, connectionProvider);
  auto handler = oatpp::web::server::HttpConnectionHandler::createShared(router);
  oatpp::network::Server server(connectionProvider, handler);

  // 启动
  OATPP_LOGI("Server", "running on http://0.0.0.0:8000");
  OATPP_LOGI("Swagger", "http://0.0.0.0:8000/swagger/ui");
  server.run();
}

int main() {
  oatpp::base::Environment::init();
  run();
  oatpp::base::Environment::destroy();
  return 0;
}

4.7.编译并启动服务

cpp 复制代码
//[1]
mkdir build && cd build
cmake ..
make -j8

//[2]
./oatpp-app

总结:

  • 完整 RESTful CRUD
  • DTO 自动 JSON 序列化
  • 路径参数 / 表单 / JSON Body 自动绑定
  • Swagger 自动接口文档
  • 依赖注入(OATPP_COMPONENT)
  • 内存模拟数据库
  • 标准 Oat++ 项目结构

5.性能与对比

1.性能指标

  • 并发连接:Async-API 模式下单服务器可处理 500 万 + WebSocket 连接
  • 内存占用:启动内存约 5-8MB,高并发下内存增长稳定 (内存池优化)
  • 吞吐量:在测试中展现出比 Crow、Pistache 更高的吞吐量
  • 二进制大小 :嵌入式场景下最小应用体积仅1MB 左右

2.主流 C++ Web 框架对比

框架 依赖 并发模型 性能 适合场景
Oat++ 零依赖 同步 + 异步 (协程) ★★★★★ IoT、嵌入式、高并发微服务
Drogon Boost 异步 (I/O 复用) ★★★★☆ 高性能 Web 服务
Crow Boost 同步 (部分异步支持) ★★★☆☆ 快速开发,轻量级应用
Pistache 无 (但依赖 C++17) 异步 ★★★★☆ 现代 C++ 风格应用
Poco 自身库 同步 ★★★☆☆ 企业级应用,功能全面

Drogon: 一个开源的C++高性能Web框架
Poco: 一个功能丰富、易于使用的跨平台C++开发框架(FTP上传下载、断点续传、HTTP的GET请求等)

6.适用场景

  • 嵌入式 Web 服务:零依赖特性使其成为嵌入式设备 (如树莓派) Web 界面的理想选择
  • IoT 与机器人:Oat++ 在 IoT 和机器人领域应用最为广泛,适合构建设备管理 API
  • 微服务架构:轻量级、高性能、低资源消耗,适合容器化部署
  • 实时通信:WebSocket 支持适合聊天应用、实时监控系统
  • 高性能 API:金融、游戏等对延迟敏感的应用
  • 跨平台应用:一次编写,多平台部署,减少移植成本

7.总结

Oat++ 以其零依赖、高性能、双 API 模式和丰富的功能集,成为 C++ Web 开发的优秀选择,特别适合对依赖控制严格、追求高性能和可移植性的项目。无论是构建嵌入式设备的轻量级 API,还是开发处理海量并发的云服务,Oat++ 都能提供简洁、高效的解决方案。

相关推荐
陈天伟教授2 小时前
心电心音同步分析-案例:原型设计一
开发语言·人工智能·python·语言模型·架构
Allen_LVyingbo2 小时前
量子计算Dirac Notation基本教学—从零基础到读懂量子信息论文(下)
开发语言·人工智能·python·数学建模·量子计算
wjs20242 小时前
Ruby File 类和方法
开发语言
xyq20242 小时前
API 类别 - UI 核心
开发语言
Dxy12393102162 小时前
Python路径算法简介
开发语言·python·算法
文慧的科技江湖2 小时前
光储充协同的终极闭环:用SpringCloud微服务打造“发-储-充-用“智能能源网络 - 慧知开源充电桩管理平台
java·开发语言·spring cloud·微服务·能源·充电桩开源平台·慧知重卡开源充电桩平台
東雪木2 小时前
Java学习——内部类(成员内部类、静态内部类、局部内部类、匿名内部类)的用法与底层实现
java·开发语言·学习·java面试
昵称暂无12 小时前
通过 C# 复制 Word 文档、指定段落、指定节
开发语言·c#·word
满满和米兜2 小时前
【Java基础】-I/O-字符流
java·开发语言·python