从客户端视角看,Thrift 建立连接一共需要五个元素
① 服务器 IP
② 服务器 端口 Port
③ 传输方式 Transport
④ 编码协议 Protocol
⑤ 服务 Stub(接口类)
1、传输方式 Transport 常见类型及区别
| 传输类 | 底层依赖 | 是否带消息边界 | 是否适合非阻塞 | 是否推荐 | 构造方式 |
|---|---|---|---|---|---|
| TSocket | TCP | 无 | 否 | 只作基础 | 方式2 |
| TBufferedTransport | TCP | 无 | 否 | 旧项目 | 方式2 |
| TBufferedTransport | TCP | 有 | 是 | 强烈推荐 | 方式2 |
| TZlibTransport | TCP | 无 | 否 | 用于压缩 | 方式2 |
| THttpClient | HTTP | 有 | 是 | Web 场景 | 方式1 |
方式1:
cpp
// ✅ 只有 HTTP 客户端是这样构造的
std::make_shared<THttpClient>(host, port);
方式2:
cpp
// ✅ 其他所有 Transport 都必须这样构造
auto sock = std::make_shared<TSocket>(host, port);
auto trans = std::make_shared<XXXTransport>(sock);
2、编码协议 Protocol常见类型及区别
Protocol 决定数据变成网络字节时是:
- 文本
- 二进制
- 压缩
- 精简字段编号
| Protocol | 编码方式 | 是否二进制 | 速度 | 可读性 | 是否推荐 |
|---|---|---|---|---|---|
| TBinaryProtocol | 标准二进制 | ✅ | 快 | ❌ | ✅ |
| TCompactProtocol | 压缩二进制 | ✅ | 更快 | ❌ | ✅✅✅ |
| TJSONProtocol | JSON 文本 | ❌ | 慢 | ✅ | 只适合调试 |
| TSimpleJSONProtocol | 简化 JSON | ❌ | ❌ | ✅ | 已很少用 |
| TDebugProtocol | 调试输出 | ❌ | ❌ | ✅ | 只用于日志 |
构造方式:
cpp
proto_ = std::make_shared<具体Protocol类型>(trans_);
3、连接
此时已经配置好了传输方式 Transport 和编码协议 Protocol,那么就可以连接服务端了。
cpp
auto sock = std::make_shared<TSocket>(ip, port); // ① 创建 TCP socket
auto trans = std::make_shared<TFramedTransport>(sock); // ② 绑定传输层
auto proto = std::make_shared<TCompactProtocol>(trans); // ③ 绑定协议层
trans->open(); // ✅ ④ 真正建立 TCP 连接
client = std::make_shared<SampleRegLCClient>(proto); // ⑤ 创建客户端桩