java远程调用方法总结
java远程调用方法总结
前言:项目中使用到RMI、webService等远程调用方法,各方法demo输出,予以小结。- Java RMI (Remote Method Invocation)
- WebService,如jax-ws axis xfire cfx
- Httpinvoker
- Hessian
- Burlap
- EJB远程接口调用
1、Java RMI (Remote Method Invocation)
JavaRMI即远程方法调用,是jdk中内嵌的一个最底层的解决方案,它应用起来最轻量级,也最简单,它不需要任何的web服务器,直接在代码中绑定IP地址和相应的端口,适用于非常简单的小微应用。
优点:
- Full object support:RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。
- Cross platform:与java语言绑定,RMI只支持Java;
- Robust communications : 传输可靠
- Large objects:这个优点理解不深,粗略理解可传递大对象;
- Security for client and servers:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
- Distribution/updates of codes:远程接口实际上就是Java接口,面向接口编程可轻松实现功能代码的升级;
缺点:
- Java RMI only supports Java : Java语言的远程调用,两端的程序语言必须是Java实现;
- Requires non-standard port : RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。
- Proprietary protocol by single vendor :RMI依赖于Java远程消息交换协议JRMP(Java Remote Messaging Protocol),该协议为java定制,要求服务端与客户端都为java编写;
- Requires RMI-lookup : 需要注册(不明白为什么属于缺陷) 。
RMI_Demo见附件。
2、WebService,如jax-ws axis xfire cfx
WebService是很常见的远程调用方法,其最大的优势就是跨平台语言,无论客户端是Java还是.NET都能轻松的调用。它采用SOAP(Simple Object Access Protocol)协议来封装序列化的消息,实际上是形成一个xml文件,可以通过http进行网络传输。WebService的客户端调用其实是使用生成文件的方式,只要知道发布接口的URL即可,而不需要额外传递jar包或者class文件。常见的WebService实现有jax-ws2.0、axis、xfire以及cfx,其中jax-ws2.0是jdk中封装好的,有一定的灵活性,但是这种把框架内嵌进入JVM其实对其可控性大大降低;axis有1.0和2.0两个版本,这个不是太了解;xfire和cfx其实是一个源头,xfire在07年停止开发,和另外一个框架合并形成了cfx,是一个比较受欢迎的WebService实现。
WebService 的主要目标是跨平台的可互操作性。
优点:
- 跨防火墙的通信:一般要访问的Web服务器以及要访问的Web Service的客户端很可能位于防火墙后面,都默认关闭其它端口而开放HTTP端口,而Web service 正是基于HTTP的,所以它可以穿越防火墙;
- 应用程序集成:可以实现不同应用程序和在不同系统平台上开发出来的应用程序之间通信。与RMI、DOCM、CORBA最大的不同就是:Web Service 以 SOAP 作为基本通信协议从而避免了复杂的协议转换;
- B2B 的集成:跨公司的商务交易集成通常叫做B2B 集成。通过WebService ,公司可以把关键的商务应用“ 暴露” 给指定的供应商和客户,只要把商务逻辑“ 暴露” 出来,成为WebService ,就可以让任何指定的合作伙伴调用这些商务逻辑,而不管他们的系统在什么平台上运行,使用什么 开发语言。这样就大大减少了花在B2B 集成上的时间和成本,让许多原本无法承受EDI 的中小企业也能实现B2B 集成。
缺点:
- 单机应用程序:单机应用程序只要与本机上的其他程序通讯,这种情况下使用WebService消耗太大,而且不会带来任何好处;
- 局域网的同构应用程序:简言之,还是性能问题。只要从应用程序结构的角度看,有别的方法比WebService更有效、更可行,那就不要用WebService。
3、Httpinvoker
Spring HTTP invoker 是 spring 框架中的一个远程调用模型,执行基于 HTTP 的远程调用(意味着可以通过防火墙),并使用 Java 的序列化机制在网络间传递对象。客户端可以很轻松的像调用本地对象一样调用远程服务器上的对象,这有点类似于 webservice ,但又不同于 webservice。
这里简单与WebService作对比来介绍Httpinvoker:
webservice | Http Invoker |
跨平台,跨语言 | 只支持 java 语言 |
支持 SOAP ,提供 wsdl | 不支持 |
结构庞大,依赖特定的 webservice 实现,如 xfire等 | 结构简单,只依赖于 spring 框架本身 |
4、Hessian
hessian是一种高效简洁的远程调用框架,它采用的是二进制RPC协议(Binary),具有轻量、传输量小、平台无关的特点,特别适合于目前网络带宽比较小的手机网络应用项目。类似于WebService,不过不使用SOAP协议,而是用Binary RPC协议,相比webservice而言更简单、快捷。它把协议报文封装到http封包中,通过HTTP信道传输。Hessian是通过servlet提供远程服务,完全使用动态代理来实现的,推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。
优点:
- 简单易用,面向接口,通过接口暴露服务,jar包只有200、300k,不需要配置防火墙;
- 效率高,复杂对象序列化速度仅次于RMI,简单对象序列化优于RMI,二进制传输;
- 多语言支持:wiki、Java、Flash/Flex、Python、C++、.NET C#、PHP、Ruby、Objective-C
- 可与Spring集成,配置简单,使用HessianServiceExporter提供bean服务。
缺点:
- 缺乏安全机制,传输没有加密处理;
- 异常机制不完善,总是报一些错误,错误原因也是千奇百怪,提示信息不足;
- 事务处理欠缺;
- 版本问题,服务器端和客户端通常要保持一致的版本,否则会出现莫名其妙的问题;
- 其支持的数据类型是有限制的,不支持复杂的对象。
5、Burlap
Burlap是将网络传输的对象转换为XML文本格式通过Http进行传递,支持的对象与Hessian相比更少。XML一般比二进制流占 用空间大,在网络上传递所需要的时间比二进制流长,XML的解析过程也会耗用更多的内存。Burlap可以穿透防火墙,而且由于传输的格式是XML文本, 可以与其他系统(比如.NET)集成,从某种程度来讲,Burlap是一种不标准的WebService。
好像不常用。
6、EJB远程接口调用
目前暂未接触EJB,没做过深入了解。
相关链接:
上一篇: MySql递归查询语句
下一篇: RMI 例子
推荐阅读
-
java通过反射创建对象并调用方法
-
python远程调用rpc模块xmlrpclib的方法
-
在jquery中的ajax方法怎样通过JSONP进行远程调用
-
python调用java的jar包方法
-
java使用this调用构造函数的实现方法示例
-
Python实现调用另一个路径下py文件中的函数方法总结
-
Unity3D中自动调用的方法总结
-
解决C#中调用WCF方法报错:远程服务器返回错误 (404) 未找到
-
调用android的getColor()方法出现 java.lang.NoSuchMethodError: android.content.res.Resources.getColor
-
乐字节Java编程之方法、调用、重载、递归