• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

srpc: 基于C++ Workflow的RPC框架,支持百度bRPC、腾讯tRPC以及thrift协议。 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

srpc

开源软件地址:

https://gitee.com/sogou/srpc

开源软件介绍:

English version   |   Wiki:SRPC架构介绍

srpc-logo

Introduction

SPRC是全搜狗业务线上使用的企业级RPC系统,目前每天承载上百亿的请求量,涵盖搜广推及其他类型业务。主要功能和特点:

  • 底层基于Sogou C++ 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模块化插件管理:
    • 可对接OpenTelemetry(tracing链路数据上报)
    • 轻松上报其他云原生系统
  • 支持srpc协议的Envoy-filter,满足Kubernetes用户的使用需求
  • 更多功能和层次介绍

Installation

  • srpc是一个静态库libsrpc.a,只有开发环境需要依赖libsrpc,编译后二进制发布不需要依赖libsrpc库
  • srpc依赖workflow和protobuf3
    • protobuf需要用户自行安装v3.12.0或以上的版本
    • workflow可以通过git的submodule形式进行依赖
    • 压缩库snappy和lz4也以submodule的形式在third_party/中作源码依赖
    • workflow、snappy和lz4也可以系统预装,如果thirt_party中没有拉取源码依赖,则会从系统默认安装路径寻找,snappy的预装要求版本是v1.1.6或以上
  • Windows版下srpc代码无差异,需要依赖workflow的windows分支
git clone --recursive https://github.com/sogou/srpc.gitcd srpcmake

Tutorial

简单的命令即可编译示例:

 cd tutorial make

Quick Start

1. example.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

protoc example.proto --cpp_out=./ --proto_path=./srpc_generator protobuf ./example.proto ./

3. server.cc

#include <stdio.h>#include <signal.h>#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

#include <stdio.h>#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目录下使用完整的cmake文件协助解决编译依赖问题。

g++ -o server server.cc example.pb.cc -std=c++11 -lsrpcg++ -o client client.cc example.pb.cc -std=c++11 -lsrpc

6. run

终端1:

./server

终端2:

./client

也可以用CURL发送http请求:

curl 127.0.0.1:8811/Example/Echo -H 'Content-Type: application/json' -d '{message:"from curl",name:"CURL"}'

终端1输出:

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输出:

message: "Hi, workflow"

CURL收到的回复:

{"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 = 1ClientThread = 64, 128, 256, 512, 1024RequestSize = 32Duration = 20sServer = 1ServerIOThread = 16ServerHandlerThread = 16

IMG

跨机多client→单server在不同client进程数的QPS

Client = 1, 2, 4, 8, 16ClientThread = 32RequestSize = 32Duration = 20sServer = 1ServerIOThread = 16ServerHandlerThread = 16

IMG

同机单client→单server在不同并发下的QPS

Client = 1ClientThread = 1, 2, 4, 8, 16, 32, 64, 128, 256RequestSize = 1024Duration = 20sServer = 1ServerIOThread = 16ServerHandlerThread = 16

IMG

同机单client→单server在不同请求大小下的QPS

Client = 1ClientThread = 100RequestSize = 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768Duration = 20sServer = 1ServerIOThread = 16ServerHandlerThread = 16

IMG

同机单client→单server在固定QPS下的延时CDF

Client = 1ClientThread = 50ClientQPS = 10000RequestSize = 1024Duration = 20sServer = 1ServerIOThread = 16ServerHandlerThread = 16Outiler = 1%

IMG

跨机多client→单server在固定QPS下的延时CDF

Client = 32ClientThread = 16ClientQPS = 2500RequestSize = 512Duration = 20sServer = 1ServerIOThread = 16ServerHandlerThread = 16Outiler = 1%

IMG

与我们联系

  • Email - [email protected] - 主要作者
  • Issue - 使用中的任何问题都欢迎到issues进行交流。
  • QQ - 群号: 618773193

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap