在分布式服务框架中,一个最基础的问题就是远程服务是怎么通信的,在Java领域中有不少可实现远程通信的技术,例如:RMI、MINA、ESB、 Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间究竟是些什么关系呢,它们背后究竟是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而若是在性能上有高的要求的话,那深刻了解这些技术背后的机制就是必须的了,在这篇blog中咱们未来一探究竟,抛砖引玉,欢迎你们提供更多的实现远程通信的技术和原理的介绍。
基本原理
要实现网络机器间的通信,首先得来看看计算机系统网络通讯的基本原理,在底层层面去看,网络通讯须要作的就是将流从一台计算机传输到另一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,全部的分布式应用通信都基于这个原理而实现,只是为了应用的易用,各类语言一般都会提供一些更为贴近应用易用的应用层协议。
应用级协议
远程服务通信,须要达到的目标是在一台计算机发起请求,另一台机器在接收到请求后进行相应的处理并将结果返回给请求端,这其中又会有诸如one way request、同步请求、异步请求等等请求方式,按照网络通讯原理,须要实现这个须要作的就是将请求转换成流,经过传输协议传输至远端,远端计算机在接收到请求的流后进行处理,处理完毕后将结果转化为流,并经过传输协议返回给调用端。
原理是这样的,但为了应用的方便,业界推出了不少基于此原理之上的应用级的协议,使得你们能够不用去直接操做这么底层的东西,一般应用级的远程通讯协议会提供:
一、为了不直接作流操做这么麻烦,提供一种更加易用或贴合语言的标准传输格式;
二、网络通讯机制的实现,就是替你完成了将传输格式转化为流,经过某种传输协议传输至远端计算机,远端计算机在接收到流后转化为传输格式,并进行存储或以某种方式通知远端计算机。
因此在学习应用级的远程通讯协议时,咱们能够带着这几个问题进行学习:
一、传输的标准格式是什么?
二、怎么样将请求转化为传输的流?
三、怎么接收和处理流?
四、传输协议是?
不过应用级的远程通讯协议并不会在传输协议上作什么多大的改进,主要是在流操做方面,让应用层生成流和处理流的这个过程更加的贴合所使用的语言或标准,至于传输协议则一般都是可选的,在java领域中知名的有:RMI、XML-RPC、Binary-RPC、SOAP、CORBA、JMS,来具体的看看这些远程通讯的应用级协议:
--------------------------------------------------------------------------------------------------------------------------------------------------
RMI
RMI是个典型的为java定制的远程通讯协议,咱们都知道,在single vm中,咱们能够经过直接调用java object instance来实现通讯,那么在远程通讯时,若是也能按照这种方式固然是最好了,这种远程通讯的机制成为RPC(Remote Procedure Call),RMI正是朝着这个目标而诞生的。
来看下基于RMI的一次完整的远程通讯过程的原理:
一、客户端发起请求,请求转交至RMI客户端的stub类;
二、stub类将请求的接口、方法、参数等信息进行序列化;
三、基于socket将序列化后的流传输至服务器端;
四、服务器端接收到流后转发至相应的skelton类;
五、skelton类将请求的信息反序列化后调用实际的处理类;
六、处理类处理完毕后将结果返回给skelton类;
七、Skelton类将结果序列化,经过socket将流传送给客户端的stub;
八、stub在接收到流后反序列化,将反序列化后的Java Object返回给调用者。
来看jboss-remoting对于此过程的一个更好的图示:
根据原理来回答下以前学习应用级协议带着的几个问题:
一、传输的标准格式是什么?
是Java ObjectStream。
二、怎么样将请求转化为传输的流?
基于Java串行化机制将请求的java object信息转化为流。
三、怎么接收和处理流?
根据采用的协议启动相应的监听端口,当有流进入后基于Java串行化机制将流进行反序列化,并根据RMI协议获取到相应的处理对象信息,进行调用并处理,处理完毕后的结果一样基于java串行化机制进行返回。
四、传输协议是?
Socket。
--------------------------------------------------------------------------------------------------------------------------------------------------
XML-RPC
XML-RPC也是一种和RMI相似的远程调用的协议,它和RMI的不一样之处在于它以标准的xml格式来定义请求的信息(请求的对象、方法、参数等),这样的好处是什么呢,就是在跨语言通信的时候也可使用。
来看下XML-RPC协议的一次远程通讯过程:
一、客户端发起请求,按照XML-RPC协议将请求信息进行填充;
二、填充完毕后将xml转化为流,经过传输协议进行传输;
三、接收到在接收到流后转换为xml,按照XML-RPC协议获取请求的信息并进行处理;
四、处理完毕后将结果按照XML-RPC协议写入xml中并返回。
图示以上过程:
一样来回答问题:
一、传输的标准格式是?
标准格式的XML。
二、怎么样将请求转化为传输的流?
将XML转化为流。
三、怎么接收和处理流?
经过监听的端口获取到请求的流,转化为XML,并根据协议获取请求的信息,进行处理并将结果写入XML中返回。
四、传输协议是?
Http。
--------------------------------------------------------------------------------------------------------------------------------------------------
Binary-RPC
Binary-RPC看名字就知道和XML-RPC是差很少的了,不一样之处仅在于传输的标准格式由XML转为了二进制的格式。
一样来回答问题:
一、传输的标准格式是?
标准格式的二进制文件。
二、怎么样将请求转化为传输的流?
将二进制格式文件转化为流。
三、怎么接收和处理流?
经过监听的端口获取到请求的流,转化为二进制文件,根据协议获取请求的信息,进行处理并将结果写入XML中返回。
四、传输协议是?
Http。
--------------------------------------------------------------------------------------------------------------------------------------------------
SOAP
SOAP原意为Simple Object Access Protocol,是一个用于分布式环境的、轻量级的、基于XML进行信息交换的通讯协议,能够认为SOAP是XML RPC的高级版,二者的原理彻底相同,都是http+XML,不一样的仅在于二者定义的XML规范不一样,SOAP也是Webservice采用的服务调用协议标准,所以在此就很少加阐述了。
--------------------------------------------------------------------------------------------------------------------------------------------------
CORBA
Common Object Request Broker Architecture (公用对象请求代理[调度]程序体系结构),是一组用来定义“分布式对象系统”的标准,由OMG(Object Menagement Group)做为发起和标准制定单位。CORBA的目的是定义一套协议,符合这个协议的对象能够互相交互,不论它们是用什么样的语言写的,不论它们运行于什么样的机器和操做系统。
CORBA在我看来是个相似于SOA的体系架构,涵盖可选的远程通讯协议,但其自己不能列入通讯协议这里来说,并且CORBA基本淘汰,再加上对CORBA也不怎么懂,在此就不进行阐述了。
--------------------------------------------------------------------------------------------------------------------------------------------------
JMS
JMS呢,是实现java领域远程通讯的一种手段和方法,基于JMS实现远程通讯时和RPC是不一样的,虽然能够作到RPC的效果,但由于不是从协议级别定义的,所以咱们不认为JMS是个RPC协议,但它确实是个远程通讯协议,在其余的语言体系中也存在着相似JMS的东西,能够统一的将这类机制称为消息机制,而消息机制呢,一般是高并发、分布式领域推荐的一种通讯机制,这里的主要一个问题是容错(详细见ErLang论文)。
来看JMS中的一次远程通讯的过程:
一、客户端将请求转化为符合JMS规定的Message;
二、经过JMS API将Message放入JMS Queue或Topic中;
三、如为JMS Queue,则发送中相应的目标Queue中,如为Topic,则发送给订阅了此Topic的JMS Queue。
四、处理端则经过轮训JMS Queue,来获取消息,接收到消息后根据JMS协议来解析Message并处理。
回答问题:
一、传输的标准格式是?
JMS规定的Message。
二、怎么样将请求转化为传输的流?
将参数信息放入Message中便可。
三、怎么接收和处理流?
轮训JMS Queue来接收Message,接收到后进行处理,处理完毕后仍然是以Message的方式放入Queue中发送或Multicast。
四、传输协议是?
不限。
基于JMS也是经常使用的实现远程异步调用的方法之一。java