RPC基本知识
1. 什么是RPC
RPC(Remote Procedure Call) : 远程调用。通常用于解决跨服务间的通信和协作问题。
2.为什么需要RPC
假设现在我们有一个业务逻辑是,当用户下单并生成订单后,对应的商品库存就要减少。这个逻辑涉及到订单服务和库存服务。订单服务会调用库存服务,通知他,商品的库存应该减一了。
这时候会有两种情况:
使用单体架构实现时
直接在订单的service服务层 调用库存的mapper,然后减少库存
使用分布式架构实现时
订单服务和库存服务,并不是放在同一台机器(或者同一台服务器,或者同一台机器不同的端口)上面跑的,他们代码就不是放在同一个地方的,所以他们不能直接调用对方。
那这种情况下,我们该怎么做呢?
既然我们不能直接调用库存服务的相关代码来实现,那么我们是不是可以在网络层面直接像前端一样,直接发送一个请求到库存服务,从而实现调用远程服务器的库存服务呢。答案是可以的,我们就是要基于RPC来实现远程调用,在订单服务中,利用RPC远程调用库存服务的接口,传递 库存服务所需要的参数,库存服务接受到请求后,就会执行库存更新操作。是不是很酷?
RPC 的出现就是为了让你调用远程方法像调用本地方法一样简单。
3.RPC的原理
客户端本地中执行调用服务端的代码
客户端Stub(桩)就会生成一个代理对象,代理对象中包含客户端所想要调用的服务端的方法信息(比如方法名,参数,返回值类型等),但实际上并不会执行这些方法讲代理对象中的方法信息序列化后交给网络传输层
客户端网络连接层把序列化后的信息发送给服务端的网络连接层
服务端网络连接层中接受到客户端发送的序列化信息后,讲信息反序列化成Java对象
服务端Stub(桩)根据反序列后的结果 调用服务端本地代码中的方法
服务端本地将方法返回返回值
服务端Stub(桩)将服务端的返回值进行序列化,发送到网络连接层
服务端网络连接层将序列化后的消息发送给服务端的网络连接层
客户端Stub(桩) 接受网络层的消息
客户端Stub(桩) 将消息反序列化后 传递给客户端本地