专栏首页C++开源框架源码分析腾讯开源框架TarsCpp-rpc设计分析-client(二)
原创

腾讯开源框架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 组件关系说明

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 内部组件关系

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Tars-C++ 揭秘篇:文件描述符处理“套路”

    本章总结Tars中对文件描述符进行操作时的一些“套路”的做法,偏重异常时候的处理。这些处理方式在任何RPC框架中都是值得考虑的

    路小饭
  • Tars-C++ 揭秘篇:链接管理

    说完Tars-C++ 揭秘篇:TC_Buffer的妙用后,我们继续将关注点放在与收发相关的链接管理上。

    路小饭
  • 腾讯开源框架TarsCpp-rpc设计分析-client(三)

    从官方自带的例子TarsCpp/examples/QuickStartDemo/HelloServer/AsyncClient/main.cpp开始

    路小饭
  • Typescript配合React实践

    使用ts写React代码写了将近三个月,从刚开始觉得特别垃圾到现在觉得没有ts不行的一些实践以及思考。如果按部就班的写React就体会不到使用ts的乐趣,如果多...

    前端迷
  • 如何测试Android组件化

    1、Android组件化概念 组件化大致可分为功能组件化和业务组件化。功能组件化,常见的是将一些底层的公共功能模块进行独立化,如网络请求模块、登录注册模块等。业...

    用户5521279
  • 拜占庭将军:分布式领域的幽灵

    你可能听说过Paxos、Raft这类分布式一致性算法,也在工作中使用过ZooKeeper、etcd等工具来解决一致性问题。但你可能不知道,这些算法和工具解决的并...

    Oilbeater
  • Python告诉你想开一家美食店该怎么做

    大家好,又到了Python爬虫+数据分析可视化的专题,今天案例是对美团网杭州市美食团购的数据进行分析,如果已经或者最近有打算开一家美食团购店铺的读者,希望本文能...

    刘早起
  • 微信小程序入门(六)

    zhang_derek
  • 科学家采用人工智能探索黑洞奥秘

    黑洞是什么样的?据《华盛顿邮报》2016年6月报道,由于一种将全球多个射电望远镜的图像数据拼凑起来的机器学习算法,科学家可能将首次得以一睹黑洞的真面目。如果这个...

    人工智能快报
  • 第32章 IP路由原理

    280. 假设一台MSR 路由器获得两条去往目的网段100.120.10.0/24 的路由,这两条路由的Cost 分别是120和10,优先级分别是10 和150...

    week

扫码关注云+社区

领取腾讯云代金券