tars源码分析-客户端部分

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

tars 客户端部分代码分析

项目地址: 转载请注明出处

主要类和功能

  • Communicator

    管理io线程和异步回调线程,相当于大脑, 协调各个部分的合作

  • CommunicatorEpoll

    io线程,内涵协程调度器,调度器内包含epoll切驱动epoll

  • ServantProxy

    远程调用的入口,不同的入口最终会调用servant_invoke, 函数内部组装message所需的数据。选择本线程的消息队列以及轮训选择CommunicatorEpoll(io线程)。message入队,唤醒io线程的epoller。

  • ObjectProxy

    servantProxy在CommunicatorEpoll中的替身。message经过线程消息队列,被epoller唤醒以后会交给ProjectProxy, 对应接口为invoke

  • AdaptorProxy

    objectProxy痛殴endpointMgr管理多个adaptorProxy, 每个AdaptorProxy对应一个远程服务。objectProxy承载的invoke会通过adaptorProxy负载到一个远程服务。具体的收发工作由TC_Transceiver承担。

初始化流程

  • ServantProxy创建

    • 创建ServantProxy依赖于Communicator实例。通过StringToServant生成。
    • 这里有一点需要注意,特例话的ServantProxy,例如helloPrx不会直接创建对象。tars的解决方案是生成基类ServantProxy,并且通过类型转换为HelloPrx类型。由于helloPrx中没有重写的虚接口,也没有自己的成员。所以,这样做是可行的。
    • helloPrx的代码是tars2cpp工具生成的。生成的代码主要功能是将函数参数根据tars协议序列化到buff中。
    • 具体流程体现在接口上为Communicator::stringToProxy()->Communicator::getServantProxy()->ServantProxyFactory::getServantProxy()->ServantProxy::ServantProxy()
      • ServantProxyFactory是在Communicator::initialize()中创建的。Communicator::initialize()在Communicator::getServantProxy首次调用的使用调用,在Cummunicator初始化部分会详细描述。
      • ServantProxy构造出来以后会调用ServantProxy::initialize()。其主要工作就是创建自己的替身并交由CommunicatorEpoll保管。每个CommunicatorEpoll都会创建一个。Communicator.h中也有详细的描述。
  • Cummunicator初始化

    • 创建ServantProxyFacto
tars源码解析二 tars源码解析二 准备知识 这节准备解析下tars的网络层和协议转换的源码,为了更好的理解这节,需要具备java网络层知识,主要是nio和Reactor模式。 nio的知识可以参考这个系列的文章 http://www.iteye.com/magazines/132-Java-NIO 这里简单说下Nio的概念,在bio模式下,因为socket读取数据是阻塞的,所以导致整个... 阅读详情

相关推荐

Tars源码分析---TC_EpollServer

前言 架构 IO_Thread Pool Handler Pool Adapter 总结 前言 这个系列的文章主要分析腾讯的开源RPC框架TarsTars除了提供RPC服务之外,还配套了一整套的运营管理平台。它同时支持C++,java等多种编程语言。本系列主要是分析tars的cpp部分实现,涉及的版本是github上最近release的1.40版。主要是在源...

Swartz2015的专栏 2054

tars源码漫谈第2篇------tc_common.h/tc_common.cpp(模板特化实现字符串的相关操作)

