基于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、远程过程调用流程图

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

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

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

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

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

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

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

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

解析性能:

序列化之空间开销:

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

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

二、基于TCP的RPC实现

1、基本思路

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

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

2、具体项目代码

具体代码如下:

(1)ConsumerDemo 代码:

(2)ProviderDemo 代码如下:

(3)ProviderDemoImpl代码如下:

(4)ProviderServer代码如下:

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

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

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

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

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

版权声明

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

原文发布于微信公众号 - Java后端技术(JavaITWork)

原文发表时间:2016-12-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

使用Java Rest Client操作Elasticsearch

86850
来自专栏沈唁志

ThinkPHP-PHP开发中的主流框架

89340
来自专栏编程

Linux探秘之用户态与内核态

Unix/Linux的体系架构 ? 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——...

57290
来自专栏me的随笔

Cookie中的几个概念

Domain表示Cookie所在的域(如:www.baidu.com),对于Cookie的访问是不能跨域的(如:我们无法在www.baidu.com下访问www...

37640
来自专栏Ryan Miao

查找git ignore的追踪

前言 版本控制说简单也简单,说复杂也困难的多。作为开发者,最基础的版本管理和团队协作的功能必须掌握。而其他一些相关的信息也可以了解下。比如,这次就有同事遇到了问...

35360
来自专栏皮振伟的专栏

[linux][statethread]协程库ST技术分析

前言: 在IO密集型的场景下,尤其是互联网后台,经常会使用epoll等IO复用技术。鉴于直接使用epoll的代码阅读性和开发效率等原因,就抽象出来了各种高级模型...

35080
来自专栏北京马哥教育

操作系统能否支持百万连接?

下面来分别对这几个问题进行分析. 1. 操作系统能否支持百万连接? 对于绝大部分 Linux 操作系统, 默认情况下确实不支持 C1000K! 因为操作系统包含...

37950
来自专栏1001482的专栏

大数据实时处理利器 storm 的 ui 解剖

众所周知,storm已经是业界主流的流时处理框架,Storm被广泛应用于实时分析,在线机器学习,持续计算、分布式远程调用等领域。

1.7K10
来自专栏编程软文

开发过程中快速抓包并解析

这几天小编在工作中遇到了一个灵异事件,客户端使用的是安卓原生系统,服务端使用的是java。需求就是客户端在照相的时候可以实时上传照片。后台接收并保存,并且可以在...

28630
来自专栏安恒网络空间安全讲武堂

Python编写渗透工具学习笔记一 | 0x01 目录扫描程序

0x01web目录扫描程序 脚本利用演示 直接输入python DirScan.py会打印出使用说明信息 ? 然后扫描一下 ? 可以看到扫描出了我的服务器的这些...

47970

扫码关注云+社区

领取腾讯云代金券