如何实现RPC

如何实现RPC

网络与分布式计算第二次作业

一、RPC简介

现在互联网应用的量级越来越大,单台计算机的能力有限,需要借助可扩展的计算机集群来完成,分布式的应用可以借助RPC来完成机器之间的调用。

我们需要一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力。这种方式其实就是RPC(Remote Procedure Call Protocol)。

RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。它允许像调用本地服务一样调用远程服务。它可以有不同的实现方式。如RMI(远程方法调用)、Hessian、Http invoker等。

  • RPC示意图如下:

这里写图片描述
如上图所示,假设Computer1在调用sayHi()方法,对于Computer1而言调用sayHi()方法就像调用本地方法一样。但从后续调用可以看出Computer1调用的是Computer2中的sayHi()方法,RPC屏蔽了底层的实现细节,让调用者无需关注网络通信,数据传输等细节。

二、Java实现RPC框架

  • 实现技术方案

使用比较原始的方案实现RPC框架,采用Socket通信、动态代理与反射与Java原生的序列化。

  • RPC框架架构

RPC架构分为三部分:
1)服务提供者,运行在服务器端,提供服务接口定义与服务实现类。
2)服务中心,运行在服务器端,负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用。
3)服务消费者,运行在客户端,通过远程代理对象调用远程服务。

三、实现细节的讨论

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

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

3.2 怎么对消息进行编码和解码?

3.2.1 确定消息数据结构
通信的第一步就是要确定客户端和服务端相互通信的消息结构。客户端的请求消息结构一般需要包括以下内容:

接口名称、方法名、参数类型&参数值、超时时间、标识唯一请求idrequestID

3.2.2 序列化
一旦确定了消息的数据结构后,下一步就是要考虑序列化与反序列化了。

序列化就是将数据结构或对象转换成二进制串的过程,也就是编码的过程。序列化的目的是转换为二进制串后方便进行网络传输。

反序列化则是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。反序列化的目的是将二进制转换为对象才好进行后续处理。

四、总结

RPC本质为消息处理模型,RPC屏蔽了底层不同主机间的通信细节,让进程调用远程的服务就像是本地的服务一样。

这里所讨论的RPC框架还采用以下的办法进行提升和改进:
1)采用基于JSON数据传输的RPC框架;
2)使用NIO或直接使用Netty替代BIO实现;
3)使用开源的序列化机制,如Hadoop Avro与Google protobuf等;
4)服务注册可以使用Zookeeper进行管理,能够让应用更加稳定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值