1.     Java远程方法调用

Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。

1.1   远程调用方案比较

1、Java RMI (Remote Method Invocation)

2、EJB远程接口调用

3、WebService,如jax-ws axis xfire cfx

4、Hessian以及Spring HttpInvoker

5、直接动态请求返回JSON数据

6、等。。。

本文从配置复杂性、编码难度、执行效率、跨语言性、兼容性、安全性、协议类型、是否绑定特定框架等方面做一个简单的比较分析。

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数据,数据结构不够灵活,安全性也不足。不过实现起来简单,和业务代码一起就顺带写完了,几乎都不需要客户端的概念,只要请求数据足够简单、安全措施做好也可以使用。

1.2   远程调用技术举例

Dubbo、RMI、Webservice、Hessian、netty等。

1.3   基本原理

在底层层面去看,就是将流从一台计算机传输到另外一台计算机,基于传输协议( http、tcp、udp等等)和网络IO( bio、nio、aio )来实现。

1.4   关键技术点

1. 通信协议:传输层:socket(tcp,udp) 应用层: http

2. 应用级的协议(dubbo, JRMP,SOAP, xml-rpc(xml+http),binary-RPC(二进制+http))

2.1. 提供更加易用的标准传输格式,避免直接做流操作.

2.2. 实现网络通信机制

将传输格式转化为流

通过某种传输协议传输至远端计算机

远端计算机将流转化为传输格式

3.网络IO

bio(阻塞)、

nio(非阻塞)、

aio(异步,jdk7中新特性)。

4. MultiThread,在服务端为每个请求启用一个线程

5. 本地调用与远程调用的透明化方案

Java classloader、Dynamic Proxy

6. 网络通信处理机制

自动重连、广播、异常、池处理等等

7. 序列化

各种协议的序列化机制

2.     什么是webservice?

Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。

采用SAOP(Simple Object Access Protocol)  协议传输,SAOP属于w3c标准。SAOP协议是基于HTTP的应用层协议,SAOP协议传输是xml数据。SAOP是一种应用层协议,基于HTTP的二次封装(在HTTP 基础又定义一套协议)。简单理解:SAOP=(HTTP+xml)

采用WSDL作为描述语言即webservice使用说明书,WSDL属w3c标准.

xml是webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。

XSD,W3C为webservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的webservice接口在发送数据时都要转换成webservice标准的XSD发送。

当前非SAOP协议的webService以轻量为首要目标,比如HTTP rest方式也是webservice的一种方式,或者直接使用HTTP自定义数据协议,比如HTTP传输json数据,HTTP传输xml数据等。

3.     Webservice三要素 

3.1   SAOP(通信协议)

SAOP 即 Simple Object AccessProtocol 也就是简单对象访问协议。

SAOP是webservice 的传输协议,SAOP=HTTP+xml。

因为 SAOP 基于XML 和 HTTP ,其通过XML 来实现消息描述,然后再通过 HTTP 实现消息传输。

SAOP当前有两个版本 SAOP1.1.和SAOP1.2 。

SAOP协议不是webservice的专有协议。

例如,SMTP、tr069协议在SAOP协议的基础上定义的新协议等。

3.2   WSDL(使用说明书)

WSDL 即Web Services Description Language也就是 Web 服务描述语言。

是基于 XML的用于描述 Web 服务以及如何访问 Web 服务的语言。

基于 XML 的用于描述Web Service及其函数、参数和返回值。通俗理解WSDL是webservice的使用说明书。

使用方法:

服务端发布了一个webservice 接口之后,通过WSDL说明书(xml格式)查询接口内容。

WSDL 描述了 Web服务的三个基本属性:

(1)服务所提供的操作

(2)如何访问服务

(3)服务位于何处(通过 URL 来确定就 OK 了)

3.3   UDDI(目录)

UDDI 即 Universal Description,Discovery and Integration,也就是通用的描述,发现以及整合。

UDDI 是一种目录服务,企业可以通过 UDDI 来注册和搜索 Web 服务。

简单来时候话,UDDI 就是一个目录,只不过在这个目录中存放的是一些关于 Web 服务的信息而已。

并且 UDDI 通过SOAP 进行通讯,构建于 . Net 之上。

4.     Java中webservice开发规范?

4    

4.1   JAX-WS(掌握)

JAX-WS  的全称为 Java API for XML-Based Webservices ,通过java api面向对象开发webservice。

jax-ws采用SAOP协议。

4.2   JAXM&SAAJ

