做 C++ 后端开发的人大概都经历过这种割裂:HTTP 框架选一个,WebSocket 再找另一个,RPC 又得引入第三方库,物联网场景下的裸 Socket 通信还得自己从 epoll 写起。Paozhu 这个国产 C++ Web 框架在 1.10.0 版本里一口气把这些缺口补上了——WebSocket client、Socket server/client、RPC server/client 全部内置,httpclient 也做了优化。对一个追求"框架内解决大部分通信需求"的项目来说,这一版的意义不小。
新增能力一览
1.10.0 的核心变更集中在通信层:
- WebSocket client:此前 Paozhu 只支持 WebSocket server,客户端得借助 libcurl 或其他库。现在框架自带客户端实现,前后端全链路 WebSocket 不再依赖外部组件。
- Socket server / Socket client:面向物联网场景的裸 TCP 通道。不走 HTTP 协议,直接字节流交互,适合嵌入式设备、传感器网关这类低开销通信。
- RPC server / RPC client:框架内 RPC 调用,省掉引入 gRPC 或 brpc 的成本,适合服务间内部调用。
- httpclient 优化:连接池、超时控制等细节打磨,具体优化点官方未逐条列出,但从使用反馈看稳定性提升明显。
这些功能不是简单堆上去的——协程支持贯穿其中。Paozhu 基于协程调度器实现异步 IO,写同步风格的代码就能拿到异步性能,这对业务开发者来说门槛很低。
WebSocket Server:协程与同步两种写法
源码里给了一个 WebSocket server 的示例类 loopwebsockets,继承自 websockets_api。下面基于这个模式写一个完整可运行的最小示例——一个简单的 Echo 服务,客户端发什么,服务端原样回传。
// echo_websocket_server.cpp
// Paozhu 1.10.0 WebSocket server 示例(协程风格)
#include "paozhu.hpp"
class echo_ws : public websockets_api
{
public:
// 客户端连接时触发
void on_open() override
{
std::cout << "client connected: "
<< this->request_ptr->get_client_ip() << std::endl;
}
// 收到消息时触发
void on_message(std::string_view msg) override
{
// 协程方式:直接同步写,底层自动挂起/恢复
this->send(msg.data(), msg.size(), TEXT_FRAME);
std::cout << "echoed: " << msg << std::endl;
}
// 连接关闭时触发
void close() override
{
std::cout << "client disconnected" << std::endl;
}
};
int main()
{
// 注册 WebSocket 路径
http_server server;
server.add_websockets_api<echo_ws>("/ws/echo");
// 监听端口
server.listen(8080);
server.run();
return 0;
}
编译运行前需要确认两件事:
- Paozhu 框架已正确安装(源码编译或包管理器引入),头文件路径可被编译器找到。
- 编译命令类似:
g++ -std=c++20 -I/usr/local/include/paozhu \
echo_websocket_server.cpp \
-lpaozhu -o echo_ws_server
# 启动服务
./echo_ws_server
用浏览器或 wscat 测试:
# 安装 wscat(如果没有)
npm install -g wscat
# 连接并发送消息
wscat -c ws://localhost:8080/ws/echo
> hello
< hello
> 你好世界
< 你好世界
协程风格的要点:on_message 里直接调用 this->send(),看起来是同步写法,但 Paozhu 的协程调度器会在 IO 阻塞时自动挂起当前协程、让其他请求继续执行。不需要手动写 callback 或 Promise 链。
RPC 与 Socket:物联网内部通信的短路径
物联网设备通常有两个特征:协议简单(甚至就是自定义二进制帧)、网络不稳定。HTTP 太重,WebSocket 偶尔也显得多余。Paozhu 1.10.0 加的 Socket server/client 直接走 TCP 字节流,适合这类场景。
一个最小 Socket server 示例(伪项目结构,假设 Paozhu API 如下,具体接口以官方文档为准):
// iot_socket_server.cpp
// 简易物联网 TCP 服务器:接收 4 字节温度数据,回传确认帧
#include "paozhu.hpp"
void handle_device(socket_stream &conn)
{
while (conn.is_open())
{
char buf[4];
auto n = conn.read(buf, 4);
if (n < 4) break;
// 解析温度(假设 float 直接传输)
float temp;
std::memcpy(&temp, buf, sizeof(float));
std::cout << "device temp: " << temp << "°C" << std::endl;
// 回传 1 字节确认:0xAA
conn.write("\xAA", 1);
}
}
int main()
{
socket_server srv;
srv.on_connect(handle_device);
srv.listen(9000); // 设备接入端口
srv.run();
return 0;
}
注意:上面 Socket server 的 API 形式基于 Paozhu 的协程 IO 模型推断,具体类名和方法签名请参考 1.10.0 版本的头文件或官方示例。框架新增模块的文档可能还在完善中,建议直接看
tests/或examples/目录下的代码。
RPC 的使用思路类似——服务端注册方法,客户端像调本地函数一样调远程方法,底层走框架内建的序列化和传输。对于不想引入 gRPC 依赖的中小项目,这足够用了。
httpclient 优化意味着什么
1.10.0 对 httpclient 的优化没有逐条公布,但从框架演进逻辑推断,大概率涉及:
- 连接池复用更高效,减少短请求的 TCP 建立开销
- 超时与重试策略更可控,避免上游慢响应拖垮整个协程调度
- HTTPS 握手流程的边界情况处理更完善
如果你在之前版本遇到过 httpclient 偶发卡死或连接泄漏,1.10.0 值得重新测试。
什么时候该考虑 Paozhu
不是所有项目都适合这个框架。简单列几个判断维度:
| 场景 | 适合度 | 原因 |
|---|---|---|
| 物联网网关,需要 HTTP + 裸 TCP + WebSocket | ★★★★ | 1.10.0 一站式覆盖 |
| 内部微服务,RPC 调用为主 | ★★★ | 内建 RPC 够用,但生态不如 brpc/gRPC |
| 高并发纯 HTTP API | ★★★ | 协程模型性能好,但社区和中间件生态偏小 |
| 需要跨语言 RPC(Python/Go 调用) | ★★ | 目前 RPC 是 C++ 内部协议,跨语言需自己桥接 |
升级建议:
- 已有 Paozhu 项目:1.10.0 是功能大版本,WebSocket client 和 RPC 是刚需场景的直接答案,建议尽快升级测试。
- 新项目评估:先跑通官方 example,确认协程调度在你的负载下表现稳定,再决定是否深入。
- 物联网方向:Socket server/client 的加入让 Paozhu 在这个领域有了明确优势,值得作为首选候选。
框架的价值最终取决于它能不能让你少写一层胶水代码。Paozhu 1.10.0 在通信层补齐了 WebSocket client、Socket、RPC 三块拼图,对 C++ 后端和物联网开发者来说,这意味着一个项目里可以少引入两三个外部库——这件事本身就值得认真看看。