首页
学习
活动
专区
圈层
工具
发布

腾讯开源框架TarsCpp-rpc设计分析-client(二)

3 ObjectProxy概要设计

设置解析协议、选择服务端节点、建立连接、管理连接,如何发送请求、接收结果,这些细节都封装在了ObjectProxy中。

先说明ObjectProxy包含的主要组件,然后介绍组件间的调用关系。

3.1 主要组件说明

图1
  1. ObjectProxy包含两个组件:ProxyProtocol用来设置解析协议,包括如何序列化请求和反序列化结果;EndpointManager是路由管理器,封装细节
  2. EndpointManager包含两个组件:路由策略,提供不同的服务器节点选择方式;AdapterProxy是具体节点代理,继续封装细节
  3. AdapterProxy中,Transceiver提供tcp和udp协议封装;checkActive负责节点状态管理,例如本节点是否有效,是否已经连接等等;TC_TimeoutQueueNew是一个超时队列,用来管理请求数量和超时
  4. 图1中的粉色框是invoke方法,是AdapterProxy和ObjectProxy的对外接口

3.1.1 Transceiver

Transceiver才是“真正”干活的哥们。最基础的系统操作如::send和::readv都是在这里被封装的。设计Transceiver时候考虑的要素如图2。

图2
  1. connect环节需要注意的是连接状态和连接超时时间。
  2. 发送和接收环节需要注意设计高效缓存
  3. 注意设置套接字fd的相关属性,如TCP_NODELAY、SO_KEEPALIVE,使用fcntl设置非阻塞

3.2 组件关系说明

代码语言:txt
复制
void ObjectProxy::invoke(ReqMessage * msg)
{
    //选择一个远程服务的Adapter来调用
    AdapterProxy * pAdapterProxy = NULL;
    //EndpointManager* _endpointManger
    //selectAdapterProxy是封装的节点选择策略
    bool bFirst = _endpointManger->selectAdapterProxy(msg, pAdapterProxy);
    pAdapterProxy->invoke(msg);
}
  • 上面是精简后的ObjectProxy::invoke方法,比较清晰的展示了ObjectProxy、AdapterProxy 、EndpointManager三者之间的关系

下面继续用精简后的代码说明AdapterProxy 内部组件关系

代码语言:txt
复制
int AdapterProxy::invoke(ReqMessage * msg)
{
    //TC_TimeoutQueueNew* _timeoutQueue
    //未发链表有长度限制,如果请求队列满了,就不发到server端了
    if(_timeoutQueue->getSendListSize() >= _noSendQueueLimit)
    {
        finishInvoke(msg);
        return 0;
    }

    //对应的是图1中的ProxyProtocol
    _objectProxy->getProxyProtocol().requestFunc(msg->request, msg->sReqData);

    //交给连接发送数据,连接连上,buffer不为空,直接发送数据成功
    //Transceiver* _trans
    if(_timeoutQueue->sendListEmpty() && _trans->sendRequest(msg->sReqData.c_str(),msg->sReqData.size()) != Transceiver::eRetError)
    {
    }

    return 0;
}
下一篇
举报
领券