目录一. RPC的定义二. 单体项目的本地调用三. 微服务项目的远程调用四. 什么是RPC五. RPC 通信流程一. RPC的定义RPC英文全称是 Remote Procedure Call,翻译过来就是“远程过程调用”对于Java语言来说我们可以简单理解成远程方法调用那么与之相对的就是“本地调用”。二. 单体项目的本地调用我们都知道我们再做一个单体项目的时候完成之后会把它部署在一套服务器上运行。当要完成某个业务功能的时候比如要买东西订单业务中会有支付功能我们要完成一个订单业务的时候肯定要调用支付这个功能(方法)由于是在同一台服务器上他们内部的很多方法可以直接互相调用不需要通过网络传输性能和效率非常非常的快这个就可以简单地理解为本地调用。三. 微服务项目的远程调用而当我们把一个项目进行拆分做成微服务项目在部署时常常会部署在多台服务器上它们会注册不同的域名它们之间会配合完成一个业务功能。业务A就有可能会调用业务B中的某个方法就如还是刚才说的买东西我们可以拆分成订单业务和支付业务但是现在它们很有可能部署在多台服务器上不像单体项目那样订单业务无法直接调用支付业务中的方法。所以我们最常使用的方式就是通过HTTP远程调用让订单业务向支付业务通过发送HTTP请求的方式调用其支付方法。我们知道网络远程调用会受到多种因素的影响例如网络波动丢包延迟造成性能下降。这个时候我们就在想能否简化一些在开发过程中让业务模块之间调用方法的时候不使用HTTP发送请求这种方式调用其他功能模块中的方法但最底层还是HTTP只是在代码层面没有体现出来让这个调用过程更快一点让微服务之间也可以使用本地调用这种思路从而提高整体性能随着这个想法的引入就有了我们的RPC。四. 什么是RPC通过刚才的引入我们大概应该明白了RPC是一种远程调用方法的方式它可以使用HTTP协议或直接基于TCP协议实现RPC在Java中我们可以通过直接使用某个服务接口的代理对象来执行此方法(通俗点来讲就是在调用方引入被调用方的函数库方便调用方的使用底层其实较为复杂就不展开说了)而底层则是通过成熟的TCP或者UDP进行传输。所以有一种说法是RPC协议是HTTP协议之上的一种协议也是可以理解的。五. RPC 通信流程如上图OrderService(订单业务)和PaymentService(支付业务)是微服务中的两个业务模块一个订单业务需要调用支付业务中的支付功能(方法)那么在微服务RPC中他们是如何完成通信的呢1. 我们的编译工具通常会把PaymentService业务模块中它所能提供的函数编译生成一个stup桩文件相当于一个静态函数库这个函数库就会被OrderService的Client端引入这样OrderService业务模块就实现了对PaymentService业务模块中函数的映射相当于在OrderService业务模块本地就有了这么一个静态函数库方便我们的OrderService后续的调用。2. 我们知道在网络底层所有的数据都是二进制数据所以有一步就是我们需要把请求体序列化成一个二进制的数据就是图中的第一步3. 然后经过第二步要约定好数据头元数据消息体等保证请求与相应一一映射对应图中的第二步然后我们根据一些成熟的网络库去进行TCP或UDP的传输在不同的公司也会有自定义的RPC协议。4. 第四步第五步和第六步点高档于是反过来的一个过程接收到消息之后。再根据协议把头数据消息体等得到再反序列化把二进制数据转化成语言可以识别的结构体。5. 第七步第八步第九步再反过来将查询到的结果数据或完成的动作序列化成二进制数据规范头数据数据体。6. 之后再通过网络传输给调用方对应第十步。7. 然后又是同样的操作取出消息头消息体再反序列化成语言可以识别的数据将数据返回对应图中的第111213步。当我们在面试过程中遇到时可以遵循下面这幅图来回答挑出重点来回答