Web Service:MS在2000年創造了Web Service這個詞,它描述的是容許計算機網絡(互聯網是典型,但不侷限與此)相互通訊的一套標準,其核心之一是可擴展標記語言(XML),另外一個則是HTTP。web
5個基礎標準(其中有兩個是早就有了的通用標準,他們被用來實現Web Service方法,另外3個是專門用於Web Service的):安全
1. XML 用來描述模型,格式和數據類型的通用格式,其餘大多數標準都是用XML來表達的標準。網絡
2. HTTP(HTTPS),互聯網底層協議。HTTP(S)是運用了互聯網技術,經過網絡發送Web Service的可能的協議之一。app
3. WSDL(Web Services Description Language):用來定義服務接口。描述服務的兩個方面:服務的簽名(名字和參數),以及服務的綁定和部署細節(協議和位置)。函數
4. SOAP是Web Service交換數據所準尋的協議。ui
5. UDDI,管理Web Service的標準(註冊和找到服務)spa
一般來講,使用WSDL標準是Web Service的關鍵特性,其餘都是可選的。例如,不必定非得使用SOAP和HTTP萊發送服務請求,也可使用其餘協議而仍然算在使用Web Service。另外,UDDI扮演補充的角色,實際中也不用。計算機網絡
WSDL:rest
怎樣向別人介紹你的Web service有什麼功能,以及每一個函數調用時的參數呢?這就是WSDL。 WSDL標準有不一樣的版本,主要講WSDL1.1和WSDL2.0。相比較於1.1,2.0主要有:xml
WSDL文件自底向上描述服務。也就是說,它們從用到的數據類型開始,道服務的位置(地址)結束。
<?xml version="1.0" encoding="utf-8" ?>
2 <definitions name="CustomerService"
3 targetNamespace="http://soa-in-practice.com/wsdl"
4 xmlns:tns="http://soa-in-practice.com/wsdl"
5 xmlns:xsd1="http://soa-in-practice.com/xsd"
6 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
7 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
8 xmlns="http://schemas.xmlsoap.org/wsdl/">
9
10 <types>
11 <xsd:schema
12 targetNamespace="http://soa-in-practice.com/xsd"
13 xmlns="http://soa-in-practice.com/xsd">
14
15 <xsd:element name="getCustomerAddress">
16 <xsd:complexType>
17 <xsd:sequence>
18 <xsd:element name="customerID" type="xsd:long"/>
19 </xsd:sequence>
20 </xsd:complexType>
21 </xsd:element>
22
23 <xsd:element name="getCustomerAddressResponse" type="Address"/>
24 <xsd:complexType name="Address">
25 <xsd:sequence>
26 <xsd:element name="street" type="xsd:string"/>
27 <xsd:element name="city" type="xsd:string"/>
28 <xsd:element name="zipCode" type="xsd:string"/>
29 </xsd:sequence>
30 </xsd:complexType>
31
32 </xsd:schema>
33 </types>
34
35 <message name="getCustomerAddressInput">
36 <part name="params" element="xsd1:getCustomerAddress"/>
37 </message>
38 <message name="getCustomerAddressOutput">
39 <part name="params" element="xsd1:getCustomerAddressResponse"/>
40 </message>
41
42 <portType name="CustomerInterface" >
43 <operation name="getCustomerAddress">
44 <input message="tns:getCustomerAddressInput" name=" getCustomerAddressInput"/>
45 <output message="tns:getCustomerAddressOutput" name=" getCustomerAddressOutput "/>
46 </operation>
47 </portType>
48
49 <binding name="CustomerSOAPBinding"
50 type="tns:CustomerInterface" >
51 <soap:binding style="document"
52 transport="http://schemas.xmlsoap.org/soap/http" />
53 <operation name="getCustomerAddress">
54 <soap:operation
55 soapAction="http://soa-in-practice.com/getCustomerAddress" />
56 <input name=" getCustomerAddressInput ">
57 <soap:body use="literal" />
58 </input>
59 <output name=" getCustomerAddressOutput ">
60 <soap:body use="literal" />
61 </output>
62 </operation>
63 </binding>
64
65 <service name="CustomerService" >
66 <port name="CustomerPort"
67 binding="tns:CustomerSOAPBinding">
68 <soap:address
69 location="http://soa-in-practice.com/customer11"/>
70 </port>
71 </service>
72
73 </definitions>
l 最後的service定義了一個名爲CustomerService的服務,該服務能夠從http://soa-in-practice.com/customer11獲得,與其一同提供的有被稱爲CustomerSOAPBinding的綁定。前綴tns是能夠找到這個綁定標示符細節的命名空間,能夠在最前面找到。
l Binding定義了用來提供服務的協議和格式。這裏咱們能夠看到CustomerSOAPBinding的定義。指定用於CustomerInterface的接口類型。這個綁定是基於底層HTTP協議的SOAP綁定,這裏的風格爲document/ literal
l portType定義了接口CustomerInterface的接口。它包含一個叫getCustomerAddress的操做,指明瞭當操做被調用時候,服務總線發送的消息。它發送一個請求,收到一個應答(牽涉到消息交換格式)。這經過一個輸入消息getCustomerAddressInput,以及一個輸出消息getCustomerAddressOutput來定義。
l message定義了各個消息,使用的是portType節引用的標示符。不論是getCustomerAddressInput仍是getCustomerAddressOutput,都是用了在<types>節中定義的數據類型。
l types定義了將會使用的數據類型:輸入參數customerID的類型是long,輸出參數address的類型是有3個字符串屬性的結構記錄。全部類型在本身的命名空間wsdl中。
版本2.0對應的WSDL文件:
1 <?xml version="1.0" encoding="utf-8" ?>
2 <description
3 targetNamespace="http://soa-in-practice.com/wsdl"
4 xmlns:tns="http://soa-in-practice.com/wsdl"
5 xmlns:xsd1="http://soa-in-practice.com/xsd"
6 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
7 xmlns:wsoap="http://www.w3.org/2006/01/wsdl/soap"
8 xmlns:wsdlx="http://www.w3.org/2006/01/wsdl-extensions"
9 xmlns="http://www.w3.org/2006/01/wsdl">
10
11 <types>
12 <xsd:schema
13 targetNamespace="http://soa-in-practice.com/xsd"
14 xmlns="http://soa-in-practice.com/xsd">
15
16 <xsd:element name="getCustomerAddress">
17 <xsd:complexType>
18 <xsd:sequence>
19 <xsd:element name="customerID" type="xsd:long"/>
20 </xsd:sequence>
21 </xsd:complexType>
22 </xsd:element>
23
24 <xsd:element name="getCustomerAddressResponse" type="Address"/>
25 <xsd:complexType name="Address">
26 <xsd:sequence>
27 <xsd:element name="street" type="xsd:string"/>
28 <xsd:element name="city" type="xsd:string"/>
29 <xsd:element name="zipCode" type="xsd:string"/>
30 </xsd:sequence>
31 </xsd:complexType>
32
33 </xsd:schema>
34 </types>
35
36 <interface name = "CustomerInterface" >
37
38 <operation name="getCustomerAddress"
39 pattern="http://www.w3.org/2006/01/wsdl/in-out"
40 style="http://www.w3.org/2006/01/wsdl/style/iri"
41 wsdlx:safe = "true">
42 <input messageLabel="In"
43 element="xsd1:getCustomerAddress" />
44 <output messageLabel="Out"
45 element="xsd1:getCustomerAddressResponse" />
46 </operation>
47
48 </interface>
49
50 <binding name="CustomerSOAPBinding"
51 interface="tns:CustomerInterface"
52 type="http://www.w3.org/2006/01/wsdl/soap"
53 wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP">
54
55 <operation ref="tns:getCustomerAddress"
56 wsoap:mep="http://www.w3.org/2003/05/soap/mep/soap-response"/>
57
58 </binding>
59
60 <service name="CustomerService"
61 interface="tns:CustomerInterface">
62
63 <endpoint name="CustomerEndpoint"
64 binding="tns:CustomerSOAPBinding"
65 address="http://soa-in-practice.com/customer20"/>
66
67 </service>
68
69 </description>
主要區別是:
1. XML跟元素的名字是description
2. service節是用的是endpoint而非port
3. 在binding節內,定義了SOAP1.2
4. portType被interface取代,是用了根具體,定義了底層消息順序的消息交換模式
5. message節點沒有了,操做世界引用數據類型,定義在types中,發送那個消息遵循interface節中指定的類型和消息交換模式
6. 用不一樣的命名空間來標識WSDL2.0和SOAP1.2
SOAP
SOAP最初是「簡單對象訪問協議」的首字母縮寫詞,後來開發者發現SOAP既不簡單,也不處理對象訪問,從1.2版本開始,這個縮寫詞就被當作一個詞使用,再也不表明一種縮寫了。
根據上面的例子。其SOAP請求的一個例子,以下:
<?xml version='1.0' ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
...
</soap:Header>
<soap:Body>
<getCustomerAddress xmlns="http://soa-in-practice.com/xsd">
<customerID>12345678</customerID>
</getCustomerAddress >
</soap:Body>
</soap:Envelope>
一個相應的應答消息以下:
<?xml version='1.0' ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
...
</soap:Header>
<soap:Body>
<getCustomerAddressResponse xmlns="http://soa-in-practice.com/xsd">
<address>
<street>Gaussstr. 29</street>
<city>Braunschweig</city>
<zipCode>D-38106</zipCode>
</address>
</getCustomerAddressResponse>
</soap:Body>
</soap:Envelope>
能夠看到,SOAP消息格式爲XML,包含一個被稱爲Envelope的跟元素。跟元素包含一個可選的Header和必備的Body元素。Body元素包含有效載荷(請求、回覆、或者錯誤數據),Header包含額外的,幫助基礎設施處理消息的信息(如路由提示,安全提示等)。
UDDI
「通用描述,發現和集成UDDI」最初是更寬泛的術語,「通用描述、發現和集成業務註冊中心」。最初的想法是,引入一個有效的市場包含的所有3個角色:提供服務的供應者,須要服務的消費者,以及經過廣告和定位服務的兩方撮合道一塊兒的中間人。這就產生了解釋Web Services一般要展現的著名三角形:
Web Service其餘相關的標準:
Web Service的第一個問題是,它不是一個由單個組織定義的標準。由超過50個不一樣的Web Service規範,分別由三家不一樣的標準化組織制定,W3C,OASIS,WS-I。
即時對於前面的5個基礎標準,一直以來,達到互操做性的目標也很困難。即時選擇了同一版本,規範也太粗糙,太寬泛。因而,在2002年,WS互操做性組織(WS-I)成立。
WS-I的同樣重要東西就是「配套資料」,它是一套已經定義了的標準,每個標準都制定了特定的版本。
總結:
l Web Service是SOA基礎設施(ESB)事實上的標準
l 基於XML和HTTP這兩個協議,最重要的是用於描述Web Service接口的WSDL,以及用於規定Web Service通訊協議格式的SOAP。
l WSDL文件將不一樣的層用於服務接口,綁定和部署細節,所以,一般須要適當的過程來處理WSDL文件的生命週期。
l WSDL並無綁定在SOAP上,可使用其餘綁定,因此接口描述在原則上能和任何技術一塊兒使用
l 做爲一個標準,WSDL只定義了互操做性的核心特性,沒有提供按去啊你選哪一個、SLA等附加特性,這些也行能夠由其餘標準提供。
l 不一樣的標準化組織規定可許多不一樣的Web Service標準,各標準也有許多不一樣的版本,所以,互操做成爲一個問題。Web Service互操做性組織(WS-I)試圖解決這個問題,其方法爲針對某些標準的集合提供各類配套資料
l 在實踐中,爲了互操做,一般應該使用WS-I基本配套資料和SOAP document/literal wrapped綁定