文章插图
通过消息路由,我们可以配置路由规则指定消息传递的路径,以及指定具体的消费者消费对应的生产者 。例如指定路由的关键字,并由它来绑定具体的队列与指定的生产者(或消费者) 。路由的支持提供了消息传递与处理的灵活性,也有利于提高整个系统的消息处理能力 。同时,路由对象有效地封装了寻找与匹配消息路径的逻辑,就好似一个调停者(Meditator),负责协调消息、队列与路径寻址之间关系 。
3 应用级协议
远程服务通讯,需要达到的目标是在一台计算机发起请求,另外一台机器在接收到请求后进行相应的处理并将结果返回给请求端,这其中又会有诸如one way request、同步请求、异步请求等等请求方式,按照网络通信原理,需要实现这个需要做的就是将请求转换成流,通过传输协议传输至远端,远端计算机在接收到请求的流后进行处理,处理完毕后将结果转化为流,并通过传输协议返回给调用端 。
原理是这样的,但为了应用的方便,业界推出了很多基于此原理之上的应用级的协议,使得大家可以不用去直接操作这么底层的东西,通常应用级的远程通信协议会提供:
- 为了避免直接做流操作这么麻烦,提供一种更加易用或贴合语言的标准传输格式;
- 网络通信机制的实现,就是替你完成了将传输格式转化为流,通过某种传输协议传输至远端计算机,远端计算机在接收到流后转化为传输格式,并进行存储或以某种方式通知远端计算机 。
所以在学习应用级的远程通信协议时,我们可以带着这几个问题进行学习:
- 传输的标准格式是什么?
- 怎么样将请求转化为传输的流?
- 怎么接收和处理流?
- 传输协议是?
不过应用级的远程通信协议并不会在传输协议上做什么多大的改进,主要是在流操作方面,让应用层生成流和处理流的这个过程更加的贴合所使用的语言或标准,至于传输协议则通常都是可选的,在java领域中知名的有:RMI、XML-RPC、Binary-RPC、SOAP、CORBA、JMS、HTTP,来具体的看看这些远程通信的应用级协议 。
3.1 RMI(远程方法调用)
RMI是个典型的为java定制的远程通信协议,我们都知道,在single vm中,我们可以通过直接调用java object instance来实现通信,那么在远程通信时,如果也能按照这种方式当然是最好了,这种远程通信的机制成为RPC(Remote Procedure Call),RMI正是朝着这个目标而诞生的 。
RMI 采用stubs 和 skeletons 来进行远程对象(remote object)的通讯 。stub 充当远程对象的客户端代理,有着和远程对象相同的远程接口,远程对象的调用实际是通过调用该对象的客户端代理对象stub来完成的,通过该机制RMI就好比它是本地工作,采用tcp/ip协议,客户端直接调用服务端上的一些方法 。优点是强类型,编译期可检查错误,缺点是只能基于JAVA语言,客户机与服务器紧耦合 。
来看下基于RMI的一次完整的远程通信过程的原理:
- 客户端发起请求,请求转交至RMI客户端的stub类;
- stub类将请求的接口、方法、参数等信息进行序列化;
- 基于socket将序列化后的流传输至服务器端;
- 服务器端接收到流后转发至相应的skelton类;
- skelton类将请求的信息反序列化后调用实际的处理类;
- 处理类处理完毕后将结果返回给skelton类;
- Skelton类将结果序列化,通过socket将流传送给客户端的stub;
- stub在接收到流后反序列化,将反序列化后的Java Object返回给调用者 。
根据原理来回答下之前学习应用级协议带着的几个问题:
- 传输的标准格式是什么?是Java ObjectStream 。
- 怎么样将请求转化为传输的流?基于Java串行化机制将请求的java object信息转化为流 。
- 怎么接收和处理流?根据采用的协议启动相应的监听端口,当有流进入后基于Java串行化机制将流进行反序列化,并根据RMI协议获取到相应的处理对象信息,进行调用并处理,处理完毕后的结果同样基于java串行化机制进行返回 。
- 传输协议是?Socket 。
3.2 XML-RPC
RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果 。这个请求包括一个参数集和一个文本集,通常形成“classname.methodname”形式 。优点是跨语言跨平台,C端、S端有更大的独立性,缺点是不支持对象,无法在编译器检查错误,只能在运行期检查 。
推荐阅读
- Java 读取本地 JSON 文件
- Java中如何实现线程的超时中断
- 1分钟带你看懂Java内部类
- HTML5 的JavaScript 客户端PDF解决方案——jsPDF
- JavaScript核心概念归纳整理
- 如何批量导入电话号码到手机通讯录
- 苹果手机怎么批量删除通讯录联系人?简单实用方法总结
- Javascript事件轮询
- 这篇java的NIO编程,保证你能看懂
- 1分钟读懂JavaScript、Ajax、jQuery全部知识点