[English version](README.md)   |   [Wiki:SRPC架构介绍](/docs/wiki.md) srpc-logo ### NEW !!! 👉 [SRPC tools : 一个帮你快速构建Workflow和SRPC项目的小工具.](/tools/README_cn.md) ## Introduction #### SRPC是全搜狗业务线上使用的企业级RPC系统,目前每天承载上百亿的请求量,涵盖搜广推及其他类型业务。主要功能和特点: * 底层基于[Sogou C++ Workflow](https://github.com/sogou/workflow),兼具: * 高性能、低延迟、轻量级 * 低开发和接入门槛 * 完美兼容workflow的串并联任务流 * 对于已有protobuf/thrift描述文件的项目,可以做到一键迁移 * 支持Linux / MacOS / Windows等多操作系统 * 支持多种IDL格式,包括: * Protobuf * Thrift * 支持多种数据布局,使用上完全透明,包括: * Protobuf serialize * Thrift Binary serialize * json serialize * 支持多种压缩,使用上完全透明,包括: * gzip * zlib * snappy * lz4 * 支持多种通信协议,使用上完全透明,包括: * tcp * http * sctp * ssl * https * 用户可以通过http+json实现跨语言: * 如果自己是server提供方,用任何语言的http server接受post请求,解析若干http header即可 * 如果自己是client调用方,用任何语言的http client发送post请求,添加若干http header即可 * 内置了可以与其他RPC框架的server/client无缝互通的client/server,包括: * SRPC * BRPC * TRPC (目前唯一的TRPC协议开源实现) * Thrift Framed Binary * Thrift Http Binary * 兼容workflow的使用方式: * 提供创建任务的接口来创建一个rpc任务 * 可以把rpc任务放到任务流图中,回调函数里也可以拿到当前的任务流 * workflow所支持的其他功能,包括upstream、计算调度、异步文件IO等 * AOP模块化插件管理: * 可上报tracing和metrics到[OpenTelemetry](https://opentelemetry.io) * 可上报监控到[Prometheus](https://prometheus.io) * 轻松对接其他云原生系统 * 支持srpc协议的Envoy-filter,满足Kubernetes用户的使用需求 * [更多功能和层次介绍](docs/rpc.md) ## Installation * srpc默认会编译出静态库libsrpc.a和动态库libsrpc.so(或者dylib或dll) * srpc依赖workflow和protobuf3 * protobuf需要用户自行安装v3.11.0或以上的版本 * workflow可以通过git的submodule形式进行依赖 * 压缩库snappy和lz4也以submodule的形式在third_party/中作源码依赖 * workflow、snappy和lz4也可以系统预装,如果thirt_party中没有拉取源码依赖,则会从系统默认安装路径寻找,snappy的预装要求版本是v1.1.6或以上 * Windows版下srpc代码无差异,需要依赖workflow的windows分支 ~~~sh git clone --recursive https://github.com/sogou/srpc.git cd srpc make ~~~ ### 安装(Fedora Linux): srpc已为Fedora打包。 为了开发目的安装srpc库: ~~~sh sudo dnf install srpc-devel ~~~ 要安装srpc库以进行部署,请执行以下操作: ~~~sh sudo dnf install srpc ~~~ ## Tutorial * [第1步:设计IDL描述文件](docs/docs-01-idl.md) * [第2步:实现ServiceIMPL](docs/docs-02-service.md) * [第3步:启动Server](docs/docs-03-server.md) * [第4步:使用Client](docs/docs-04-client.md) * [第5步:了解异步Context](docs/docs-05-context.md) * [第6步:与workflow的结合使用](docs/docs-06-workflow.md) * [第7步:使用SRPC发送HTTP协议](docs/docs-07-srpc-http.md) * [第8步:链路上报到OpenTelemetry](docs/docs-08-tracing.md) * [第9步:监控指标的使用与上报](docs/docs-09-metrics.md) * [第10步:附带生态模块功能的Workflow风格Http](/docs/docs-10-http-with-modules.md) 简单的命令即可编译示例: ~~~sh cd tutorial make ~~~ ## Quick Start #### 1. example.proto ~~~proto syntax = "proto3";//这里proto2和proto3都可以,srpc都支持 message EchoRequest { string message = 1; string name = 2; }; message EchoResponse { string message = 1; }; service Example { rpc Echo(EchoRequest) returns (EchoResponse); }; ~~~ #### 2. generate code ~~~sh protoc example.proto --cpp_out=./ --proto_path=./ srpc_generator protobuf ./example.proto ./ ~~~ #### 3. server.cc ~~~cpp #include #include #include "example.srpc.h" using namespace srpc; class ExampleServiceImpl : public Example::Service { public: void Echo(EchoRequest *request, EchoResponse *response, RPCContext *ctx) override { response->set_message("Hi, " + request->name()); printf("get_req:\n%s\nset_resp:\n%s\n", request->DebugString().c_str(), response->DebugString().c_str()); } }; void sig_handler(int signo) { } int main() { signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); SRPCServer server_tcp; SRPCHttpServer server_http; ExampleServiceImpl impl; server_tcp.add_service(&impl); server_http.add_service(&impl); server_tcp.start(1412); server_http.start(8811); getchar(); // press "Enter" to end. server_http.stop(); server_tcp.stop(); return 0; } ~~~ #### 4. client.cc ~~~cpp #include #include "example.srpc.h" using namespace srpc; int main() { Example::SRPCClient client("127.0.0.1", 1412); EchoRequest req; req.set_message("Hello, srpc!"); req.set_name("workflow"); client.Echo(&req, [](EchoResponse *response, RPCContext *ctx) { if (ctx->success()) printf("%s\n", response->DebugString().c_str()); else printf("status[%d] error[%d] errmsg:%s\n", ctx->get_status_code(), ctx->get_error(), ctx->get_errmsg()); }); getchar(); // press "Enter" to end. return 0; } ~~~ #### 5. make 在Linux系统下的编译示例如下,其他平台建议到[tutorial](/tutorial)目录下使用完整的cmake文件协助解决编译依赖问题。 ~~~sh g++ -o server server.cc example.pb.cc -std=c++11 -lsrpc g++ -o client client.cc example.pb.cc -std=c++11 -lsrpc ~~~ #### 6. run 终端1: ~~~sh ./server ~~~ 终端2: ~~~sh ./client ~~~ 也可以用CURL发送http请求: ~~~sh curl 127.0.0.1:8811/Example/Echo -H 'Content-Type: application/json' -d '{message:"from curl",name:"CURL"}' ~~~ 终端1输出: ~~~sh get_req: message: "Hello, srpc!" name: "workflow" set_resp: message: "Hi, workflow" get_req: message: "from curl" name: "CURL" set_resp: message: "Hi, CURL" ~~~ 终端2输出: ~~~sh message: "Hi, workflow" ~~~ CURL收到的回复: ~~~sh {"message":"Hi, CURL"} ~~~ ## Benchmark * CPU 2-chip/8-core/32-processor Intel(R) Xeon(R) CPU E5-2630 v3 @2.40GHz * Memory all 128G * 10 Gigabit Ethernet * BAIDU brpc-client使用连接池pooled模式 #### 跨机单client→单server在不同并发的QPS ~~~ Client = 1 ClientThread = 64, 128, 256, 512, 1024 RequestSize = 32 Duration = 20s Server = 1 ServerIOThread = 16 ServerHandlerThread = 16 ~~~ ![IMG](/docs/images/benchmark2.png) #### 跨机多client→单server在不同client进程数的QPS ~~~ Client = 1, 2, 4, 8, 16 ClientThread = 32 RequestSize = 32 Duration = 20s Server = 1 ServerIOThread = 16 ServerHandlerThread = 16 ~~~ ![IMG](/docs/images/benchmark4.png) #### 同机单client→单server在不同并发下的QPS ~~~ Client = 1 ClientThread = 1, 2, 4, 8, 16, 32, 64, 128, 256 RequestSize = 1024 Duration = 20s Server = 1 ServerIOThread = 16 ServerHandlerThread = 16 ~~~ ![IMG](/docs/images/benchmark3.png) #### 同机单client→单server在不同请求大小下的QPS ~~~ Client = 1 ClientThread = 100 RequestSize = 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768 Duration = 20s Server = 1 ServerIOThread = 16 ServerHandlerThread = 16 ~~~ ![IMG](/docs/images/benchmark1.png) #### 同机单client→单server在固定QPS下的延时CDF ~~~ Client = 1 ClientThread = 50 ClientQPS = 10000 RequestSize = 1024 Duration = 20s Server = 1 ServerIOThread = 16 ServerHandlerThread = 16 Outiler = 1% ~~~ ![IMG](/docs/images/benchmark5.png) #### 跨机多client→单server在固定QPS下的延时CDF ~~~ Client = 32 ClientThread = 16 ClientQPS = 2500 RequestSize = 512 Duration = 20s Server = 1 ServerIOThread = 16 ServerHandlerThread = 16 Outiler = 1% ~~~ ![IMG](/docs/images/benchmark6.png) ## 与我们联系 * **Email** - **[liyingxin@sogou-inc.com](mailto:liyingxin@sogou-inc.com)** - 主要作者 * **Issue** - 使用中的任何问题都欢迎到[issues](https://github.com/sogou/srpc/issues)进行交流。 * **QQ** - 群号: ``618773193``