CNCF云原生全景图收录了一个国产轻量级RPC框架

651 阅读5分钟

大家好,我是马建仓。

今天在互联网摸鱼发现:一个在 Gitee 上开源的轻量级 RPC 框架「SRPC」 已经被收录到 CNCF云原生计算基金会的 LandscapeCloud Native Computing Foundation云原生交互全景图的 Orchestration & Management -Remote Procedure Call 一栏里。

CNCF 是 Linux基金会旗下的基金会,也是目前开源界运作最活跃的基金会之一。

CNCF Landscape 是 CNCF 中的一个重要的项目,它主要为云原生开发者们提供一个资源地图,帮助企业和开发人员快速理解云原生体系的全貌。

关于申请流程等问题,大家可以去 SRPC 项目开发者的知乎中查看:

zhuanlan.zhihu.com/p/497444507

总而言之,祝贺搜狗开源的 Workflow 团队,我们也借此机会来和大家聊聊 SRPC 这个项目。

什么是 RPC?

全称为:Remote Procedure Call,即远程过程调用。

RPC 做了什么?

通俗的说,有两台服务器A、B。一个应用部署在 A 上,若想要调用 B 上应用提供的函数/方法,由于内存空间的限制,不能直接调用,因此需要通过网络来表达调用的语义和传达调用的数据。

我们为什么需要 RPC 框架?

SRPC 的开发者认为,他对 RPC 的理解是:框架 < 协议 < 生态

即,框架基本只是协议的一种实现,重视性能与易用,协议是为了让大家互通,便于使用;而生态则是基于两者之上,能够更完善项目,丰富支持用户。

SRPC 是什么?

比起 SRPC,开发者可能更熟悉 Workflow。早在 2020 年 7 月底,搜狗公司就开源了企业内部的工业级 C++ 服务器引擎 Workflow,之后也开源了 Workflow 的生态项目—— SRPC

项目地址: gitee.com/sogou/workf…

具体的说,SRPC 是一个基于 Workflow 打造的轻量级 RPC 框架,通过解析部分 IDL(接口描述文件)和进行代码生成,实现了与 Workflow 底层通信框架的对接和非常简洁的用户接口。

它也是全搜狗业务线上使用的企业级 RPC 系统,目前每天承载上百亿的请求量,涵盖搜广推及其他类型业务。

项目地址: gitee.com/sogou/srpc 开源许可证: Apache-2.0

这两个项目都已经在 Gitee 上获得推荐,SRPC 还收录入 Gitee星球的项目推荐栏目。

Gitee星球 是 Gitee 旗下的创新研究所。在这里,我们收集整理了 Gitee 上高品质、有意思的开源项目,同时也挖掘 Gitee 项目作者的一手开源故事,邀请优秀的开发者们讲述自己的开源经历,举办有趣的开源活动。

欢迎各位开发者前往CNCF云原生全景图收录了一个国产轻量级RPC框架查看。

如果你对本期推荐感兴趣,也欢迎各位转发、点赞、评论。各位开发者如果你对 RPC 框架有其他的见解,欢迎在后台留言与我们一同讨论也欢迎给我推荐有趣的开源项目,如果收录进 Gitee 星球之后,将有小礼品噢~如果你想了解更多关于本期推荐项目的内容,也可以点击,前往作者仓库给他点个 Star。


项目层级

  • 用户代码(client的发送函数/server的函数实现)
  • IDL序列化(Protobuf/Thrift serialization)
  • 数据组织 (Protobuf/Thrift/json)
  • 压缩(none/gzip/zlib/snappy/lz4)
  • 协议 (SRPC-std/bRPC-std/Thrift-framed/tRPC)
  • 通信 (TCP/HTTP)

各层级可以相互拼装,利用函数重载、派生子类实现父类接口和模版特化等多种多态方式,来实现内部使用同一套代码的高度复用,通过解析部分 IDL(接口描述文件)和进行代码生成,实现了与 Workflow 底层通信框架的对接和非常简洁的用户接口。

SRPC 整体代码量大约1万行,内部使用多种泛型编程的方式,实现纵向解耦合、横向可扩展。

功能特点

1.高性能、低延迟、低开发与接入门槛、可看作性能较优的 thrift 框架或 brpc 框架。

  • 支持一键迁移 基于 Protobuf/Thrift 描述文件的项目

2.支持多种数据布局、多种压缩及多种通信协议。

  • 数据布局: Protobuf serialize/Thrift Binary serialize/json serialize
  • 压缩:gzip、zlib、snappy、lz4
  • 通信协议:TCP、HTTP、SCTP、SSL、HTTPS

3.内置可以与其他 RPC 框架的 server/client 无缝互通的 client/server。

  • 例如百度 bRPC,腾讯tRPC(唯一开源的tRPC协议实现),Google 的 gRPC,以及 Meta 的 thrift 协议

4.兼容 Workflow 的串并联任务流。

SRPC 除了提供同步、半同步接口外,其异步接口可以利用 Context 拿到 Series 来打通 Workflow 任务流,这就意味着 SRPC 可以把 RPC 调用当作任务流来组建。

使用方式:

  • 提供创建任务的接口来创建一个 RPC 任务
  • 可以把 RPC 任务放到任务流图中,回调函数里也可以拿到当前的任务流
  • Workflow所支持的其他功能,包括upstream、计算调度、异步文件IO 等

5.AOP 模块化插件管理

数据可上报到 OpenTelemetry(Tracing链路数据上报)。 OpenTelemetry 是 CNCF 的第二大项目,包括了 Tracing、Log、Metrics等等多个维度的统计数据收集与展示

Tracing链路数据上报方式:

int main()
{
    SRPCServer server;

    // jaeger http collector ip:port
    RPCSpanOpenTelemetry span_otel("http://127.0.0.1:55358"); 
    server.add_filter(&span_otel);

    // print the tracing info on the screen
    RPCSpanDefault span_log; 
    server.add_filter(&span_log);

    ...
  • 轻松上报其他云原生系统

模块化插件架构图

如何快速入门?

典型案例

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);
};

代码生成

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

服务器抄送

#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;
}

客户端抄送

#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;
}

实现

在 Linux系统下的编译示例如下,其他平台建议到 tutorial 目录下使用完整的 cmake 文件协助解决编译依赖问题。

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

项目架构


往期推荐

查看历史推荐的优质开源项目,欢迎同步关注 Gitee星球,一同学习高质量、好玩有趣的开源项目,探究技术大牛们都是怎么炼就的。

13岁初中生开源自创编辑器,网友:有被卷到,我真的会谢

都2022了,还要不要重复造轮子?

这次,华为硬核天才少年开源了一个桌面迷你机器人