微服务开源框架TARS的RPC源码 之 初识TARS C++服务端

总体架构

Application:一个服务端代表一个Application,主要是读取用户的配置文件,根据配置文件初始化代理,启用网络线程和业务线程。

TC-epollServer:管理业务模块和网络模块。

网络模块:NetThread

网络模块中有TC_Epoller作为io复用,TC_socket可以建立socket的连接,ConnectionList是网络连接的的记录,这个模块主要和数据的收发有关。

业务模块: HandleGroup与Handle

这些是业务模块,Handle是一个业务线程,Handlegroup是一组业务线程,业务线程是调用用户定义好的rpc服务。将结果放到缓存中等待网络模块的发送。

流程

分为网络线程和业务线程,首先会有一个网络线程进行监听,接受到新的连接后,构造一个connection实例,并选择处理这个连接的其他网络线程,请求需要被读后,暂存到接收队列中,等待业务线程来接收,这就是业务线程做的事情。业务线程做完之后,要进行数据的发送,此时网络线程便又会加入到流程中。

网络模块

1.首先创建TC_EpollServer,此管理着网络模块和业务模块,通过new来创建出epollserver,在创建epollserver时,网络模块的NetThread同时会被创建出来。

2.进行网络部分的初始化:即创建监听队列,之后接收客户端的连接,建立epoll,将套接字注册到epoll中。

3.每个网络线程都有自己的epoll,只有一个线程有监听套接字,防止发生惊群现象。是一种单线程监听,多线程处理的一种方式。产生连接套接字室分发到其他不同的线程中,同时有一个连接管理链表,应该是一个线程拥有一个链表,管理连接状态。

业务模块

1.业务模块存在着问题即业务模块负责的主要是从队列中取出数据包进行rpc调用,在rpc调用时需要将找到对应的本地服务,如何找到将会是一个问题?

方法:业务线程通Bindadapter的ID索引到服务的ID,再从服务ID索引到用户自定义的ServantImp的生成器。(在服务ID中通过反射到相应的ServantImp类)通过生成器去调用相应的方法。

void ServantHelperManager::setAdapterServant(const string &sAdapter, const string &sServant) { _adapter_servantsAdapter = sServant; _servant_adaptersServant = sAdapter; }

在实现Bindadapter的ID到服务的ID时用到了中间的类ServantHelperManager来进行映射,执行ServantHelperManager:: addServant<T>():服务的ID映射到相应的方法中时也用到了ServantHelperManager。其中的T是StringServantImp后面的过程就是c++映射的过程。_servant_creator是map<string, ServantHelperCreationPtr>这是其中的映射关系,ServantHelperCreationPtr是访问rpc方法的一个指针也叫做类生成器。

cpp 复制代码
/**
 * Servant
 */
class ServantHelperCreation : public TC_HandleBase
{
public:
    virtual ServantPtr create(const string &s) = 0;
};
typedef TC_AutoPtr<ServantHelperCreation> ServantHelperCreationPtr;
 
//
/**
 * Servant
 */
template<class T>
struct ServantCreation : public ServantHelperCreation
{
    ServantPtr create(const string &s) { T *p = new T; p->setName(s); return p; }
};

2.创建业务线程组,将线程组和BindAdapter,TC_EpollServer关联起来。

相关推荐
亚历克斯神3 小时前
智能搜索系统的升级复盘——从 Elasticsearch 到混合检索的检索质量提升
java·spring·微服务
万里侯3 小时前
GitOps 2026年演进趋势:从配置管理到环境即代码的范式转移及Pull vs Push模型的再思考
微服务·容器·k8s
易番番ERP4 小时前
以销定采模式下,ERP如何帮助贸易企业管住订单真实利润
大数据·低代码·微服务·云原生·成本核算·易番番erp·以销定采
夏天拐跑了西瓜5 小时前
Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战
java·spring cloud·微服务
成为你的宁宁6 小时前
【APISIX:部署、路由与 Nacos 集成】
微服务·nacos·apisix·api网关
Mr. zhihao12 小时前
从零手写一个 RPC 框架:用一条因果链推导出 Dubbo 的骨架
网络协议·rpc·dubbo
易番番ERP1 天前
品牌代理商SKU繁多,ERP如何高效处理新旧规格替换?
数据库·微服务·云原生·sku·易番番erp
星期一研究室3 天前
AI 生成一堆素材后,怎么整理成好找又好用的视觉资产库?
微服务·产品·设计
二十雨辰3 天前
[Java]-微服务面试题
java·开发语言·微服务
vHelios3 天前
【电商项目】商品搜索开发复盘(1):根据需求拆解搜索接口的设计逻辑
java·微服务·es