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. 【spark】示例:二次排序

    我们有这样一个文件          首先我们的思路是把输入文件数据转化成键值对的形式进行比较不就好了嘛! 但是你要明白这一点,我们平时所使用的键值对是不具有比较意义的,也就说他们没法拿来直接比较. ...

  2. Hibernate 悲观锁,乐观锁

    业务逻辑的实现过程中,往往需要保证数据访问的排他性.因此,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无 ...

  3. python练习题100例

    链接地址:http://www.runoob.com/python/python-100-examples.html

  4. 条款1:将c++视作一个语言联邦

    c++是一个多重泛型编程语言,其所支持的泛型有: 面向过程编程(procedual) 面向对象编程(object-oriented) 面向函数编程(functional) 泛型编程(generic) ...

  5. YUI笔记 1 模块加载

    我们通常开发js程序就是使用<script>标签把脚本引入到页面中进行开发,如果是简单的逻辑还好,但是如果是比较庞大的大规模js开发,可能会出现下面的问题: 1.  <script& ...

  6. H264子宏块的划分有哪些?

    每个分割或子宏块都有一个独立的运动补偿.每个 MV 必须被编码.传输,分割的选择也需编 码到压缩比特流中.对大的分割尺寸而言,MV 选择和分割类型只需少量的比特,但运动补偿残差 在多细节区域能量将非常 ...

  7. Ruby on Rails入门——macOS 下搭建Ruby Rails Web开发环境

    这里只介绍具体的过程及遇到的问题和解决方案,有关概念性的知识请参考另一篇:Ruby Rails入门--windows下搭建Ruby Rails Web开发环境 macOS (我的版本是:10.12.3 ...

  8. Go语言的序列化与反序列化(gob)

    encoding/gob包实现了高效的序列化,特别是数据结构较复杂的,结构体.数组和切片都被支持. 实现代码如下://定义一个结构体type Student struct { Name string ...

  9. POJ 2954 Triangle (pick 定理)

    题目大意:给出三个点的坐标,问在这三个点坐标里面的整数坐标点有多少个(不包含边上的) 匹克定理:I = (A-E) / 2 + 1; A: 表示多边形面积 I : 表示多边形内部的点的个数 E: 表示 ...

  10. zend studio 提升开发效率的快捷键及可视化订制相关设置

    Zend studio快捷键使用 F3 快速跳转到当前所指的函数,常量,方法,类的定义处,相当常用.当然还可以用Ctrl+鼠标左键 shift+end 此行第一个到最后一个 shift+home 此行 ...