怎么理解RPC远程过程调用?
tencentUser 2024-07-18

一.什么是RPC?

RPC(remote process call),中文是远程过程调用的意思。怎么理解这个远程过程调用呢?可以这样理解,可以与本地的过程调用对比下,本地过程调用,也就是调用函数或者是调用方法,比如说,在单体架构中,我们要根据用户的id获取订单信息,我们就需要找到订单service,调用getOrderInfoById(String id)这个方法,这个调用动作这就是本地过程调用,就是调函数,调方法,让某个函数或方法为你服务。但是随着业务的增长以及用户量数据量的增加,这个单体架构就扛不住了,我们就需要对系统进行拆分,把订单模块当作一个服务拆分出去(就是再搞一个项目专门维护用户这块的业务),这时候我们就再获取用的订单信息就不是这么容易了,现在是跨项目了,跨网络了,不能跟以前那样愉快的调用了,但是不要慌,这时候RPC 这个远程过程调用就起到大作用了,它可以做到像调用本地方法或者函数一样调用远程的服务,程序员无需关注它内部是怎么实现的,只需要关注业务就可以了。

二.应用场景

在解释RPC是啥的时候咱们也说了,RPC是随着项目细粒度划分出现的,所以它主要是用在解决SOA架构或者微服务架构各个服务之间数据交互或者通信,还拿上面的例子来说,当我把用户模块,与订单模块分成不同的服务的时候,我该用什么通信这两个服务,现在市面上有三种,一种是webservice,第二是restful,第三就是今天的主角RPC了。这个webservice一些老项目中还在用着,属于老古董了,restful风格现在用的挺多的。比如说在java生态中微服务架构的各个服务之间的调用spring官方提供的是基于http协议的restfull风格的工具fegin,再一个就是RPC了,也是现在的主流。其实我们可以发现,RPC主要就是用在垂直架构下各个服务通信的,然后你的单体架构根本用不到,业务全部代码全部堆在一个项目中,想调用谁就调用谁,根本用不到这东西。

三.Restful与RPC

垂直架构下到底是选择RPC还是Restful?

我只想说,各有优缺点。。。。

1.速度

RPC:基于tcp协议,速度是非常快的。互联网项目中应用比较多

Restful:基于http协议,是在tcp的基础上又封装了一层。速度较RPC要慢,在传统项目中使用的比较多

2.跨语言

RPC:要实现跨语言,就要序列化方式相同,而且需要开发不同的客户端与服务端,不是说不能做到,只是成本还是比较高的

Restful:restful是一种风格,跨语言很方便

3.成熟度

RPC:RPC落地框架是非常多的,也是非常成熟的,比如说ali的dubbo,grpc等等

Restful:是个restful风格的接口就可以啦

四.RPC原理

先说一下官方的话术:

一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Client Stub,Server以及Server Stub,这个Stub可以理解为存根。

客户端(Client),服务的调用方。

客户端存根(Client Stub),存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。

服务端(Server),真正的服务提供者。

服务端存根(Server Stub),接收客户端发送过来的消息,将消息解包,并调用本地的方法。

借用网络上的一张图,它这边还更加细化了(这个图片上加上了网络传输)。

深度解析xxl-rpc之RPC原理
深度解析xxl-rpc之RPC原理

用java来实现上面的RPC: 客户端:java中的客户端就是你的方法调用方,你在哪个服务调用的那个服务就是客户端 ,比如说我在用户服务调用订单服务查询用户的订单(当然这里你得有订单服务的api接口),我可以这样写 OrderService.getOrderListByUid(String id);这样毛病吧。

客户端存根:我们在客户端层面使用的真的是OrderService 吗?no,它只是个公共的接口,而它的实际对象是啥呢,在java中我们可以使用动态代理技术(Proxy,字节码技术也行),来生成代理对象,我们实际的对象就是这个。那我们这个代理对象都干了些啥,一是,获取请求方法名字,参数等信息,封装起来。二是,找到真正提供这个服务的ip与端口,三是,拿着封装的信息,序列化一下,发送网络请求到提供服务的服务器上去

