1、自描述是服务的基本特征。通过自描述,作为开放网络构件的服务以编程语言无关的方式对外公布其调用接口和其他相关特征。
2、通过服务描述,服务屏蔽了其实现细节,使服务提供者和服务消费者能以一种松耦合的方式协作。对服务最基本的描述是接口描述,服务消费者只有获得接口描述才能向服务发送正确的调用信息;服务的通信协议、访问地址、发送给服务的消息格式约定也是访问服务之前必须获得的信息。
3、服务描述模型(3C模型)
a. 概念(Concept):是对构件(服务)做什么(what)的抽象描述,可以通过构件的概念了解构件(服务)的功能。包括接口规范和语义两方面。对应WEB服务描述语言(WSDL)。
b. 内容(Content):是对概念具体实现的描述,描述构件(服务)如何完成概念所刻画的功能。对应WEB服务组合语言(如BPEL4WS)
c. 上下文(Context):是构件(服务)和构件(服务)执行环境之间的关系。对应WEB服务策略、协作、安全、事务等语言。
4、WSDL概述
WSDL描述了WEB服务的接口、消息格式约定和访问地址三方面的基本内容。
WSDL采用XML Schema界定应该包含的内容,并以XML格式存储。
WSDL将WEB服务描述为能够进行消息交换的通信端点的集合。
服务消费者通过服务提供者所提供的WSDL文档,获取服务执行的相关信息,并基于该信息访问服务。
WSDL的职责就是告诉服务消费者如何将请求消息格式化,通过何种通信协议在何处访问WEB服务。
在典型的SOA协作模式中:服务提供者在服务注册中心注册所提供的服务,WSDL文档所包含的信息部分被映射到服务注册中心以便服务请求者查询;服务请求者通过服务注册中心来查找和发现自己所需的服务,从中得到所需服务的WSDL访问地址;服务使用者得到WSDL文件后通过WSDL文件所描述的接口规约、消息格式规范、通信协议规范以及访问地址来完成对服务的调用。
5、WSDL结构
|----------------------------------|
| 类型 (types) | -->抽象部分(Abstract Part)
|--------------------------------- |
| 消息 (message) |
|----------------------------------|
| 操作 (operation) |
|----------------------------------|
| 端口类型 (port type) |
|----------------------------------|
| 服务绑定 (bindings ) | -->具体部分(Concrete part)
|----------------------------------|
| 端口和服务(port and Services) |
|----------------------------------|
WSDL文件的基本表示形式:
----------------------------------------------------
<definitions name="MyService"
targetNamespace="http://example.org/math/"
xmlns="http://schema.xmlsoap.org/wsdl/">
<!--抽象描述部分-->
<types> ... </types>
<message>...</message>
<message>...</message>
....
<portType>...</portType>
<!--具体描述部分-->
<binding>...</binding>
<service>...</service>
</definitions>
----------------------------------------------------
抽象描述部分
a. 类型(types):数据类型的容器,包含了所有消息定义所需的XML元素的类型定义。定义消息交互过程中所用到的数据类型。如:
---------------------------------------------------------
<!-- 类型定义 -->
<types>
<xs:Schema ....>
<!--利用XML schema定义的消息的数据类型 -->
....
</xs:Schema>
</types>
---------------------------------------------------------
b. 消息(messages):具体定义了通信中使用的消息的数据结构。消息建立在类型之上,消息包含一组分部(Parts),每个分部有一个名字和数据类型组成。如:
---------------------------------------------------------
<!-- 消息定义 -->
<message name="AddMessage">
<!-- "MathInput"为在类型定义中定义的数据类型的名称 -->
<part name="parameter" type="ns:MathInput" />
<!-- 或
<part name="parameter" element="ns:Add" />
其中Add为在类型定义中定义的元素的名称
-->
</message>
<message name="AddResponseMessage">
<part name="parameter" type="ns:MathOutput" />
</message>
-----------------------------------------------------------------
c. 操作 (Operation):代表具体的消息访问接口。有4种消息交换模式:
c.1 单向消息(One-Way):服务方单方面接收消息,无须返回任何响应。
c.2 请求/响应模式(Request-Response)
c.3 要求响应模式(Solicit_Response)
c.4 通知模式(Notification) 如:
-----------------------------------------------------------------
<!-- 操作 -->
<operation name="Add">
<input message="y:AddMessage"/>
<output message="y:AddResponseMessage"/>
</operation>
<operation>...</operation>
-----------------------------------------------------------------
d. 端口类型(portType):对操作进行逻辑分组,即将逻辑上相关的操作分组,以表示一个特定类型的接口。如:
-----------------------------------------------------------------
<!-- 端口类型 -->
<portType name="MathInterface">
<operation name="Add">
<input message="y:AddMessage"/>
<output message="y:AddResponseMessage" />
</operation>
<operation name="Subtract">
<input message="y:SubtractMessage"/>
<output message="y:SubtractResponseMessage"/>
</operation>
</portType>
-----------------------------------------------------------------
具体描述部分
a. 绑定(binding):为一个端口类型定义了四方面的内容:消息传输协议、网络传输协议、消息风格、编码规则。
a.1 消息传输协议确定了消息的封装格式,如SOAP。
a.2 网络传输协议确定了网络传输时所采用的网络协议,如HTTP或SMTP
a.3 消息风格确定是采用SOAP/RPC消息风格还是SOAP/document消息风格
a.4 编码规则定义了把消息的各个部分序列化为XML文档是所采用的编码规则:字面的(literal)还是SOAP的。字面编码规则直接使用types元素或者XML Schema定义的类型来表示消息内容;而SOAP编码规则需要把用XML Schema定义的类型根据SOAP规范定义的编码规则转换后填充为消息内容。字面编码用于文档风格的操作,而SOAP编码规则适合于RPC风格的操作。如:
<!-- 绑定 -->
<binding name="MathSoapHttpBinding" type="y:MathInterface">
<soap: binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="Add">
<soap:operation
soapAction="http://example.org/math/#Add"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation ...> ....
</operation>
...
</binding>
说明:
binding的type属性指定了绑定关联的端口类型;
soap:binding项表明这是一个SOAP绑定,即采用的消息传输协议为SOAP;同时style属性表明了消息风格是document,即通信双方传递的是一个XML片段;transport属性指定所使用的传输协议是HTTP;
soap:operation为每个操作定义了传输过程中HTTP包头的SOAPAction值,以指定SOAP服务器接收到消息后采取的动作,通常是获取一个调用服务实现的方法名字。
soap:body定义了消息内容在SOAP消息中的表现形式。如:literal或者encoded.
b. 端口(port):也称为端点(end point)。端口将接口绑定和一个具体的网络地址(表现为URI)对应,从而可以通过该网络地址访问绑定对应的端口类型(接口)。如:
---------------------------------------------------------------
<port name="MathEndPoint" binding="y:MathSoapHttpBinding">
<soap:address location="http://localhost/math/math"/>
</port>
----------------------------------------------------------------
c. 服务(service):服务是端口的逻辑分组。一人特定的WSDL服务可以与多个不同的URI关联,同时也可和不同的端口类型关联。服务可按照不同的分类标准对端口进行分类。服务从定义上表现为端口的集合。如:
----------------------------------------------------------------
<service name="MathService">
<port name="MathEndPoint" binding="y:MathSoapHttpBinding">
<soap:address location="http://localhost/math/math"/>
</port>
</service>
----------------------------------------------------------------
W3C的WEB服务描述工作组(WSDWG)界定了WSDL描述的三种潜在用途:
a. 作为传统的服务描述语言:可作为WEB服务的实现规范,该规范限定了服务之间采用什么样的方式进行交互;限定了服务在交互过程中需要传输什么数据,期望返回什么数据;服务包含哪些操作;激活服务需要什么样的传输协议
b.作为WSDL编译器的输入:生成存根程序(stub)
c. 捕捉WEB服务的语义