Java常见分布式协议比较-RMI
来源:互联网 发布:北京国税报税软件 编辑:程序博客网 时间:2024/05/16 14:08
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相比,则性能接近或稍差一些。
- Java常见分布式协议比较-RMI
- Java常见分布式协议比较-RPC
- Java RMI 分布式应用
- [分布式技术]Java RMI
- Java RMI协议开发
- Java RMI分布式应用程序概述
- Java分布式之RMI实例教程
- 分布式计算 lab2 Java RMI
- java RMI 分布式简单应用
- Java分布式通信之RMI
- Java RMI和socket比较
- 几种java通信(rmi,http,hessian,webservice)协议性能比较
- 几种java通信(rmi,http,hessian,webservice)协议性能比较
- java分布式对象(RMI+部署使用RMI的程序)
- 利用RMI实现JAVA分布式应用
- Java分布式处理技术(RMI,JDNI)
- Java分布式处理技术(RMI,JDNI)
- 关于java RMI分布式程序开发实例
- java中的堆、栈、常量池
- Python进制互相转换(二进制、十进制和十六进制)
- pjsip中的源代码分析
- shell 写日志函数
- struts2 Error setting expression XXXX with value
- Java常见分布式协议比较-RMI
- application context/activity context与内存泄露
- 我是PM小圈
- java实现的数据库导出成excel功能
- Java内存管理
- Mysql 远程登录及常用命令
- LibSVM安装及部分问题解决
- Javascript教程:AngularJS的五个超酷特性
- List与ArrayList的区别和联系