Java常见分布式协议比较-RMI
2013-03-22 17:03
281 查看
Java的远程调用有多种分布式协议可供使用,但其种类繁多,容易让人困扰。本系列博客分别对它们做入门介绍:
RMI: 含JBoss-Remoting,Spring Remoting
RPC: 含XML-RPC, Binary-RPC
CORBA:
SOAP: (Web Service)
EJB
JMS
Java中很容易调用一个实例的方法,但是想调用其他虚拟机上的实例怎么办?RMI技术应运而生,可以让Java程序调用远程虚拟机上的对象。
RMI主要采用Java对象序列化技术和TCP协议进行远程通信. 由于不是HTTP协议,不能穿越防火墙。
JRMP: JRMP是RMI最早的实现,也是Java中默认的实现,只能在Java语言中使用。
CORBA:CORBA也是基于RMI技术发展起来的,采用了基于HTTP的IIOP协议,以及接口定义语言IDL,不但可以跨越防火墙,还可以支持跨语言的调用。 EJB: EJB也是一种RMI技术,只不过底层使用了基于HTTP的IIOP协议。
其典型的通信过程如下
在此过程中,参数和返回值需要分别进行Java的序列化和反序列化。
RMI需要实现特定的接口,一般开发过程分为三步:
1. 编写服务器端代码: 服务器端需要继承Remote接口:
2. 生成代理文件: Java提供了命令行工具可以生成代理类,给客户端使用:
3. 编写客户端代码调用:
当然,如果使用Spring Remoting,已经集成了RMI,不需要继承指定的接口了:
JBoss Remoting是JBoss开发的Java领域的远程通信框架,提供了简单的API,可以基于多种协议进行远程方法调用。是JBoss内部很多产品的通信框架。
与Java RMI的区别在于,JBoss Remoting是一个“框架”,即支持多种通信协议(Socket/Http等);支持异步通信;可以把请求封装到已有的请求对象InvocationRequest,因而不需要再编写客户端代理。
由于做了性能优化,在某些测试中JBoss Remoting比Java RMI快7-8倍;然而也有测试发现二者的性能差不多。
Spring Remoting是Spring对已有远程通信技术做的集成,支持以下技术:
RMI:通过RmiProxyFactoryBean和RmiServiceExporter支持传统的RMI(即实现了Remote借口),并且支持透明的RMI调用(任何POJO)
Spring Http Invoker: Spring自己的远程调用技术,基于HTTP和Java的序列化。支持任何Java接口,对应的类是HttpInvokerProxyFactory/HttpInvokerServiceExporter。要求通信双方不但是Java,而且必须使用Spring框架。
Hessian、Burlap:通过HessianProxyFactoryBean、BurlapProxyFactoryBean等支持著名的Hessian/Burlap协议。
当然,Spring Remoting也支持非RMI的远程调用,如JMS、WebService。 Spring Remoting采用了一些最佳实践,如采用代理和缓存机制,因而在性能上略有提升。
一般而言,一个远程方法调用花费~10ms。与比XML的RPC或者Web Service相比,性能高很多。与Hessian相比,则性能接近或稍差一些。
RMI: 含JBoss-Remoting,Spring Remoting
RPC: 含XML-RPC, Binary-RPC
CORBA:
SOAP: (Web Service)
EJB
JMS
Java中很容易调用一个实例的方法,但是想调用其他虚拟机上的实例怎么办?RMI技术应运而生,可以让Java程序调用远程虚拟机上的对象。
协议和语言
RMI主要采用Java对象序列化技术和TCP协议进行远程通信. 由于不是HTTP协议,不能穿越防火墙。JRMP: JRMP是RMI最早的实现,也是Java中默认的实现,只能在Java语言中使用。
CORBA:CORBA也是基于RMI技术发展起来的,采用了基于HTTP的IIOP协议,以及接口定义语言IDL,不但可以跨越防火墙,还可以支持跨语言的调用。 EJB: EJB也是一种RMI技术,只不过底层使用了基于HTTP的IIOP协议。
调用过程
其典型的通信过程如下在此过程中,参数和返回值需要分别进行Java的序列化和反序列化。
样例代码
RMI需要实现特定的接口,一般开发过程分为三步:1. 编写服务器端代码: 服务器端需要继承Remote接口:
public interface RemoteObjextends Remote { public String getMessage() throws RemoteException; } public class RmiServerextends UnicastRemoteObject implements RemoteObj { public String getMessage() { return “Hello World”; } public static void main(String args[]) { // Create and install a security manager System.setSecurityManager(new RMISecurityManager()); LocateRegistry.createRegistry(1099); RmiServer obj = new RmiServer(); Naming.rebind("//localhost/RmiServer", obj); } }
2. 生成代理文件: Java提供了命令行工具可以生成代理类,给客户端使用:
rmic RmiServer
3. 编写客户端代码调用:
public class RmiClient { RmiServerIntf obj = null; public String getMessage() { obj = (RmiServerIntf)Naming.lookup("//localhost/RmiServer"); return obj.getMessage(); } publicstaticvoid main(String args[]) { // Create and install a security manager System.setSecurityManager(new RMISecurityManager()); RmiClient cli = new RmiClient(); } }
当然,如果使用Spring Remoting,已经集成了RMI,不需要继承指定的接口了:
JBoss Remoting
JBoss Remoting是JBoss开发的Java领域的远程通信框架,提供了简单的API,可以基于多种协议进行远程方法调用。是JBoss内部很多产品的通信框架。与Java RMI的区别在于,JBoss Remoting是一个“框架”,即支持多种通信协议(Socket/Http等);支持异步通信;可以把请求封装到已有的请求对象InvocationRequest,因而不需要再编写客户端代理。
由于做了性能优化,在某些测试中JBoss Remoting比Java RMI快7-8倍;然而也有测试发现二者的性能差不多。
Spring Remoting
Spring Remoting是Spring对已有远程通信技术做的集成,支持以下技术:RMI:通过RmiProxyFactoryBean和RmiServiceExporter支持传统的RMI(即实现了Remote借口),并且支持透明的RMI调用(任何POJO)
Spring Http Invoker: Spring自己的远程调用技术,基于HTTP和Java的序列化。支持任何Java接口,对应的类是HttpInvokerProxyFactory/HttpInvokerServiceExporter。要求通信双方不但是Java,而且必须使用Spring框架。
Hessian、Burlap:通过HessianProxyFactoryBean、BurlapProxyFactoryBean等支持著名的Hessian/Burlap协议。
当然,Spring Remoting也支持非RMI的远程调用,如JMS、WebService。 Spring Remoting采用了一些最佳实践,如采用代理和缓存机制,因而在性能上略有提升。
性能
一般而言,一个远程方法调用花费~10ms。与比XML的RPC或者Web Service相比,性能高很多。与Hessian相比,则性能接近或稍差一些。
相关文章推荐
- Java常见分布式协议比较-RPC
- 几种java通信(rmi,http,hessian,webservice)协议性能比较
- 几种java通信(rmi,http,hessian,webservice)协议性能比较
- 几种java通信(rmi,http,hessian,webservice)协议性能比较
- 几种java通信(rmi,http,hessian,webservice)协议性能比较
- Java 中日期的几种常见操作 —— 取值、转换、加减、比较
- java 比较几种常见循环方式的优劣
- java 几种远程服务调用协议的比较
- 聊聊 Java 中日期的几种常见操作 —— 取值、转换、加减、比较
- Java中三种比较常见的数组排序
- 几种Java常用的通信协议比较
- 【Java】【开源协议】常见开源协议
- Java中日期的几种常见操作 —— 取值、转换、加减、比较
- 用RMI建立一个分布式Java应用程序详解
- Java 中日期的几种常见操作 —— 取值、转换、加减、比较
- Java 中日期的几种常见操作 —— 取值、转换、加减、比较
- CORBA, DCOM and Java/RMI详细比较
- 使用JAVA中RMI机制来实现分布式程序(2)
- 常见Java开发工具的特点比较
- java 几种远程服务调用协议的比较