RPC框架的实现原理,及RPC架构组件详解

RPC的由来

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

  • 单一应用架构
  • 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
  • 此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
  • 垂直应用架构
  • 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
  • 此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
  • 分布式服务架构
  • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
  • 此时,用于提高业务复用及整合的 分布式服务框架(RPC),提供统一的服务是关键。

例如:各个团队的服务提供方就不要各自实现一套序列化、反序列化、网络框架、连接池、收发线程、超时处理、状态机等“业务之外”的重复技术劳动,造成整体的低效。

所以,统一RPC框架来解决提供统一的服务。

以下我将分别从如下四个方面详解RPC。

RPC框架的实现原理,及RPC架构组件详解

RPC的实现原理

RPC框架的实现原理,及RPC架构组件详解

也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

比如说,A服务器想调用B服务器上的一个方法:

Employee getEmployeeByName(String fullName)

整个调用过程,主要经历如下几个步骤:

1、建立通信

首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接。

主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

2、服务寻址

要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么。

通常情况下我们需要提供B机器(主机名或IP地址)以及特定的端口,然后指定调用的方法或者函数的名称以及入参出参等信息,这样才能完成服务的一个调用。

可靠的寻址方式(主要是提供服务的发现)是RPC的实现基石,比如可以采用redis或者zookeeper来注册服务等等。

RPC框架的实现原理,及RPC架构组件详解
  1. 从服务提供者的角度看:当提供者服务启动时,需要自动向注册中心注册服务;
  2. 当提供者服务停止时,需要向注册中心注销服务;
  3. 提供者需要定时向注册中心发送心跳,一段时间未收到来自提供者的心跳后,认为提供者已经停止服务,从注册中心上摘取掉对应的服务。
  4. 从调用者的角度看:调用者启动时订阅注册中心的消息并从注册中心获取提供者的地址;
  5. 当有提供者上线或者下线时,注册中心会告知到调用者;
  6. 调用者下线时,取消订阅。

3、网络传输

3.1、序列化

当A机器上的应用发起一个RPC调用时,调用方法和其入参等信息需要通过底层的网络协议如TCP传输到B机器,由于网络协议是基于二进制的,所有我们传输的参数数据都需要先进行序列化(Serialize)或者编组(marshal)成二进制的形式才能在网络中进行传输。然后通过寻址操作和网络传输将序列化或者编组之后的二进制数据发送给B机器。

3.2、反序列化

当B机器接收到A机器的应用发来的请求之后,又需要对接收到的参数等信息进行反序列化操作(序列化的逆操作),即将二进制信息恢复为内存中的表达方式,然后再找到对应的方法(寻址的一部分)进行本地调用(一般是通过生成代理Proxy去调用,
通常会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),之后得到调用的返回值。

4、服务调用

B机器进行本地调用(通过代理Proxy)之后得到了返回值,此时还需要再把返回值发送回A机器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值之后,则再次进行反序列化操作,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理(一般是业务逻辑处理操作)。

通常,经过以上四个步骤之后,一次完整的RPC调用算是完成了。

PRC架构组件

一个基本的RPC架构里面应该至少包含以下4个组件:

1、客户端(Client):服务调用方(服务消费者)

2、客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端

3、服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理

4、服务端(Server):服务的真正提供者

RPC调用过程

RPC框架的实现原理,及RPC架构组件详解

1、服务消费者(client客户端)通过本地调用的方式调用服务

2、客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体

3、客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端

4、服务端存根(server stub)收到消息后进行解码(反序列化操作)

5、服务端存根(server stub)根据解码结果调用本地的服务进行相关处理

6、本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub)

7、服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方

8、客户端存根(client stub)接收到消息,并进行解码(反序列化)

9、服务消费方得到最终结果

有哪些主流的RPC框架

具体可以参考阿里P8架构师谈:主流RPC框架详解,以及与SOA、SOAP、REST的区别


money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文浅尝 | 时序与因果关系联合推理

论文笔记整理:李昊轩,南京大学硕士,研究方向为知识图谱、自然语言处理。来源:ACL2018链接:https://www.aclweb.org/anthology/P18-1212动机理解事件之间的时间和因果关系是一项基本的自然语言理解任务。由于原因一定先…

LeetCode 64. 最小路径和(DP)

文章目录1. 题目信息2. 解题1. 题目信息 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例:输入: [[1,3,1],[1,5,1],[4,2,1] ] 输出: 7 解释…

加快读博失败的10种方法

文 | 德先生源 | 知乎博士难毕,全球皆如此。差不多每个学校都有1/3到一半的博士研究生拿不到学位。读博失败不仅本人难受,导师也不好过。为了帮助自己的博士生们顺利毕业,犹他大学的Matt Might教授(计算机科学家,生物学…

要成为一个 Java 架构师得学习哪些知识以及方法?

“ 最近在架构师线下实战中,被问到最多的一个问题,就是要成为一个 Java 架构师得学习哪些知识,以及怎样才能做到架构师这个级别? 今天主要澄清几个关于架构师的几大误区。 架构师并不是人人都能做到的,如果你能走到…

论文浅尝 | 一种可解释的语义匹配复值网络

笔记整理:耿玉霞,浙江大学直博生。研究方向:知识图谱,零样本学习,自然语言处理等。论文链接:https://arxiv.org/pdf/1904.05298.pdf本文是发表在 NAACL 2019 上的最佳可解释性论文。受量子力学中数学模型的…

指针都没搞懂,还能算得上 C++ 老司机?

在工业界,有这样一个规律:“ 但凡能用其他语言的都不会用C,只能用C的必然用C。”但是,C的学习和项目开发都比较困难。一个有经验的老手也经常搞出野指针,内存泄露等bug,包括我自己在学C的时候也非常痛苦。所…

DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用+距离运算

在NLP领域,语义相似度的计算一直是个难题:搜索场景下query和Doc的语义相似度、feeds场景下Doc和Doc的语义相似度、机器翻译场景下A句子和B句子的语义相似度等等。本文通过介绍DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用&#xff…

如何才能真正的提高自己,真正成为一名出色的架构师?

“ 有读者朋友给我留言,如何才能真正的提高自己,成为一名架构师,有学习各种语言的小伙伴。 这里我结合我的学习方法论,再结合我自己的经验,分享部分心得,希望对你有所帮助。 欢迎小伙伴留言给到你现在遇…

论文浅尝 | 从知识图谱流中学习时序规则

论文笔记整理:汪寒,浙江大学硕士,研究方向为知识图谱、自然语言处理。链接:http://ceur-ws.org/Vol-2350/paper15.pdf动机知识图谱是现在十分流行的数据管理方式,在最近几年应用广泛。但目前的基于KG的规则挖掘主要都是…

如何选择数据结构和算法(转)

文章目录1. 时间、空间复杂度 ! 性能2. 抛开数据规模谈数据结构和算法都是“耍流氓”3. 结合数据特征和访问方式来选择数据结构4. 区别对待IO密集、内存密集和计算密集5. 善用语言提供的类,避免重复造轮子6. 千万不要漫无目的地过度优化熟知每种数据结构和算法的功能…

Linux服务器安装cuda,cudnn,显卡驱动和pytorch超详细流程

原文链接:https://blog.csdn.net/kingfoulin/article/details/98872965 基本的环境 首先了解自己服务器的操作系统内核版本等信息: 查看自己操作系统的版本信息:cat /etc/issue或者是 cat /etc/lsb-release等命令 查看服务器显卡信息&…

自训练:超越预训练,展现强大互补特性的上分新范式!

文 | 香侬科技编 | 兔子酱背景预训练(Pre-training)模型自BERT问世以来就一发不可收拾,目前已经在自然语言理解和生成两个方面取得了突破性成就。但是,作为它的一个“兄弟”,自训练(Self-training&#xff…

论文浅尝 | 通过文本到文本神经问题生成的机器理解

论文笔记整理:程茜雅,东南大学硕士,研究方向:自然语言处理,知识图谱。Citation: Yuan X, WangT, Gulcehre C, et al. Machine comprehension by text-to-text neural question generation[J]. arXiv preprint arXiv:17…

安装paddlepaddle-GPU 报libcudnn.so和libcublas.so找不到的解决方案

第一步,查找两个的文件位置 第二步: 由于cudcun实在cuda10.0的基础上安装的,解压cudcnn的tar包之后会出现一个cuda-10.0文件夹,而不是cuda. 第三步: 在一步出现的位置找到了和libcublas.so.10对其进行了重命名就好了…

LeetCode 221. 最大正方形(DP)

文章目录1. 题目信息2. 解题1. 题目信息 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。 示例: 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximal-squ…

anaconda配置虚拟环境

一般是在服务器上,创建一个自己的虚拟环境,自己来用,不影响别人的环境,也不用被别人安装环境影响。 打开终端 1.查看当前存在哪些虚拟环境 conda env list 或 conda info -e 2.创建名字为 lly_env 的虚拟环境(名字自己取一个&am…

论文浅尝 | 知识图谱推理中表示学习和规则挖掘的迭代学习方法

作者:张文,浙江大学在读博士,研究方向为知识图谱的表示学习,推理和可解释。本文是我们与苏黎世大学以及阿里巴巴合作的工作,发表于WWW2019,这篇工作将知识图谱推理的两种典型方法,即表示学习和规…

21个深度学习调参的实用技巧

文 | AI_study源 | AI算法与图像处理导读在学习人工智能的时候,不管是机器学习还是深度学习都需要经历一个调参的过程,参数的好坏直接影响着模型效果的好坏。本文总结了在深度学习中21个实用的调参的技巧,快来学习吧!这篇文章在国…

从Java程序员进阶为架构师,全套16张图概括最全技能!建议收藏!

如何从程序员进阶到架构师?今天完整的把我积累的经验和技能分享给大家! 作者:陈睿|优知学院创始人 数据结构算法程序 数据是一切能输入到计算机的信息总和,结构是指数据之间的关系,数据结构就是将数据及其之间的关系有…

Python 爬虫系列教程一爬取批量百度图片

原文地址:https://blog.csdn.net/qq_40774175/article/details/81273198 很久之前就学习了Python的爬虫了,也用来做过一些项目(主要是一些课程项目),但时间比较紧,一直没有空把它写下来,这个暑假…