服务器存根:项目服务器一启动,就启动这个RPC服务,监听协定好的端口, 这时候收到了一个请求,就是客户端存根发过来那个,这边需要干什么事情呢,一是反序列化成能看懂的信息 ,二是,使用java 反射技术,对某个类的某个方法进行反射执行。三 是封装执行结果进行返回去。

服务器:这边就很简单了,只需要提供具体的服务提供实现类就行了,供服务器存根使用反射调用,并返回执行结果。

五.为啥要选择xxl-rpc?

我只能说两个字 简单 ,非常简单

适合RPC的初学者,你上来搞搞dubbo源码试试,根本啃不动,dubbo加上单元测试啥的小10w行代码,这你怎么搞,里面弯弯绕绕的,直接搞晕了,不适合初学者。

但是xxl-rpc与dubbo的代码量比起来就是大巫见小巫了,框架虽小,但是五脏俱全,这种代码量的框架看起来会更舒服一些,能够瞬间搞懂RPC的实际落地,让你瞬间柳暗花明又一村。

在xxl-rpc 中你能学到什么?

1.服务调用者是怎么实现的

2.服务提供者是怎么提供服务的

3.不同的调用方式

4.不同的序列化方式

5.不同的底层通信方案

6.zk作为注册中心是怎样服务注册与发现的

7.模块化开发

8.优秀的代码设计

…. 

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【7.24 深圳】2025国际AI+IoT生态发展大会/2025全球 MCU及嵌入式技术论坛


  • 相关技术文库
  • C语言
  • 编程
  • 软件开发
  • 程序
  • 光立方程序编写步骤

    基于51单片机的4*4*4光立方程序实现原理及程序代码。LED光立方的复位电路、时钟电路、每层LED灯电路控制逻辑,系统总原理图,工作流程及相关C语言源码实现。希望能够对你学习了解LED光立方程序编写及LED立方实体制...

    昨天
  • 封装继承多态

    封装: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。 封装的意义: 封装的意义在于保护或者防止代码(数据)被我们无意中...

    昨天
  • 封装是什么意思?

    即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中...

    昨天
  • 超声波模块测距51程序_单片机超声波测距c语言

    超声波检测原理 超声波测距的程序流程图 程序如下: //超声波模块程序 //超声波模块程序 //Trig = P2^0 //Echo = P3^2 #include #define uchar unsigned char #define uint unsigned int // void delay(uint z) {...

    07-01
  • 大佬带你看嵌入式系统,嵌入式系统该学习什么?

    嵌入式系统是当今的热门系统之一,在诸多领域,嵌入式系统都有所应用。为增进大家对嵌入式系统的认识,小编将为大家介绍嵌入式系统是一个什么样的专业,以及学习嵌入式系统该学习哪些内容。如果你对嵌入式系统具有...

    06-27
  • c51单片机编程要点总结

    c51单片机编程要点总结 1、头文件:#include (我用的是 STC 89C54RD+) 2、预定义:sbit LED = P1^0// 定义 P1 口的 0 位为 LED 注:“P1^0”这个写法,与 A51 不同(A51 是 P1.0),P1 是一组端口,端口号范围 0~7 注2...

    06-25
  • C语言基础知识点汇总

    总结C语言基础知识点

    06-23
  • Keil使用中的若干问题

      一、混合编程  1、模块内接口:  使用如下标志符:  #pragma asm  汇编语句  #pragma endasm  注意:如果在c51程序中使用了汇编语言,注意在keil编译器中需要激活Properties中的“Generate Assembler...

    06-23
  • ESP32-finsh

    esp32c2添加finsh实现了ping指令和AT指令解析

    06-13
  • 一文讲通C语言位域,快速掌握!

    在嵌入式系统的开发中,内存是最程序员非常需要关注的对象,尤其是MCU开发、网络协议解析、硬件寄存器操作等领域,能否对内存进行高效的利用和合理的管理,将直接影响程序的性能和硬件的稳定性。

    06-10
下载排行榜
更多
评测报告
更多
广告