深入解析Sogou SRPC框架:基于Workflow的高性能RPC实现

【免费下载链接】srpc RPC framework based on C++ Workflow. Supports SRPC, Baidu bRPC, Tencent tRPC, thrift protocols. 【免费下载链接】srpc 项目地址: https://gitcode.com/gh_mirrors/sr/srpc

前言

在现代分布式系统开发中,RPC(远程过程调用)框架扮演着至关重要的角色。本文将深入解析Sogou开源的SRPC框架,这是一个基于Workflow项目构建的高性能RPC实现,具有架构精巧、性能优异的特点。

一、SRPC框架概述

SRPC是搜狗公司基于Workflow项目开发的RPC框架,核心代码约1万行。它通过解析IDL(接口描述文件)并生成代码,实现了与Workflow底层通信框架的无缝对接,提供了简洁易用的用户接口。

核心设计理念

SRPC采用了纵向解耦、横向可扩展的架构设计,通过多种泛型编程方式实现了高度代码复用。这种设计使得:

  • 新增中间层非常方便
  • 各层内部可轻松扩展新功能
  • 整体架构保持简洁优雅

二、SRPC架构层次解析

SRPC采用分层架构设计,各层职责明确且相互解耦:

1. 核心层次划分

  • 用户代码层:包含客户端发送函数和服务端函数实现
  • IDL序列化层:支持protobuf/thrift序列化
  • 数据组织层:处理protobuf/thrift/json数据格式
  • 压缩层:提供none/gzip/zlib/snappy/lz4等多种压缩算法
  • 协议层:实现SRPC-std/BRPC-std/Thrift-framed/TRPC等协议
  • 通信层:支持TCP/HTTP等传输协议

2. 层次间关系

各层次可以灵活组合,通过函数重载、子类继承和模板特化等多种多态方式实现代码复用。这种设计使得架构升级和功能扩展都非常便捷。

三、协议与通信实现

1. 协议设计

SRPC实现了多种RPC协议,其中SRPC-std协议结构如下:

| 魔数(4B) | 元数据长度(4B) | 元数据 | 请求/响应数据 |

元数据包含service和method信息,请求/响应数据则是完整的IDL内容。

2. 通信协议组合

SRPC支持协议层和通信层的灵活组合,目前已实现7种网络通信协议:

  • SRPCStd/SRPCHttp
  • BRPCStd
  • TRPCStd/TRPCHttp
  • ThriftBinaryFramed/ThriftBinaryHttp

这种组合能力使得SRPC可以同时支持二进制协议和HTTP协议,极大提高了框架的适用性。

四、代码生成机制

1. 代码生成必要性

SRPC通过代码生成来解决以下问题:

  • 网络数据到结构体的反序列化
  • 为用户提供结构体参数接口
  • 简化用户接口复杂度

2. 生成代码示例

对于protobuf定义的service,SRPC生成的接口比原生protobuf接口更简洁:

// Server接口
class Service : public srpc::RPCService {
public:
    virtual void Echo(EchoRequest *request, EchoResponse *response,
                     srpc::RPCContext *ctx) = 0;
};

// Client接口
class SRPCClient : public srpc::SRPCClient {
public:
    void Echo(const EchoRequest *req, EchoDone done);
};

3. 多协议支持

SRPC为每种IDL生成对应的多协议客户端,例如protobuf IDL会生成:

class SRPCClient : public srpc::SRPCClient;
class SRPCHttpClient : public srpc::SRPCHttpClient;
class BRPCClient : public srpc::BRPCClient;
class TRPCClient : public srpc::TRPCClient;

五、调用接口设计

SRPC提供了丰富的调用接口,满足不同场景需求:

1. 异步接口

void Echo(const EchoRequest *req, EchoDone done);

2. 同步接口

void Echo(const EchoRequest *req, EchoResponse *resp, 
          srpc::RPCSyncContext *sync_ctx);

3. 半同步接口

WFFuture<std::pair<EchoResponse, srpc::RPCSyncContext>> 
async_Echo(const EchoRequest *req);

4. Task接口

srpc::SRPCClientTask *task = SRPCClient::create_Echo_task(done);
task->serialize_input(req);
task->start();

六、与Workflow深度集成

1. 任务流集成

通过RPCContext可以获取SeriesWork,实现任务流串联:

// 异步Server示例
void Echo(EchoRequest *request, EchoResponse *response, RPCContext *ctx) {
    auto *task = WFTaskFactory::create_timer_task(10, nullptr);
    ctx->get_series()->push_back(task);
}

2. Workflow功能复用

SRPC可以充分利用Workflow的多种功能:

  • 服务治理(upstream管理、负载均衡、熔断恢复)
  • 超时和重试配置
  • 计算和异步文件IO等系统资源

七、性能表现

SRPC在性能方面表现优异:

  • 吞吐量优于brpc和apache thrift
  • 长尾性能与brpc各有优势,但都优于thrift
  • 已在搜狗内部和多个开源团队中稳定运行

八、总结

SRPC框架通过精巧的架构设计,实现了:

  1. 多层次解耦,各层可独立扩展
  2. 多协议支持,兼容性强
  3. 与Workflow深度集成,功能丰富
  4. 性能优异,接口简洁易用

这种设计使得SRPC既适合快速开发,又能满足高性能需求,是分布式系统开发的优秀选择。随着生态的不断完善,SRPC有望成为RPC领域的重要解决方案之一。

【免费下载链接】srpc RPC framework based on C++ Workflow. Supports SRPC, Baidu bRPC, Tencent tRPC, thrift protocols. 【免费下载链接】srpc 项目地址: https://gitcode.com/gh_mirrors/sr/srpc

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