RPC介绍与代码实现

RPC介绍与代码实现

RPC的英文资料网站:https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html


什么是RPC

RPC:

Remote Procedure Call Protocol——远程过程调用协议
是一种通过网络从远程计算机程序上请求服务的协议。
它可以使我们通过参数传递的方式就像调用本地的方法一样调用远程服务器上的函数或方法。


为什么要用RPC

RPC解决了不在同一个内存中的进程之间通信的问题。

在项目开发当中,大多时候程序都是分布在多个服务器节点组成的集群上当中。
比如服务器A的下订单应用程序想要调用服务器B上的支付宝付款应用程序的时候,由于不在同一个内存空间当中,自然无法调用。
通俗点地说,就像是你在你的电脑上写了一个程序A实现了某个功能,我在我的电脑上写了一个B程序实现了某个功能。正常情况下我是不能在我的程序中去调用你写的程序的。
如何才能做到呢?自然是通过网络。RPC就是提供了这样的实现。


RPC原理

这里写图片描述
(图片来源:https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html)
client functions : 客户函数。
client stub : 客户句柄。对于客户端来说,客户端想要调用远程服务时是直接找client stub去调用的。实际与远程服务打交道的是client stub。client stub作用就是接收客户端的请求参数(需要序列化),将请求参数发送到远程服务端(server stub)进行处理,得到处理后的结果(反序列化)再返回给客户端。
sockets : 客户端与远程端的通信就是通过底层的网络协议进行通信的(建立TCP连接)
server stub:服务器句柄,也叫做skeleton。skeleton的作用是接收客户端的请求参数,然后调用服务端实际处理程序(server functions)处理并获取结果。


RPC调用过程:

  1. client端想要调用某个远程服务的时候,以本地调用方式调用服务,需要调用client stub,传送参数到client stub;
  2. client stub 接收参数方法信息并且将其组装成能够进行网络传输的消息体(需序列化);
  3. 通过建立TCP的连接,client stub找到服务地址,将消息发送到服务端;
  4. server stub 收到网络消息并取得客户端的请求参数(反序列化);
  5. server stub 调用服务端的程序,将获取到的请求参数传送到真正的远程端的处理函数server functions进行处理;
  6. server functions 执行程序后将结果返回给server stub;
  7. server stub 将结果写入socket流中(序列化)发送至客户端;
  8. 结果信息传回本地主机;
  9. client stub 接收到结果消息(反序列化);
  10. client stub将结果消息传送到本地程序。

RPC要解决的问题

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

2. 寻址问题
A服务器上的应用应当告诉底层RPC框架如何连接到B服务器特定的端口和方法名称,这样才能完成调用。

3. 序列化和反序列化问题
远程过程调用传输的数据是通过网络协议进行传输的,所以这些数据需要进行序列化与反序列化处理。


RPC实现所需要考虑的几个问题

1. 怎么做到透明化远程服务调用?

怎么封装通信细节才能让用户像以本地调用方式调用远程服务呢?对java来说就是使用代理!java代理有两种方式:1) jdk 动态代理;2)字节码生成。
尽管字节码生成方式实现的代理更为强大和高效,但代码不易维护,大部分公司实现RPC框架时还是选择动态代理方式。

2. 确定消息数据结构

1)接口名称
2)方法名
3)参数类型&参数值
4)超时时间
5)requestID,标识唯一请求id

3. 序列化

什么是序列化?
序列化就是将数据结构或对象转换成二进制串的过程,也就是编码的过程。
什么是反序列化?
将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

为什么需要序列化?转换为二进制串后才好进行网络传输嘛!为什么需要反序列化?将二进制转换为对象才好进行后续处理!

4. 通信
Netty。


Java代码实现一个简单的RPC框架

服务端:
服务端是暴露服务。
在对Socket操作时,先读后写。

读:先从Socket连接中获取客户端的所要调用的远程服务的方法及请求参数等信息;
写:服务端的Server Stub调用服务端的真正的远程服务处理函数处理后获取结果,再将结果写回Socket。

核心代码:

/**
     * 暴露服务
     *
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值