JAXM(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API,通过JAXM更多操作 SAOP协议细节。

JAXM&SAAJ在webservice通信时传输附件。

4.3   JAX-RS(掌握)

JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。

JAX-RS可以直接基于HTTP方式开发。

接口更轻量。

使用cxf来实现rest方式。

传输层tcp协议

tcp:面向连接协议,这种协议很稳定,客户端经过三次握手可以和服务端建立一个通道,在这个通道进行通信。

udp:数据报协议,不稳定,客户端只管向服务发送数据,服务端可能接收不到。

总结:

接口开发使用的基础协议包括tcp和udp。

5.     使用jaxws调用公网天气查询

4.1   服务端

公网已经提供天气查询服务。

4.2   客户端

使用wsimport生成调用代码。

1、               找到公网天气查询WSDL说明书。

2、               生成代码。

3、客户端代码。

package cn.com.client;

import cn.com.webxml.ArrayOfString;
import cn.com.webxml.WeatherWebService;
import cn.com.webxml.WeatherWebServiceSAOP;

import java.util.List;

/**
 * Created by yadongliang on 2017/7/18.
 */
public class QueryWeather
{
    public static
void
main(String[] args){
        // 创建服务视图
       
WeatherWebService webservice = new WeatherWebService();

// 通过服务视图创建porttype
       
WeatherWebServiceSAOP webServiceSAOP = webservice.getWeatherWebServiceSAOP();

// 通过porttype调用方法
       
ArrayOfString arrayOfString = webServiceSAOP.getWeatherbyCityName("天津市");
        List<String> resultList =
arrayOfString.getString();

for (String result :
                resultList) {
            System.out.println(result);
        }
    }
}

6.     Socket优缺点?

优点:

socket是传输层工作,基于tcp/ip封装一个接口规范。

可以跨平台(客户端操作系统、和编程语言和服务端不一样)。

传输速度是很快的,要传输一些大数据可以采用socket。

缺点:

socket在开发时需要手动通过流解析数据流,此时遵循的是一种自定义的协议。

自定义协议:客户端和服务端通信内容是需要在代码中手动特殊的解析,比如:客户端和服务端发送xml数据,xml数据的内容就是自定义的,客户端和服务端编程时需要在代码对xml数据的解析特殊处理。

7.     Webservice优缺点?

优点:

采用xml支持跨平台远程调用。

基于HTTP的SAOP协议,可跨越防火墙。

基于 SAOP协议使用webservice服务程序可以部署在tocmat中,通过80对外提供服务。

支持面向对象开发。

有利于软件和数据重用,实现松耦合。

缺点:

SAOP协议基于xml方式传输,传输效率不高。

           
     
 

java

webservice

发送的数据进行序列化

   

c++

webservice

接收到数据按SAOP协议进行反序列

 
 

SAOP为了支持面向对象开发,两端都有序列化过程。

建议:

如果对接口速度要求不高,为了协议标准,建议使用SAOP。

8.     Webservice和Socket的区别?

7.1  
关系

底层基于tcp/ip协议,使用socket进行通信。

上层jaxws使用SAOP协议,SAOP基于HTTP传输xml数据。

通过socket编程方式实现jaxws通信。

结论:

Webservice采用SAOP协议进行通信,底层基于socket通信,webservice不需专门针对数据流的发送和接收进行处理,是一种跨平台的面向对象远程调用技术。

7.2  
区别

网络七层协议为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

socket 只是 java在网络层定义的类,用来实现网络层。上面的各层需要我们自己在程序里实现。例如端口可以自己定义
、数据包的定义、 数据包的加密解密等

而webService java实现了应用层的工具,他基于的服务为HTTP协议,通过服务器才可以发布出去。这样内部的端口的定义、数据包的定义和数据包的加密解密都做好了,所以我们就直接可以用了。

webService 内部数据格式为xml格式、由于基于HTTP协议,所以可以不受防火墙的影响。因为他的通信协议和我们浏览网页的协议是相同的。

9.     Webservice 技术选型

9.1  
协议约定

服务端采用什么协议,客户端也使用什么协议。

9.2  
通用性(公开性)

对于一个webservice主要考虑接口的通用性时,在不要求性能的前提下可以使用SAOP协议(w3c标准)。

如果有性能要求,还要求通用性:哪个接口技术性能高并且还通用,优先推荐HTTP。

9.3  
高性能

几种技术性能从高到低是:

socket>RMI(客户端和服务端都为java)>hessian>HTTP>SAOP

9.4  
企业开发规范

如果企业定义开发规范,其中包括接口规范,已经确定接口使用技术,使用什么协议。

比如:有些公司统一确定采用HTTP+json方式。

10. Webservice技术实现方法

博客:Java开发中经常使用到的几种WebService技术实现方案

http://blog.csdn.net/zolalad/article/details/25158995

博客:几种流行Webservice框架性能对比(转载、拼接)

http://blog.csdn.net/chenleixing/article/details/44958549

目前三种主流的web服务实现方法:

REST(新型):表象化状态转变 (软件架构风格)RESTEasy、Wink、CXF、Axis2……

SOAP(比较成熟):简单对象访问协议  Xfire、Axis2、CXF、Axis1

XML-RPC(淘汰):远程过程调用协议(慢慢被soap 所取代)

如何选择?

Apache CXF是CodehausXFire的第二代产品,目前在不同框架中性能最佳,应该是开发者不错的选择,这与它本身的架构设计不无关系。相比其他框架,CXF具有几个突出的特性:支持JAX-WS、Spring集成、Aegi数据绑定、支持RESTful
services、支持WS-*、Apache协议、代码实现简洁。

Apache Axis2是Apache Axis1的第二代产品,架构上也非常不错,关键特性:支持多语言(C/C++)、支持各种规范、可插拔模块化设计、支持热部署等。与CXF相比性能也非常优异。

RESTEasy也许也是个不错的框架!(个人观点)

webservice(pers)的更多相关文章

  1. webservice(草稿)

    1.  概述 WebService是一种跨编程语言和跨操作系统平台的远程调用技术. Webservice是被定义用来使不同应用之间通过网络传输数据的一种标准,此标准和具体的语言无关,至于哪种语言提供接 ...

  2. webService

    什么是webService WebService,顾名思义就是基于Web的服务.它使用Web(HTTP)方式,接收和响应外部系统的某种请求.从而实现远程调用.  1:从WebService的工作模式上 ...

  3. 开始webservice了

    一.WebService到底是什么 一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用 ...

  4. Spring WebService入门

    Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布 ...

  5. 浅谈跨域以及WebService对跨域的支持

    跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源. 在 ...

  6. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  7. Atitit webservice发现机制 WS-Discovery标准的规范attilax总结

    Atitit webservice发现机制 WS-Discovery标准的规范attilax总结 1.1. WS-Discovery标准1 1.2. 一.WS-Discovery1 1.2.1.   ...

  8. java调用CXF WebService接口的两种方式

    通过http://localhost:7002/card/services/HelloWorld?wsdl访问到xml如下,说明接口写对了. 2.静态调用 // 创建WebService客户端代理工厂 ...

  9. VS2010编写WebService与在IIS的发布<之简单讲解>

    工具VS2010,window环境win7 一:Webservice的创建与方法查看调用 1.新建空web应用程序项目 2.新建web服务 3.自动生成 4.直接跑起来,可以看到有2个方法 5.点击H ...

随机推荐

  1. Laravel validate 500异常 添加手机验证,中文验证与Validator验证的“半个”生命周期

    今天来讲一下,Lumen的Validator函数 1 2 3 4 5 6 7 8 9 10 11 use Validator;   ...   Class .. {   public function ...

  2. 基于双向LSTM和迁移学习的seq2seq核心实体识别

    http://spaces.ac.cn/archives/3942/ 暑假期间做了一下百度和西安交大联合举办的核心实体识别竞赛,最终的结果还不错,遂记录一下.模型的效果不是最好的,但是胜在“端到端”, ...

  3. 3分钟搞定Linux系统正则表达式

    正则表达式是一种字符模式,用于在查找过程中匹配制定的字符. 元字符通常在Linux中分为两类:Shell元字符,由Linux Shell进行解析:正则表达式元字符,由vi/grep/sed/awk等文 ...

  4. 转: 一个程序员的Java和C++学习之路(整理)

    http://blog.csdn.net/ajian005/article/details/8003655 http://m.blog.csdn.net/xugangwen/article/detai ...

  5. JavaScript 上下文环境和作用域,以及 call、apply 和 bind【转载+翻译+整理】

    --看到这篇文章,翻译国外的,虽说写得有点矫情,但总体来看,还是相当不错的- 本文内容 我在哪儿?你又是谁 ? this? 用 apply 和 call 掌控上下文环境 bind 之美 本文将说明上下 ...

  6. RT/Metro商店应用如何调用SQLite数据库

    RT/Metro商店应用如何调用SQLite数据库 使用前,要安装:SQLite for Windows Runtime (Windows 8.1)(一个VS插件).还有Visual C++ Runt ...

  7. 低危漏洞- X-Frame-Options Header未配置

    原文链接:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/X-Frame-Options?redirectlocale=en-US&redi ...

  8. http 三次握手

    1.三次握手 目的:主要规避由于网络阻塞,传输不畅等原因导致服务器端端口一直被占用,无法释放端口资源.(想想假设只要一次就建立连接,服务器响应后浏览器若是没收到数据,等待一段时间后,网络超时,浏览器重 ...

  9. vue refs v-for 使用注意

    当 v-for 用于元素或组件的时候,引用信息将是包含 DOM 节点或组件实例的数组. https://cn.vuejs.org/v2/api/#ref https://www.w3cplus.com ...

  10. Project Euler:Problem 63 Powerful digit counts

    The 5-digit number, 16807=75, is also a fifth power. Similarly, the 9-digit number, 134217728=89, is ...