Tars是腾讯开源的微服务平台,包含了一个高性能的rpc框架和服务治理平台,TarsCpp是其C++版本。对于以C++为主要开发语言,同时还想深入了解rpc和微服务框架具体实现的同学来说,Tars是一个极佳的选择。
想像一下,如果你自己来设计一个rpc-client,都应该考虑哪些因素?
这些问题都可以从tars-rpc-client中寻找到实现答案
学习源码的一个重要目的是学习“别人家”模块或项目的设计思路,设计思路的珍贵之处在于其超脱了项目甚至语言的层次,可以迁移到其他地方。
tar-rpc-client主要由4个组件构成:ServantProxy,ObjectProxy,CommunicatorEpoll,AsyncProcThread,其中:
四个组件的关系见图1。
CommunicatorEpoll在rpc-client设计中处于核心地位,它确认了client信息流的调度方式。
CommunicatorEpoll是一个封装后的epoll模型,CommunicatorEpoll设计巧妙之处在于将客户调用函数的动作也作为了epoll的触发条件。下面以图2说明CommunicatorEpoll的设计架构
CommunicatorEpoll将epoll\_wait中得到的消息分为两类,一类是处理ObjectProxy消息,另外一类是处理EPOLLIN、EPOLLOUT、EPOLLERR消息。
最核心的系统调用函数也列在了图2上,包括紫色的epoll\_wait和epoll\_ctl、绿色的connect、send和readv。
图2中展示了一个最简单的函数调用流程,下面的序号对应了图2中箭头里的序号
rpc\_client一般有两种基本的调用方式,sync\_call和async\_call,即同步call和异步call。先看下同步call的实现机制。
同步call实现机理较简单,只需要主线程、调度线程配合就能实现。见图3.
异步call需要主线程、调度线程、回调线程三个组件,见图4
未完--待续
下一篇文章会继续ObjectProxy的设计思路
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。