网站首页 > 博客文章 正文
在琢磨该篇文章之前,我想直接进行Tars C++内部实现进行说明。但是,终始一肚子内容想诉说,却无从说起。后来细想,是因为少了一个大纲,若无此大纲,则显得无条理,无条理则千头万绪,空有砍不断乱麻。
简单流程:
1、客户端根据协议编码规则,序列化报文。其中一般会包括报文头和报文体,一般报文头包括整个报文的长度和一些框架提供的公共头部字段信息,报文体一般包括应用业务编码的数据。
2、客户端发送数据。一般包括同步发送和异步发送,或者仅仅只管发送,不理会接收。不过无论是同步,还是异步发送,其底层实现为了性能,像C++应用必然使用多路复用等基础接口。再者有的实现为了性能,还会维护发送数据的队列,发送者只管发送到队列,网络事件监听者负责从队列取数据并发送。在多线程应用中,发送者一般是业务应用线程,而网络事件监听者一般是网络线程。涉及了多线程,就设计多线程的同步和互斥了,优秀的网络库,是尽量避免使用锁,不得已时大胆使用锁。所以为了避免尽量使用锁,而一个网络连接的网络读写关闭事件就尽量收敛在同一个网络线程。此外,作为客户端,何时连接,或者如何高效管理连接,这里又涉及到一些底层技巧了。
3、服务器端接收数据。同理,为了提供性能,有实现实现也会在服务器端维护一个接收数据队列,业务处理者负责从队列取数据,并反序列化和分发到对应的接口进行处理。接收数据者一般是网络线程,业务处理者一般是异步处理线程。
4、服务器端响应数据。存在同步响应和异步响应数据的实现,或者两者兼之。如果支持异步响应数据时,一般会维护一个异步响应数据队列,业务线程负责响应数据到数据队列,并通知网络线程取数据,并序列化和发送数据。
5、客户端接收响应的数据。反序列化数据并通知业务应用。如果客户端是同步调用,则需要唤醒阻塞的操作,如果是异步操作,则一般是回调对应的异步回调处理函数。
到此,一个完整的RPC网络流程算了完了。
不过,一个网络应用主要涉及到协议、编解码、多线程、队列、同步、异步、分发处理、性能、连接、网络事件。
有了以上结论后,就方便后续地展开了,不会乱麻一团了。
猜你喜欢
- 2024-10-30 SpringCloudRPC远程调用核心原理:代理模式与RPC客户端实现类
- 2024-10-30 基于HTTP RESTFul的远程调用和基于RPC的远程调用有什么区别?
- 2024-10-30 23 | RPC框架:10万QPS下如何实现毫秒级的服务调用?
- 2024-10-30 基于HTTPRESTFul的远程调用和基于RPC的远程调用有什么区别?
- 2024-10-30 远程方法调用RMI详解,和RPC的思路很相似
- 2024-10-30 一文读懂几种远程调用的区别与联系
- 2024-10-30 架构实战面试必备:如何实现RPC调用保护
- 2024-10-30 事务的使用:不要在事务中包含任何rpc调用
- 2024-10-30 SpringBoot+RabbitMQ 实现 RPC 调用
- 2024-10-30 Java进阶:远程过程调用(RPC)及回调方法(一)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)