基于TCP和HTTP协议的RPC简单实现

Posted Java后端技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于TCP和HTTP协议的RPC简单实现相关的知识,希望对你有一定的参考价值。

一、RPC基本概念

1、基本概念

(1)RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议;

(2)RPC协议假定某些传输协议的存在,如TCP或HTTP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层;

(3)RPC使得开发包括网络分布式多程序在内的应用程序更加容易;

(4)RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行;

(5)随着系统业务的不断发展增长,对服务的压力逐渐增大,一方面可以通过硬件的方式提高系统的性能;另一方面,可以通过软件的方式来实现系统整体的性能。主流的解决方案,就是讲一个比较大的系统不断进行拆分,拆分为独立的服务系统,不同服务系统之间通过HTTP请求进行通信,或者其他协议进行通信。RPC就是不同系统之间相互通信交换数据服务的有利工具;

2、优势长处

(1)RPC解决了单台服务器处理能力受硬件成本的限制问题,RPC将原本本地调用转变为调用远端服务器上的方法,极大程度上提高了系统的处理能力和吞吐量;

(2)RPC使得不同系统隔离开来,对于不同模块的开发人员不用关心具体方法的实现,只关心该方法能提供的数据和解决的问题,使得开发效率和系统维护变得简单;

(3)PRC作为分布式应用不得不了解和掌握的一块重要的内容。

3、远程过程调用流程图

上图是一张比较完整的远程控制调用流程图,客户进程作为服务的消费者,服务器进程作为服务的生产者,如下图所示:(当然客户端也可以作为服务生产者存在,这里只是简单说明问题)。

基于TCP和HTTP协议的RPC简单实现

服务调用方发送RPC请求到服务的提供方,服务的提供方根据调用服务的参数和执行的方法进行返回结果,服务的调用方和服务的提供方之间传输的数据需要进行序列化和反序列化操作。

4、对象序列化和反序列化

(1)序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

(2)之所以要进行序列化,是因为在网络上进行传输的话,无论任何类型的数据,最终都需要转化为二进制流在网络上传输。

(3)数据的发送方需要将传输的对象转化为二进制流才能在网络上进行传输,这也就是序列化的过程;数据的接收方则需要将接受到的二进制流在恢复为对象,这个过程就是对象的反序列化的过程。

(4)序列化和反序列化总结:

基于TCP和HTTP协议的RPC简单实现

(5)序列化和反序列化的方式有很多,常见的有使用Java本身内置的序列化方式、Hession、JSON、XML等。Java内置的可以直接使用Java提供的类不需要引用其他jar包,但是效率不是很高,下边是一张各种序列化空间和性能对比:

解析性能:

基于TCP和HTTP协议的RPC简单实现

序列化之空间开销:

基于TCP和HTTP协议的RPC简单实现

(6)基于Java内置的序列化和反序列化关键代码实现:

基于TCP和HTTP协议的RPC简单实现

其他序列化和反序列化的方式也大致如此,基本思路是一样的。

二、基于TCP的RPC实现

1、基本思路

首先,远程控制调用RPC的本质还是底层的Scoket通信。对于简单的设计实现来说,其基本思路是:

1、服务的调用方Consumer通过Socket建立起与服务的提供方Provider的连接;2、Consumer将需要调用的方法名称和参数通过Socket发送给Provider;3、Provider获取Consumer请求的数据并进行解析,执行具体的某一个方法,构造返回数据,返回给Consumer;4、Consumer获得Provider返回的数据进行相应的处理;12341234

2、具体项目代码

基于TCP和HTTP协议的RPC简单实现

具体代码如下:

(1)ConsumerDemo 代码:

基于TCP和HTTP协议的RPC简单实现

(2)ProviderDemo 代码如下:

基于TCP和HTTP协议的RPC简单实现

(3)ProviderDemoImpl代码如下:

基于TCP和HTTP协议的RPC简单实现

(4)ProviderServer代码如下:

基于TCP和HTTP协议的RPC简单实现

(5)先开发服务器ProviderServer,然后执行ConsumerDemo,执行结果如下:

基于TCP和HTTP协议的RPC简单实现

客户端执行一次请求,返回正确的结果。

基于TCP和HTTP协议的RPC简单实现

上述显示了两条信息,这是因为服务器是while循环接受客户端请求的,共执行了两次。

上述过程完成了一个简单的RPC远程控制调用的案例,实际使用框架的时候,比这考虑的要多很多,这只是简单介绍一下思路。关于基于HTTP协议的RPC的简单实现其思想和TCP的一样,这里不再做过多说明。

博主使用最多的框架是Dubbo,服务的生产者将服务注册到注册中心,消费者向注册中心查找服务并获取服务生产者的信息,调用服务,详细请移步查看:http://blog.csdn.net/xlgen157387/article/details/51865289


版权声明


Java后端技术所推送文章,为本人原创、网上收集或其他作者投稿,对于网上收集部分除非确实无法确认,我们都会注明作者和来源。部分文章推送时未能与原作者取得联系。若涉及版权问题,烦请原作者联系我们,我们会在24小时内删除处理,谢谢!^_^   QQ:1573876303


基于TCP和HTTP协议的RPC简单实现
微信公众号,长按关注或微信搜索公众号:Java后端技术。



以上是关于基于TCP和HTTP协议的RPC简单实现的主要内容,如果未能解决你的问题,请参考以下文章

RPC和http协议的区别

RPC接口与REST对比

(整理4)RPC服务和HTTP服务简单说明

rpc和http的比较

RPC

“RPC好,还是RESTful好?”,这个问题不简单