webservice(pers)
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;
|
6. Socket优缺点?
优点:
socket是传输层工作,基于tcp/ip封装一个接口规范。
可以跨平台(客户端操作系统、和编程语言和服务端不一样)。
传输速度是很快的,要传输一些大数据可以采用socket。
缺点:
socket在开发时需要手动通过流解析数据流,此时遵循的是一种自定义的协议。
自定义协议:客户端和服务端通信内容是需要在代码中手动特殊的解析,比如:客户端和服务端发送xml数据,xml数据的内容就是自定义的,客户端和服务端编程时需要在代码对xml数据的解析特殊处理。
7. Webservice优缺点?
优点:
采用xml支持跨平台远程调用。
基于HTTP的SAOP协议,可跨越防火墙。
基于 SAOP协议使用webservice服务程序可以部署在tocmat中,通过80对外提供服务。
支持面向对象开发。
有利于软件和数据重用,实现松耦合。
缺点:
SAOP协议基于xml方式传输,传输效率不高。
|
|
|||||
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也许也是个不错的框架!(个人观点)
作者:习惯沉淀
如果文中有误或对本文有不同的见解,欢迎在评论区留言。
如果觉得文章对你有帮助,请点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
扫码关注一线码农的学习见闻与思考。
回复"大数据","微服务","架构师","面试总结",获取更多学习资源!