- 浏览: 175693 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
surfingll:
思路不错,赞一个
站内信的实现:数据库的设计 -
shakajava:
哎,都是千篇一律的东西
站内信的实现:数据库的设计 -
java_xiaoyi:
不错...
java API -
tonysmith:
兄弟说的太对了。干活用了一年多,考官一问,只知其一。这是个“杯 ...
Java 中的访问权限控制 -
上官车月:
像牛一样的干了一年多,除了工作和加班 还真没有想过,基础的东西 ...
Java 中的访问权限控制
在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在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、同步请求、异步请求等等请求方式,按照网络通信原理,需要实现这个需要做的就是将请求转换成流,通过传输协议传输至远端,远端计算机在接 收到请求的流后进行处理,处理完毕后将结果转化为流,并通过传输协议返回给调用端。
原理是这样的,但为了应用的方便,业界推出了很多基于此原理之上的应用级的协议,使得大家可以不用去直接操作这么底层的东西,通常应用级的远程通信协议会 提供:
1. 为了避免直接做流操作这么麻烦,提供一种更加易用或贴合语言的标准传输格式;
2. 网络通信机制的实现,就是替你完成了将传输格式转化为流,通过某种传输协议传输至远端计算机,远端计算机在接收到流后转化为传输格式,并进行存储或以某种 方式通知远端计算机。
所以在学习应用级的远程通信协议时,我们可以带着这几个问题进行学习:
1. 传输的标准格式是什么?
2. 怎么样将请求转化为传输的流?
3. 怎么接收和处理流?
4. 传输协议是?
不过应用级的远程通信协议并不会在传输协议上做什么多大的改进,主要是在流操作方面,让应用层生成流和处理流的这个过程更加的贴合所使用的语言或标 准,至于传输协议则通常都是可选的,在java领域中知名的有:RMI、XML-RPC、Binary-RPC、SOAP、CORBA、JMS,来具体的 看看这些远程通信的应用级协议:
RMI
RMI是个典型的为java定制的远程通信协议,我们都知道,在single vm中,我们可以通过直接调用java object instance来实现通信,那么在远程通信时,如果也能按照这种方式当然是最好了,这种远程通信的机制成为RPC(Remote Procedure Call),RMI正是朝着这个目标而诞生的。
来看下基于RMI的一次完整的远程通信过程的原理:
1. 客户端发起请求,请求转交至RMI客户端的stub类;
2. stub类将请求的接口、方法、参数等信息进行序列化;
3. 基于socket将序列化后的流传输至服务器端;
4. 服务器端接收到流后转发至相应的skelton类;
5. skelton类将请求的信息反序列化后调用实际的处理类;
6. 处理类处理完毕后将结果返回给skelton类;
7. Skelton类将结果序列化,通过socket将流传送给客户端的stub;
8. stub在接收到流后反序列化,将反序列化后的Java Object返回给调用者。
根据原理来回答下之前学习应用级协议带着的几个问题:
1. 传输的标准格式是什么?
是Java ObjectStream。
2. 怎么样将请求转化为传输的流?
基于Java串行化机制将请求的java object信息转化为流。
3. 怎么接收和处理流?
根据采用的协议启动相应的监听端口,当有流进入后基于Java串行化机制将流进行反序列化,并根据RMI协议获取到相应的处理对象信息,进行调用并处理, 处理完毕后的结果同样基于java串行化机制进行返回。
4. 传输协议是?
Socket。
XML-RPC
XML-RPC也是一种和RMI类似的远程调用的协议,它和RMI的不同之处在于它以标准的xml格式来定义请求的信息(请求的对象、方法、参数 等),这样的好处是什么呢,就是在跨语言通讯的时候也可以使用。
来看下XML-RPC协议的一次远程通信过程:
1. 客户端发起请求,按照XML-RPC协议将请求信息进行填充;
2. 填充完毕后将xml转化为流,通过传输协议进行传输;
3. 接收到在接收到流后转换为xml,按照XML-RPC协议获取请求的信息并进行处理;
4. 处理完毕后将结果按照XML-RPC协议写入xml中并返回。
同样来回答问题:
1. 传输的标准格式是?
标准格式的XML。
2. 怎么样将请求转化为传输的流?
将XML转化为流。
3. 怎么接收和处理流?
通过监听的端口获取到请求的流,转化为XML,并根据协议获取请求的信息,进行处理并将结果写入XML中返回。
4. 传输协议是?
Http。
Binary-RPC
Binary-RPC看名字就知道和XML-RPC是差不多的了,不同之处仅在于传输的标准格式由XML转为了二进制的格式。
同样来回答问题:
1. 传输的标准格式是?
标准格式的二进制文件。
2. 怎么样将请求转化为传输的流?
将二进制格式文件转化为流。
3. 怎么接收和处理流?
通过监听的端口获取到请求的流,转化为二进制文件,根据协议获取请求的信息,进行处理并将结果写入XML中返回。
4. 传输协议是?
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中的一次远程通信的过程:
1. 客户端将请求转化为符合JMS规定的Message;
2. 通过JMS API将Message放入JMS Queue或Topic中;
3. 如为JMS Queue,则发送中相应的目标Queue中,如为Topic,则发送给订阅了此Topic的JMS Queue。
4. 处理端则通过轮训JMS Queue,来获取消息,接收到消息后根据JMS协议来解析Message并处理。
回答问题:
1. 传输的标准格式是?
JMS规定的Message。
2. 怎么样将请求转化为传输的流?
将参数信息放入Message中即可。
3. 怎么接收和处理流?
轮训JMS Queue来接收Message,接收到后进行处理,处理完毕后仍然是以Message的方式放入Queue中发送或Multicast。
4. 传输协议是?
不限。
基于JMS也是常用的实现远程异步调用的方法之一。
发表评论
-
HashMap HashTable区别
2012-03-05 15:52 1158我想先问一个问题:为什么hashmap允许key可以为null ... -
字符串比较之 “==”和 “equals”
2012-03-05 13:04 915字符串比较之 “==”和 “equals” 提示:引用 ... -
介绍一下抽象类和接口的异同
2012-03-02 16:27 1116我把基本的弄成了表格形式的。下载附件吧。本想吧table co ... -
Java 中的上转型对象 使用
2012-03-02 15:34 5556呵呵。最近交接工作比较闲,顺便温习一下基础的知识吧: 今天看 ... -
最好的学习地址:Java开源框架SSH 和 ANT的学习地址
2012-02-29 15:44 1060给大家推荐一个我经常去看的网站:这个网站适合初级程序员,学生, ... -
Java 中的访问权限控制
2012-02-29 15:39 2141要辞职了,突然觉得这 ... -
JDK和JRE的区别
2012-02-29 12:17 1178<!--end: blogStats -->< ... -
Java 接口学习笔记
2012-02-26 02:23 3java语言不支持一个类有多个直接的父类(多继承),但可以实现 ... -
浅谈HTTP中Get与Post的区别(转)
2012-02-15 12:24 1207浅谈HTTP中Get与Post的区别 Http ... -
JDK中的URLConnection参数详解(转)
2012-02-15 11:51 1349JDK中的URLConnection参数 ... -
Java利用HttpURLConnection发送post请求上传文件
2012-02-14 10:58 2178在页面里实现上传文件不是什么难事,写个form,加上encty ... -
Java 存储过程 Mysql
2011-12-20 12:16 1339一:Java如何实现对存储过程的调用: A:不带输出参数的 ... -
spring jdbcTemplate
2011-12-08 11:08 1016先看applicationContext.xml配置文件: ... -
MyEclipse 8.6 download 官方下载地址
2011-12-07 14:28 1454Downloads: MyEclipse 8.6 for Ec ... -
windows下架设svn服务器
2011-12-07 11:36 933* 传统的Subversion 服务器 ... -
tomcat7.0 manager app和host manager web管理(转)
2011-12-07 11:23 10858在捣腾Tomcat 7的时候遇到一个问题,很多人对tomc ... -
Tomcat7.0 Error:java.lang.NoClassDefFoundError
2011-12-07 10:34 1316前面一段时间看到Tomcat7.0发布了几个测试版,由于没有稳 ... -
tomcat5.5 Error:cannot find the declaration of element 'web-app'
2011-12-05 12:01 2105tomcat 启动:cannot find the decla ... -
设置 session 失效时间的方法(转)
2011-09-21 09:57 1236具体设置很简单,方法有三种: (1) 在主页面或者公共页 ... -
Java读取properties文件的思考
2011-07-19 10:24 1026Java读取properties文件的思考 Java读 ...
相关推荐
Java远程通讯技术是构建分布式系统的关键,涉及到多种协议和实现方式。本文主要探讨了Java领域中常见的几种远程通讯技术,包括RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等。这些技术各有特点,适用于不同的...
### 用Java实现SOAP的XML文档网络传输及远程过程调用(RPC) ...这不仅有助于理解SOAP的工作原理,也为开发者提供了一个实用的例子来处理复杂的网络通信任务。随着Web服务的发展,掌握SOAP的相关技术仍然是非常重要的。
创建ServerSocket时,需要指定监听的端口号,以及可选的连接队列长度和绑定的IP地址。例如,`ServerSocket(int port)`是最简单的创建方式,监听指定端口;而`ServerSocket(int port, int backlog, InetAddress ...
- **RMI Activation System**: 用于动态地激活和管理远程对象的系统,可选功能。 ### 4. RMI的优点 - **简单易用**: RMI提供了简单的API,使得开发者能快速构建分布式应用。 - **高效**: RMI可以自动处理对象的序列...
此方法接受一个`AlluxioURI`对象,代表要创建的文件路径,以及一个可选的配置对象,用于指定写入模式(如追加或覆盖)和其他选项。文件内容可以通过`WriteStream`接口提供的方法来写入。 3. **文件读取** 读取...
8. **用户界面(可选)**:如果项目提供图形用户界面(GUI),则可能使用Java Swing或JavaFX库。开发者需要了解组件布局、事件处理和用户交互设计。 9. **文档编写**:一份完整的毕业设计通常包括源代码和项目报告...
3. **构建推送消息**:APNs推送消息包含一个设备Token(用户设备的唯一标识)、一个通知payload(JSON格式,包含标题、内容等信息)以及可选的优先级和有效期。 4. **发送推送**:通过已建立的连接,将构建好的推送...
6. **用户界面(可选)**:如果项目包含了用户界面,那么可能涉及到Swing或JavaFX等图形用户界面库。用户界面可以提供输入IP地址和端口范围的控件,以及显示扫描结果的功能。 7. **文档说明**:一个良好的项目应该...
- **发布消息**:通过`MqttClient`的`publish()`方法,指定主题和消息内容,以及可选的QoS级别。 - **订阅主题**:使用`subscribe()`方法订阅主题,可以设定回调函数以处理接收到的消息。 - **断开连接**:完成...
了解可选的标签库,如自定义标签库的创建和使用。 ### 8. MVC架构与框架 熟悉网页渲染技术,如JSF(JavaServer Faces)、Struts、Tapestry、Cocoon、WebWork等,深入理解MVC(Model-View-Controller)架构模式及其...
- **设置请求头**(可选):如果URL需要身份验证或其他特定头信息,可以通过`setHeader()`方法添加。 - **执行请求**:使用HttpClient的`execute()`方法发送请求,并获取`HttpResponse`对象。 - **处理响应**:...
在Android系统中,当一个应用程序需要与另一个运行在不同进程或者不同设备上的应用程序进行交互时,就需要使用到远程通信技术。Android提供了多种实现跨进程通信的方式,其中一种便是通过AIDL(Android Interface ...
Java RTP(Real-time Transport Protocol)是Java编程语言中用于实现实时数据传输,特别是音频和视频流的一种协议。RTP通常与RTCP(Real-time Transport Control Protocol)一起使用,为实时多媒体通信提供服务质量...
在生产环境中进行Java应用的排错与优化时,远程调试是一项非常重要的技术。它允许开发人员或运维工程师在不直接接触生产服务器的情况下,对运行在远程服务器上的Java应用进行调试和性能分析。这不仅可以减少停机时间...