什么是SOA?
SOA的全称为Service Oriented Architecture,即面向服务架构。这是一种架构理念。它的提出是在企业计算领域将耦合的系统划分为松耦合的无状态的服务。服务发布出来供其他服务调用,一组互相依赖的服务就构成了SOA架构下的系统。
SOA本质上是服务的集合。 服务间彼此通信,这种通信可能是简单的数据传送,也可能是两个或者更多的服务协调进行某种活动。 而所谓服务就是精确定义、封装完善、独立于其他服务所处环境和状态的函数。
虽然不同厂商或个人对SOA有着不同的理解,但是我们仍然可以从上述的定义中看到SOA的几个关键特性:粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。
即SOA是一种思想。
SOA和Web Service关系是怎样的?
SOA理念被提出之后,仅仅是概念上的,并没有落地。而当Web Servcie标准成熟和应用普及之后,SOA才真正被用在工程商。所以,几乎所有的SOA应用场合都是和Web Service绑定的,且Web Service是现在最适合实现SOA的技术,目前,我们基本认同Web Service技术在几方面体现了SOA的需要:
- 基于标准访问的独立功能实体满足了松耦合要求 --- 在Web Service中所有的访问都通过SOAP进行,用WSDL定义的接口封装,通过UDDI进行目录查找,可以动态改变一个服务的提供方而无需影响客户端的配置,外界客户端是根本不关心服务器端的实现的。
- 适合大数据量、低频率访问,符合服务大颗粒度功能 --- 基于性能和效率平衡的要求,SOA的服务提供的是大颗粒度的应用功能,而且跨系统边界的访问频率也不会像程序见函数调用那么频繁。 通过WSDL和基于文本的SOAP请求,可以实现能一次性接受处理大量数据。
- 基于标准的文本消息传递为异构系统提供通讯机制:web service所有的通讯都是通过SOAP进行的,而SOAP是基于XML的,XML是结构化的文本消息。
即SOA不是Web Servcie,而Web Service是目前最适合实现SOA的技术。
即Web Service是一套标准,可以使SOA思想用于实践。
什么是Web Service?
WebService是一种跨编程语言和跨操作系统平台的远程调用技术。 所谓跨编程语言是说服务器端可以用java写,而客户端可以用其他语言编写,反之亦然。 而跨操作系统平台是指服务器端程序和客户端程序可以在不同的操作系统上运行。而所谓远程调用是说一台计算机a上的一个程序可以调用另外一个计算机b上的一个对象的方法,其实这就是普通的暴露接口,如腾讯qq把相关登录接口暴露出来给其他小企业用,而第三方网站可以调用这些服务功能,但这些功能的代码实际上是跑在腾讯qq上的,这就是远程调用了。
实际上,Web Service是建立可操作的分布式应用程序的新平台,是一个平台,是一套标准,它定义了应用程序如何在web上实现互操作性,你可以用任何你喜欢的语言在任何你喜欢上的平台中写web service,只要我们可以通过web service标准对这些服务进行查询和访问。
即Web Service一种跨编程语言、操作系统平台的远程调用技术。
如何实现WebService平台技术?
实现webservice有三大技术 --- XML + XSD、SOAP、WSDL。
1、XML + XSD
WebService采用http协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法、什么参数、返回结果),XML主要的优点是它与平台、厂商都是无关的。
XML解决了数据表示的问题,但是没有定义一套标准的数据类型,比如整形数代表什么? 16位还是32位? 这些细节是非常重要的,而XML Schema(XSD), 其中schema的意思就是概要,即XSD定义了一套标准的数据类型,并给出了一套语言来扩展这套数据类型,webservice平台就是使用XSD来作为数据类型系统的,当你构造一个webservice时,为了符合其标准,你所使用的数据类型就必须被转换为XSD类型。
2、SOAP
即Simple Object Access Protocol,中文就是简单对象访问协议,简称SOAP,如下就是一个SOAP:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> ... ... </soap:Header> <soap:Body> ... ... <soap:Fault> ... ... </soap:Fault> </soap:Body> </soap:Envelope>
我们可以看到,这个SOAP不是简单的XML,而是经过SOAP标准改造之后得到的,SOAP可以在多种协议上传输,而大多数情况是绑定在HTTP协议传输的,所以就导致大多数人认为SOAP就是HTTP+XML,或者认为SOAP是HTTP post请求的一个专用版本。
WSDL
即web service description language,网络服务描述语言,简称为WSDL。 它是一门基于XML的语言。用于描述Web Service以及如何对他们进行范文。文档主要用下面几个元素来描述某个web service:
- <portType> 执行的操作
- <message> 使用的消息
- <types> 使用的数据类型
- <binding> 使用的通信协议
<wsdl:definitions xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing" xmlns:tns="tns" xmlns:plink="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:senc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s12env="http://www.w3.org/2003/05/soap-envelope/" xmlns:s12enc="http://www.w3.org/2003/05/soap-encoding/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="tns" name="Application"> <wsdl:types> <xs:schema targetNamespace="tns" elementFormDefault="qualified"> <xs:import namespace="http://www.w3.org/2001/XMLSchema" /> <xs:complexType name="say_hello"> <xs:sequence> <xs:element name="name" type="xs:string" minOccurs="0" nillable="true" /> </xs:sequence> </xs:complexType> <xs:complexType name="say_helloResponse"> <xs:sequence> <xs:element name="say_helloResult" type="xs:string" minOccurs="0" nillable="true" /> </xs:sequence> </xs:complexType> <xs:element name="say_hello" type="tns:say_hello" /> <xs:element name="say_helloResponse" type="tns:say_helloResponse" /> </xs:schema> </wsdl:types> <wsdl:message name="say_hello"> <wsdl:part name="say_hello" element="tns:say_hello" /> </wsdl:message> <wsdl:message name="say_helloResponse"> <wsdl:part name="say_helloResponse" element="tns:say_helloResponse" /> </wsdl:message> <wsdl:portType name="Application"> <wsdl:operation name="say_hello" parameterOrder="say_hello"> <wsdl:input name="say_hello" message="tns:say_hello" /> <wsdl:output name="say_helloResponse" message="tns:say_helloResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="Application" type="tns:Application"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="say_hello"> <soap:operation soapAction="say_hello" style="document" /> <wsdl:input name="say_hello"> <soap:body use="literal" /> </wsdl:input> <wsdl:output name="say_helloResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="Application"> <wsdl:port name="Application" binding="tns:Application"> <soap:address location="http://10.2.70.10:7789/SOAP/?wsdl" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
对于接口来说,接口文档非常重要,它描述了如何去访问接口,WSDL可以看做web service接口的一种标准格式的文档。
UDDI
Universal Description, Discovery and Integration",可译为“通用描述、发现与集成服务”,简称UDDI。WSDL用来描述了访问特定的web service的一些相关消息,但是在互联网上,如何发现我们需要的web service呢? 这时就要用到UDDI了。
- UDDI 是一个独立于平台的框架,用于通过使用 Internet 来描述服务,发现企业,并对企业服务进行集成。
- UDDI 指的是通用描述、发现与集成服务
- UDDI 是一种用于存储有关 web services 的信息的目录。
- UDDI 是一种由 WSDL 描述的 web services 界面的目录。
- UDDI 经由 SOAP 进行通信
- UDDI 被构建入了微软的 .NET 平台
UDDI可以帮助web服务器提供商在互联网上发布web service的信息,UDDI是一种目录服务,企业可以通过UDDI来注册和搜索web services。
通过前面的介绍可以知道: SOAP、WSDL和UDDI构成了web service的三要素。
Web Service体系结构
体系结构包括了webservice提供者、webservice中介、webservice请求者,这三者就对应了三个动作发布、绑定、查找。
webservice提供者:即发布webservice,等待其他的服务或应用程序访问自己。
webservice请求者:即通过SOAP消息向webservice提供者发送请求以获得服务。
webservice中介:即通过代理,把一个webservice请求者和一个webservice提供者联系在一起,通过UDDI实现。
总结:
web service和http是可以互相替代的,但是web service也有一些自身的优点,比如接口中实现的方法和要求参数一目了然、不用担心大小写问题、不用担心中文Urlencode问题、传递参数可以是数组对象等。