Java远程方法调用是编程过程中比较常见的问题,列举一下主要包括如下几类:
1、Java RMI (Remote Method Invocation)
2、EJB远程接口调用
3、WebService,如jax-ws axis xfire cfx
4、Hessian以及Spring HttpInvoker
5、直接动态请求返回JSON数据
 
       本文从配置复杂性、编码难度、执行效率、跨语言性、兼容性、安全性、协议类型、是否绑定特定框架等方面做一个简单的比较分析。
 
       JavaRMI是jdk中内嵌的一个最底层的解决方案,它应用起来最轻量级,也最简单,它不需要任何的web服务器,直接在代码中绑定IP地址和相应的端口,如果是非常简单的小微应用比较适合,因为最底层其效率应该不错,接下来的几种调用方式其他有一些都是以这个为基础扩展而来的。其缺点也很明显,如果业务非常多而复杂、接口调用非常频繁需要分布在多台服务器,那么其编码很不优雅、也难于实现分布式等,且所有的东西都集中在代码里了,可读性可维护性等都不太理想,不具备跨语言的调用。
 
       EJB远程接口调用,其最本质的底层仍然是JavaRMI,通过JNDI来调用服务。不过EJB远程接口调用的优点是,可以非常轻松的实现分布式,客户端编码有些版本比较复杂,但多数代码一般可以借助IDE自动完成,EJB3.0以后的版本编码和配置起来也更简单。缺点是,EJB是个重量级的框架,需要EJB容器的支撑,很多web服务器都不具备这个功能,如resin、tomcat等,如果业务代码不是使用EJB的话,远程调用自然不适用。目前互联网开发中EJB已经非常少见了,可能是spring的崛起以及非常有名的那本书《Expert One-on-One J2EE Development without EJB》,有中文版。
 
       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实现。
 
       Hessian是另外一个非常常用的远程调用方案,它基于Binary-RPC协议,这个协议把请求和响应的数据统统使用标准的二进制格式进行封装,所以它也具有跨语言平台传输数据的能力,而且它有自己的高效的序列化和反序列化机制。不过hessian在版本控制中经常出现互不兼容的情况,服务器端和客户端通常要保持一致的版本,否则会出现莫名其妙的问题,还有常见的各种错误,如使用nginx反向代理后返回411错误等。spring对hessian提供了很好的支持,通常配合使用;同时spring还有一套自己的远程调用方法HttpInvoker。如果你使用过Hessian和HttpInvoker的话,就会发现它俩的配置几乎一模一样,包括接口名称、类名、字段名、调用和发布代码。。。而且不能同时使用,会相互产生冲突。它们都是通过servlet进行请求处理,需要servlet容器支持,效率不错。
 
       直接动态请求返回JSON数据,是一个直观上的方式,严格来说不属于远程方法的调用。这种方式就是通过一个servlet请求直接由容器返回封装好的JSON数据,数据结构不够灵活,安全性也不足。不过实现起来简单,和业务代码一起就顺带写完了,几乎都不需要客户端的概念,只要请求数据足够简单、安全措施做好也可以使用。
 
转载:https://www.cnblogs.com/fenglie/articles/3785827.html

使用Java进行远程方法调用的几个方案及比较的更多相关文章

  1. Java RMI(远程方法调用) 实例与分析 (转)

    目的: 通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出. 概念解释: RMI(RemoteMethodInvocat ...

  2. Java RMI(远程方法调用) 实例与分析

    目的: 通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出. 概念解释: RMI(RemoteMethodInvocat ...

  3. JAVA RMI远程方法调用简单实例[转]

    RMI的概念 RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制.使用这种机制,某一台计算机上的对象可以调用另外 一台 ...

  4. java rmi远程方法调用实例

    RMI的概念 RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制.使用这种机制,某一台计算机上的对象可以调用另外一台计 ...

  5. JAVA RMI远程方法调用简单实例(转载)

    来源:http://www.cnblogs.com/leslies2/archive/2011/05/20/2051844.html RMI的概念 RMI(Remote Method Invocati ...

  6. Java中Map遍历的四种方案

    在Java中如何遍历Map对象 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> map = new HashM ...

  7. Java中替代C# ref/out 关键字方案:

    刚学习Java不久,今天遇到一个问题,需要在方法中修改传入的对象的值,确切的说是需要使用一个方法,创建一个对象,并把其引用返回,熟悉C#的我的第一反应就是C#中的ref/out关键字,结果发现Java ...

  8. Java注解应用,自定义注解映射实现方案说明.

    插件结构如图: 注册模块定义了三个:用于实体与表映射的注解,用于属性到表字段的映射,用于映射时过滤掉的注解. 1.用于实体与表映射的注解 package com.dobby.plugins.annot ...

  9. Java分布式锁的三种实现方案(redis)

    方案一:数据库乐观锁 乐观锁通常实现基于数据版本(version)的记录机制实现的,比如有一张红包表(t_bonus),有一个字段(left_count)记录礼物的剩余个数,用户每领取一个奖品,对应的 ...

随机推荐

  1. CSS相关博客

    1. CSS浮动(float,clear)通俗讲解:http://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html 2. CSS po ...

  2. Cassandra 的数据存储结构——本质是SortedMap<RowKey, SortedMap<ColumnKey, ColumnValue>>

    Cassandra 的数据存储结构 Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型.它借鉴了 Amazon 的 Dynamo 和 Google's BigTab ...

  3. bootstrap 操作提示placeholder

    Javascript 部分 function checkForDefaultAlertPlaceholder() { if ($("#alertPlaceholder").leng ...

  4. Sqlite/ FMDB

    Sqlite 1. Sqlite数据库 > 数据库? 按数据结构来组织,存储和管理数据的仓库. > 关系型数据库:使用二维表及其之间的联系组织成一个数据组织. 关系:可以理解为一张二维表, ...

  5. 【dlbook】数学基础

    [代数] Moore-Penrose 伪逆 [概率信息论] 自信息,香农熵,衡量两个分布的差异:kl散度 \ 交叉熵 [数值] 溢出: softmax计算的时候要关注上溢和下溢,如果所有X都相等且为很 ...

  6. CBP是什么?

    coded_block_pattern  简称CBP,用来反映该宏块编码中残差情况的语法元素.CBP共有6位,其中前面2位代表UV分量,描述如下表所示:后面4位是Y分量,分别代表宏块内的4个8x8子宏 ...

  7. How to handle your webdriver exceptions

    The most common exceptions and their solutions: NoAlertPresentException Indicates that a user has tr ...

  8. Electron 使用 Webpack2 预编译 Electron 和 Browser targets

    Electron 使用 Webpack2 预编译 Electron 和 Browser targets 前一篇文章说了说怎样使用 Webpack2 预编译 Electron 应用,但是有时候我们希望使 ...

  9. [转]优化Flash性能

    原文:http://www.adobe.com/devnet/flash/articles/optimizing-flash-performance.html 翻译:http://bbs.9ria.c ...

  10. ORM 关键

    1. 老师的增删改查 1. teacher_obj.cid.add(*[1, 2, 3]) 添加(必须打散) 2. teacher_obj.cid.set([1, 2, 3]) 设置(不用打散) 2. ...