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

    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