baidu / sofa-pbrpc

A light-weight RPC implement of google protobuf RPC framework.
Other
2.13k stars 655 forks source link

RPC 多协议支持 #167

Closed cyshi closed 7 years ago

cyshi commented 7 years ago

背景

目前存在许多通信框架,而各个框架又都使用自己的一套协议。用户从一个框架迁移到另一个框架的时候,要么需要开发代理,要么就全部迁移,负担比较重。此外,通过升级多协议的支持,rpc也可以方便的访问各类其他服务,例如redis等。

实现

struct Protocol
{
    // Parse 函数用户从传入的数据中解析出一条消息,client & server都需要实现此接口
    // @param data 原始数据
    // @param size 数据大小
    // @param st MessageStream自身的一些中间状态,例如当前已接收的消息大小等
    // @param item 解析出的消息
    struct ReceivedItem;
    typedef ParseResult (*Parse)(char* data, int* size, ParseState* st, ReceivedItem* item);
    Parse parse;

    // 序列化接口,将request序列化到buf中 client需要实现此接口
    typedef int (*SerializeRequest)(const google::protobuf::Message* request, WriteBufferPtr buf);
    SerializeRequest serialize_request;

    // 将request_buf打包到message中 client需要实现此接口
    typedef int (*PackRequest)(WriteBufferPtr request_buf, WriteBufferPtr message);
    PackRequest pack_request;

    // 请求处理 server端需要实现
    typedef int (*ProcessRequest)(ReadBufferPtr);
    ProcessRequest process_request;

    // 响应处理 client端需要实现
    typedef int (*ProcessResponse)(ReadBufferPtr);
    ProcessResponse process_response;

    // 一些协议可能需要多连接的支持,比如 HTTP /1.0
    bool need_multi_connection;

    enum ProtocolType
    {
        UNKNOWN,
        SOFA_PBRPC,
        HTTP,
        NSHEAD,
        REDIS,
        GRPC
    };

    // 协议类型
    ProtocolType type;

    // 协议名称
    const char* name;
};
zd-double commented 7 years ago

赞!这样升级后对数据协议的扩展更加灵活。

有一点想法就是need_multi_connection是否独立出来作为channel的一个选项更加合适?因为数据协议和连接模式解耦好像更灵活一点。例如pb协议在一般的场景下单连接即可,在采用backup_request策略时可能开启多连接效果更好。

cyshi commented 7 years ago

@zd-double 没太明白

用户创建 RpcChannel 时,应指定这个channel对应的协议

实际连接模式已经是channel的一个选项了

wankai commented 7 years ago

@cyshi , hello,请问客户端多协议支持在开发中吗?

cyshi commented 7 years ago

@wankai sorry 涉及了一些厂里自有协议 暂时不能开源