网站首页 > 文章精选 正文
前言
Tars是腾讯开源的微服务平台,包含了一个高性能的rpc框架和服务治理平台,TarsCpp是其C++版本。对于以C++为主要开发语言,同时还想深入了解rpc和微服务框架具体实现的同学来说,Tars是一个极佳的选择。
想像一下,如果你自己来设计一个rpc-client,都应该考虑哪些因素?
- 一个高效、可靠的调度器(epoll模型)
- 如何设计同步调用、异步调用
- 使用适当的协议来发送请求、解析结果
- 提供不同的选择服务节点的策略,包括但不限于轮询、hash、权重等
- 管理服务节点状态,包括不限于节点是否已经连接,是否正在连接中,连接是否超时,是否需要重连,连接超时时间设置,连接重连时间设置等
- 如何可靠的接收请求、发送结果,请求量怎么控制,接收到1.5个请求怎么办,请求发送完迟迟没收到结果怎么办
这些问题都可以从tars-rpc-client中寻找到实现答案
1 rpc-client概要设计
学习源码的一个重要目的是学习“别人家”模块或项目的设计思路,设计思路的珍贵之处在于其超脱了项目甚至语言的层次,可以迁移到其他地方。
tar-rpc-client主要由4个组件构成:ServantProxy,ObjectProxy,CommunicatorEpoll,AsyncProcThread,其中:
- ServantProxy:直接与使用者交互,提供简便易用接口
- ObjectProxy:封装网络层收发细节
- CommunicatorEpoll:提供收发调度功能
- AsyncProcThread:提供异步调用功能
四个组件的关系见图1。
2 CommunicatorEpoll概要设计
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中箭头里的序号
- 当用户调用ServantProxy::Hello方法时候,ServantProxy将这个方法包含的内容组成一个msg
- 通过ObjectProxy将msg注册到CommunicatorEpoll中。
- epoll_wait获取了通知,处理msg
- 链接server端,成功后获取connent fd
- 将connect fd注册到CommunicatorEpoll中
- 发送请求
- 接收结果
2.1 同步call
rpc_client一般有两种基本的调用方式,sync_call和async_call,即同步call和异步call。先看下同步call的实现机制。
同步call实现机理较简单,只需要主线程、调度线程配合就能实现。见图3.
2.2 异步call
异步call需要主线程、调度线程、回调线程三个组件,见图4
未完-待续
- 上一篇: 什么是RPC?什么是Restful?它们有什么区别?
- 下一篇: 项目经验分享
猜你喜欢
- 2025-08-01 go-zero 实践 - 编写仓储、订单RPC\API服务(五)
- 2025-08-01 PS3安卓模拟器“换马甲”重生:RPCSX-UI-Android上线
- 2025-08-01 大数据技术大合集:Hadoop、Cloudera...
- 2025-08-01 项目经验分享
- 2025-08-01 什么是RPC?什么是Restful?它们有什么区别?
- 2025-08-01 日产2000片!南方路机助力中山东环RPC项目实现“超级智造”投产
- 2025-08-01 教你用 Netty 实现一个简单的 RPC
- 2025-08-01 6种微服务RPC框架,你知道几个?
- 2025-08-01 java 服务之间调用(rpc)
- 2025-08-01 设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)
- fmt.println (52)