您的位置:首页 > 编程语言 > Java开发

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接口:

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相比,则性能接近或稍差一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: