Java常见分布式协议比较-RMI

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协议。

调用过程

其典型的通信过程如下

Select css media from webDeveloper

在此过程中,参数和返回值需要分别进行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对已有远程通信技术做的集成,支持以下技术:

  1. RMI:通过RmiProxyFactoryBean和RmiServiceExporter支持传统的RMI(即实现了Remote借口),并且支持透明的RMI调用(任何POJO)
  2. Spring Http Invoker: Spring自己的远程调用技术,基于HTTP和Java的序列化。支持任何Java接口,对应的类是HttpInvokerProxyFactory/HttpInvokerServiceExporter。要求通信双方不但是Java,而且必须使用Spring框架。
  3. Hessian、Burlap:通过HessianProxyFactoryBean、BurlapProxyFactoryBean等支持著名的Hessian/Burlap协议。
  4. 当然,Spring Remoting也支持非RMI的远程调用,如JMS、WebService。 Spring Remoting采用了一些最佳实践,如采用代理和缓存机制,因而在性能上略有提升。

性能

一般而言,一个远程方法调用花费~10ms。与比XML的RPC或者Web Service相比,性能高很多。与Hessian相比,则性能接近或稍差一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值