2024年Go最全RPC简介及原理介绍_gorpc 工作机制(3),意外的惊喜

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


在上述的Go语言代码中,我们定义了一个Add方法用于实现两个数相加的功能,在main方法中通过调用Add方法实现了计算两个变量之和的操作。整个过程涉及到变量值入栈,出栈,赋值等操作,最后将出栈的计算结果返回并赋值给c变量。


总结说来,本地程序调用的过程大致可以分为几个步骤和阶段:


* 开发者开发好的程序,并进行编译,编译成机器认可的可执行文件。
* 运行可执行文件,调用对应的功能方法,期间会读取可执行文件中国的机器指令,进行入栈,出栈赋值等操作。此时,计算机由可执行程序所在的进程控制。
* 调用结束,所有的内存数据出栈,程序执行结束。计算机继续由操作系统进行控制。


#### **问题及解决方法**


上文我们已经说过,远程过程调用是在两台或者多台不同的物理机器上实现的调用,其间要跨越网络进行调用。因此,我们再想通过前文本地方法调用的形式完成功能调用,就无法实现了,因为编译器无法通过编译的可执行文件来调用远程机器上的程序方法。因此需要采用RPC的方式来实现远端服务器上的程序方法的调用。


RPC技术内部原理是通过两种技术的组合来实现的:**本地方法调用 和 网络通信技术。**


#### **RPC简介**


在上述本地过程调用的例子中,我们是在一台计算机上执行了计算机上的程序,完成调用。随着计算机技术的发展和需求场景的变化,有时就需要从一台计算机上执行另外一台计算机上的程序的需求,因此后来又发展出来了RPC技术。特别是目前随着互联网技术的快速迭代和发展,用户和需求几乎都是以指数式的方式在高速增长,这个时候绝大多数情况下程序都是部署在多台机器上,就需要在调用其他物理机器上的程序的情况。


RPC是Remote Procedure Call Protocol三个单词首字母的缩写,简称为:RPC,翻译成中文叫远程过程调用协议。所谓远程过程调用,通俗的理解就是可以在本地程序中调用运行在另外一台服务器上的程序的功能方法。这种调用的过程跨越了物理服务器的限制,是在网络中完成的,在调用远端服务器上程序的过程中,本地程序等待返回调用结果,直到远端程序执行完毕,将结果进行返回到本地,最终完成一次完整的调用。


需要强调的是:**远程过程调用指的是调用远端服务器上的程序的方法整个过程。**


#### **RPC设计组成**


RPC技术在架构设计上有四部分组成,分别是:**客户端、客户端存根、服务端、服务端存根。**


这里提到了**客户端**和**服务端**的概念,其属于程序设计架构的一种方式,在现代的计算机软件程序架构设计上,大方向上分为两种方向,分别是:**B/S架构**、**C/S架构**。B/S架构指的是浏览器到服务器交互的架构方式,另外一种是在计算机上安装一个单独的应用,称之为客户端,与服务器交互的模式。


由于在服务的调用过程中,有一方是发起调用方,另一方是提供服务方。因此,我们把服务发起方称之为客户端,把服务提供方称之为服务端。以下是对RPC的四种角色的解释和说明:


* **客户端(Client):**服务调用发起方,也称为服务消费者。
* **客户端存根(Client Stub):**该程序运行在客户端所在的计算机机器上,主要用来存储要调用的服务器的地址,另外,该程序还负责将客户端请求远端服务器程序的数据信息打包成数据包,通过网络发送给服务端Stub程序;其次,还要接收服务端Stub程序发送的调用结果数据包,并解析返回给客户端。
* **服务端(Server):**远端的计算机机器上运行的程序,其中有客户端要调用的方法。
* **服务端存根(Server Stub):**接收客户Stub程序通过网络发送的请求消息数据包,并调用服务端中真正的程序功能方法,完成功能调用;其次,将服务端执行调用的结果进行数据处理打包发送给客户端Stub程序。


#### **RPC原理及调用步骤**


了解完了RPC技术的组成结构我们来看一下具体是如何实现客户端到服务端的调用的。实际上,如果我们想要在网络中的任意两台计算机上实现远程调用过程,要解决很多问题,比如:


* 两台物理机器在网络中要建立稳定可靠的通信连接。
* 两台服务器的通信协议的定义问题,即两台服务器上的程序如何识别对方的请求和返回结果。也就是说两台计算机必须都能够识别对方发来的信息,并且能够识别出其中的请求含义和返回含义,然后才能进行处理。这其实就是通信协议所要完成的工作。


让我们来看看RPC具体是如何解决这些问题的,RPC具体的调用步骤图如下:


![](https://img-blog.csdnimg.cn/5b98734ad7b54801b943a08690d44df3.png)


 在上述图中,通过1-10的步骤图解的形式,说明了RPC每一步的调用过程。具体描述为:


* 1、客户端想要发起一个远程过程调用,首先通过调用本地客户端Stub程序的方式调用想要使用的功能方法名;
* 2、客户端Stub程序接收到了客户端的功能调用请求,**将客户端请求调用的方法名,携带的参数等信息做序列化操作,并打包成数据包。**
* 3、客户端Stub查找到远程服务器程序的IP地址,调用Socket通信协议,通过网络发送给服务端。
* 4、服务端Stub程序接收到客户端发送的数据包信息,并**通过约定好的协议将数据进行反序列化,得到请求的方法名和请求参数等信息。**
* 5、服务端Stub程序准备相关数据,**调用本地Server对应的功能方法进行,并传入相应的参数,进行业务处理。**
* 6、服务端程序根据已有业务逻辑执行调用过程,待业务执行结束,将执行结果返回给服务端Stub程序。
* 7、服务端Stub程序**将程序调用结果按照约定的协议进行序列化,**并通过网络发送回客户端Stub程序。


![img](https://img-blog.csdnimg.cn/img_convert/559f5b65f968215152a609f3f94b03a5.png)
![img](https://img-blog.csdnimg.cn/img_convert/b6638405a32cf6bfce4295a7363cdc6f.png)
![img](https://img-blog.csdnimg.cn/img_convert/aab352286bbb68f8ebef62b4bb6fa854.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值