tc_common是很common的, 里面就是一些很common的功能。 很多软件开发, 可以直接用这些common代码, 省事,放心。 里面的代码很简单, 来看一个模板特化的代码实例:template <> string TC_Common::tostr<char>(const char &t) { char buf[2]; ...

认知 行动 坚持 6606

Tars源码分析---线程池实现

前言 TC_Thread ThreadWorker TC_ThreadPool TC_ThreadQueue 总结 前言 Tars底层实现了一个线程池库,主要源代码位于tc_thread_poo.(cpp,h)文件中。线程池队列涉及的核心是工作线程和任务队列的设计。本文基于tars中的实现进行介绍。 TC_Thread 线程池的工作线程类(ThreadWo...

Swartz2015的专栏 1872

Tarscpp实现Http协议

简介 要实现一个web server,需要了解基本的Http协议。 tars内置了对http协议的支持,使用还是比较简单的。 它复用了 tars rpc,因此也拥有了同步和异步以及超时的特性,并能够利用tars stat上报调用质量。 官方文档:https://github.com/TarsCloud/TarsDocs/blob/master/dev/tarscpp/tars-http1.md 本文结合笔者开发过程作一记录,并对开发中遇到的问题进行详细描述。 Http server 服务框架的生成与普通

guotianqing的博客 1517

tars-源码分析-服务端

server端代码分析 项目地址-作者lowkey 主要类简介 Application 我们实现的helloServer需要继承自这个类。主要承载配置的解析、epollser的初始化、消息的处理和分发、servant的创建和管理。 其中最主要的两个成员: EpollServer、ServantHelperManager TC_EpollServer 接收新的连接 负载所有io 消息分发到servant ServantHelperManager helloServer初始化的时候会通

lowkey956的博客 2670

例子 客户端_微服务开源框架TARSRPC源码解析 之 初识TARS C++客户端

作者:Cony导语:微服务开源框架TARSRPC调用包含客户端与服务端,《微服务开源框架TARSRPC源码解析》系列文章将从初识客户端客户端的同步及异步调用、初识服务端、服务端的工作流程四部分,以C++语言为载体,深入浅出地带你了解TARS RPC调用的原理。TARS是腾讯使用十年的微服务开发框架,目前支持C++、Java、PHP、Node.js、Go语言。该开源项目为用户提供了涉...

weixin_39710179的博客 246

tars源码分析之6

喜欢网络编程的同学,千万不要错过tars中关于socket的部分,来看看客户端操作。真的是非常经典,看看send/recv吧,写得真是严密:

认知 行动 坚持 548

tars源码分析之5

cgi的相关实现,一起来看下,还是很常规的:

认知 行动 坚持 420

Tars | 第5篇 基于TarsGo Subset路由规则的Java JDK实现方式(上)

TarsGo实现Subset规则源码分析前言1. 【核心】修改获取服务IP规则1.1 Go语言修改部分1.2 修改地方的逻辑2. 给EndpointF节点增加Subset配置2.1 Go语言修改部分2.2 修改地方的逻辑3. 根据ID获取Subset配置信息的接口3.1 Go语言修改部分3.2 修改地方的逻辑4. 实现透传染色Key功能4.1 Go语言修改部分4.2 修改地方的逻辑5. 新增工具类、染色字段5.1 Go语言修改部分5.2 修改地方的逻辑6. 添加或获取染色key的方法6.1 Go语言修改部分

多氯环己烷的博客 409

字节跳动UI-TARS-desktop:混合渲染架构下的高性能桌面应用开发新范式

在桌面应用开发领域,跨平台解决方案始终在性能与开发效率之间寻求平衡。传统Web技术栈(如Electron)凭借其高效的开发流程和丰富的前端生态,在快速构建跨平台应用方面展现出巨大优势,但其内存占用高、启动速度慢的瓶颈也日益凸显。相比之下,纯原生开发虽能实现极致性能与深度系统集成,却面临开发门槛高、迭代周期长的挑战。混合渲染架构作为一种新兴技术范式,旨在融合两者之长:它通过集成精简的浏览器渲染核心与JavaScript运行时,并直接调用原生系统API进行窗口管理与基础控件绘制,从而在保留Web开发敏捷性的同时

weixin_42452924的博客 363

grpc与brpcrpc框架总结

rpc

u013860464的博客 8704

tarsCpp源码分析

tarsCpp

u013860464的博客 1718

Tars源码学习

Tars源码学习文章的规划

CWX 1442

Tars源码分析---内存哈希表的实现

前言 基本原理 前言 在cpp/util中实现了基于内存的哈希表(hashmap.(cpp,h))。该哈希表支持dump到文件,以及从文件load到内存。在实现上,它基于传统的开链哈希,分别为每个哈希桶维护一个block链表,相同哈希值的kv对散列存储到相同的block链表中。链表中每个block存储具体的一个kv数据。由于hashmap使用TC_Mem...

Swartz2015的专栏 1593

tars源码漫谈第3篇------tc_ex.h/tc_ex.cpp(bt不是变态)

tc_ex中有异常类TC_Exception, 类中没有什么太多的功能, 对理解整个tars的作用不大。 尽管如此, 还是来看看如下函数:void TC_Exception::getBacktrace() { void * array[64]; int nSize = backtrace(array, 64); char ** symbols = backtrac...

认知 行动 坚持 5360

基于Tars高并发IM系统的设计与实现-实战篇2

源码编译过程需要安装:gcc, glibc, bison, flex, cmake下载源码编译安装错误处理如果cmake编译过程中遇到如下错误,directory.directory.到根目录执行如下命令:到servant目录独立拉TarsProtocol后改名为protocol:至此, Tars Cpp的编译环境已经完成;

lanhy999的专栏 371

基于Tars高并发IM系统的设计与实现-实战篇3

采用 tars2cpp 工具自动生成 c++文件:/usr/local/tars/cpp/tools/tars2cpp AuthServant.tars 会生成 AuthServant.h 文件,里面包含客户端和服务端的代码( 编译时会自动处理)。要满足高可用,高并发,低延时三大指标,需要在架构设计上能满足要求,Tars高性能框架能够完全满足高可用、高并发两项指标;一个完整高性能的IM服务设计在满足三大指标(高可用,高并发,低延时)、解决五大难题的同时,也要满足基本的业务功能。进入代码目录,首先做。

lanhy999的专栏 393

tars源码学习-内存管理

tars源码学习笔记1 内存分配器 原始内存块 TC_MemChunk TC_MemChunk(简称mc): 内部有两个指针,一个指向header,一个指向所管理的内存空间,管理的内存空间的具体信息都在header里,而且header占的空间也在自己的管辖范围内提前分出来(后面也是类似结构)。所管理的内存空间会按照指定数值大小分块管理,称为block。 头部结构tagChunkHead: 记录管理区域内的信息:每个block大小、block数量、第一个空闲block的index、总计的空闲bloc.

sszzyzzy的博客 294

tars源码分析之11

time provider函数,来看一下,用了单例模式:

认知 行动 坚持 1168
下一篇: tars-源码分析-服务端
lowkey956
博客等级 码龄10年 3粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值