posts - 14, comments - 1, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          什么是面向服務(wù)的體系結(jié)構(gòu)(SOA)?

          面向服務(wù)的 體系結(jié)構(gòu)(SOA)表示您可以如何使用 Web 服務(wù)的大圖景。Web 服務(wù)規(guī)范定義了實現(xiàn)服務(wù)以及與它們的交互所需要的細節(jié)。然而,面向服務(wù)的體系結(jié)構(gòu)(SOA)是一種用于構(gòu)建分布式系統(tǒng)的方法,采用 SOA 這種方法構(gòu)建的分布式應用程序可以將功能作為服務(wù)交付給終端用戶,也可以構(gòu)建其他的服務(wù)。面向服務(wù)的體系結(jié)構(gòu)(SOA)可以基于 Web 服務(wù),但是它可能改為使用其他的技術(shù)來代替。在使用面向服務(wù)的體系結(jié)構(gòu)(SOA)設(shè)計分布式應用程序時,您可以將 Web 服務(wù)的使用從簡單的客戶端-服務(wù)器模型擴展成任意復雜的系統(tǒng)。

          因而,單個的軟件資產(chǎn)成為開發(fā)其他應用程序的基本構(gòu)件。您可以通過與新的代碼 和遺留代碼一起使用的共同交互方式來減少系統(tǒng)的復雜性(CBDi 的 Lawrence Wilkes 開玩笑說,面向服務(wù)的體系結(jié)構(gòu)(SOA)可以代表“節(jié)省我們的資產(chǎn)(Save Our Assets)”)。有一種標準的方法可以用于表示這些軟件資產(chǎn)和與它們交互;現(xiàn)在人們關(guān)注的重點已經(jīng)轉(zhuǎn)移到基于這些構(gòu)件的應用程序裝配上來了。

          雖 然在這里討論的是用于業(yè)務(wù)應用程序的面向服務(wù)的體系結(jié)構(gòu)(SOA),但是面向服務(wù)的體系結(jié)構(gòu)(SOA)同樣也可以用于其他的分布式系統(tǒng),比如網(wǎng)格計算和高 級 Web 服務(wù)規(guī)范(例如,Web 服務(wù)分布式管理(WS-DistributedManagement)、Web 服務(wù)信任(WS-Trust)以及 UDDI)。

          什么是服務(wù)?

          在 面向服務(wù)的體系結(jié)構(gòu)(SOA)中,服務(wù)(service)是封裝成用于業(yè)務(wù)流程的可重用組件的應用程序函數(shù)。它提供信息或簡化業(yè)務(wù)數(shù)據(jù)從一個有效的、一致 的狀態(tài)向另一個狀態(tài)的轉(zhuǎn)變。用于實現(xiàn)特定服務(wù)的流程并不重要,只要它響應您的命令并為您的請求提供高質(zhì)量的服務(wù)就可以了。

          通過定義的通信協(xié) 議,可以調(diào)用服務(wù)來強調(diào)互操作性和位置透明性。一個服務(wù)表現(xiàn)為一個軟件組件,因為從服務(wù)請求者的角度來看,它看起來就像是一個自包含的函數(shù)。然而,實際 上,服務(wù)的實現(xiàn)可能包括在一個企業(yè)內(nèi)部的不同計算機上或者許多業(yè)務(wù)合作伙伴擁有的計算機上執(zhí)行的很多步驟。就封裝的軟件而言,服務(wù)可能是一個組件,也可能 不是一個組件。如同類對象,請求者應用程序能夠?qū)⒎?wù)看作是一個整體。

          Web 服務(wù)是以使用 SOAP 消息(它是用像 HTTP 這樣的標準協(xié)議上的 WSDL 來描述的)的調(diào)用為基礎(chǔ)的。使用 Web 服務(wù)的最佳實踐就是與外部的業(yè)務(wù)伙伴通信。

          松耦合

          服務(wù)請求者到服務(wù)提供者的綁定與服務(wù)之間應該是松耦合的。這就意味著,服務(wù)請求者不知道提供者實現(xiàn)的技術(shù)細節(jié),比如程序設(shè)計語言、部署平臺,等等。服務(wù)請求者往往通過消息調(diào)用操作——請求消息和響應——而不是通過使用 API 和文件格式。

          這 個松耦合使會話一端的軟件可以在不影響另一端的情況下發(fā)生改變,前提是消息模式保持不變。在一個極端的情況下,服務(wù)提供者可以將以前基于遺留代碼(例如, COBOL)的實現(xiàn)完全用基于 Java 語言的新代碼取代,同時又不對服務(wù)請求者造成任何影響。這種情況是真實的,只要新代碼支持相同的消息模式。

          明確定義的接口

          服務(wù)交互必須是明確定義的。Web 服務(wù)描述語言(Web services Description Language,WSDL)是受到廣泛支持的方法,用于描述服務(wù)請求者所要求的綁定到服務(wù)提供者的細節(jié)。服務(wù)描述的重點在于與下面幾部分交互所用的操作:

          服務(wù)
          調(diào)用操作的消息
          構(gòu)造這種消息的細節(jié)
          關(guān)于向何處發(fā)送用于構(gòu)造這種消息的處理細節(jié)的消息的信息
          WSDL 不包括服務(wù)實現(xiàn)的任何技術(shù)細節(jié)。服務(wù)請求者不知道也不關(guān)心服務(wù)究竟是由 Java 代碼、C#、COBOL,還是由某種其他的程序設(shè)計語言編寫的。它可以描述使用 HTTP 的 SOAP 調(diào)用。由于它的擴展機制,它也可以定義其他類型的交互,比如通過 JMS 提交的 XML 內(nèi)容、直接方法調(diào)用、由管理遺留代碼的適配器處理的調(diào)用(CICS),等等。

          WSDL 的通用定義允許開發(fā)工具創(chuàng)建各種各樣類型的交互的通過接口,同時隱藏它是如何由應用程序代碼調(diào)用服務(wù)的細節(jié)。例如,如果服務(wù)是以多種交互類型公開的, Web 服務(wù)調(diào)用框架(Web Services Invocation Framework,WSIF)通過允許運行時決定調(diào)用高質(zhì)量服務(wù)的最優(yōu)方法來使用這種能力。

          無狀態(tài)的服務(wù)設(shè)計

          服 務(wù)應該是獨立的、自包含的請求,在實現(xiàn)時它不需要從一個請求到另一個請求的信息或狀態(tài)。服務(wù)不應該依賴于其他服務(wù)的上下文和狀態(tài)。當需要依賴時,它們最好 定義成通用業(yè)務(wù)流程、函數(shù)和數(shù)據(jù)模型,而不是實現(xiàn)構(gòu)件(比如會話密鑰)。當然,請求者應用程序需要服務(wù)調(diào)用之間的持久狀態(tài),但是這不應該與服務(wù)提供者分 開。

          這里有一個定義會話的錯誤方法的示例:


          Requester: “What is Bruce’s checking account balance?"
          Provider: “$x"
          Requester: “And what is his credit limit?"
          Provider: “$y"
          ?

          提供者被要求記住請求之間 Bruce 的帳號,這就在服務(wù)實現(xiàn)中引入了復雜性。無狀態(tài)的服務(wù)設(shè)計將重新定義會話,如下所示:

          Requester: “What is Bruce’s checking account balance?"
          Provider: “$x"
          Requester: “What is Bruce’s credit limit?"
          Provider: “$y"
          ?

          服務(wù)粒度

          操 作的粒度是一項重要的設(shè)計要點。對于外部的消耗推薦使用粗粒度的接口,而細粒度的接口可能用于企業(yè)內(nèi)部。粗粒度接口可能是特定服務(wù)的完整處理,例如 SubmitPurchaseOrder,在這里消息包括定義訂購單所需的所有業(yè)務(wù)信息。細粒度接口可能具有用于以下方法的不同操作: CreateNewPurchaseOrder、SetShippingAddress、AddItem,等等。

          雖然細粒度的接口為請 求者應用程序提供了更多的靈活性,它同樣也意味著交互的模式可能隨著不同的服務(wù)請求者而不同。這可能使對于服務(wù)提供者的支持更加困難。粗粒度接口保證服務(wù) 請求者將以一致的方式使用服務(wù)。面向服務(wù)的體系結(jié)構(gòu)(SOA)不要求使用粗粒度接口,但是推薦使用它們作為外部集成的最佳實踐。服務(wù)編排可以用來創(chuàng)建運行 由細粒度操作組成的業(yè)務(wù)流程的粗粒度接口。

          服務(wù)質(zhì)量需要考慮的問題

          面 向服務(wù)的體系結(jié)構(gòu)(SOA)設(shè)計將跨越計算機系統(tǒng),并且還可能跨越企業(yè)邊界。您不得不考慮在使用 Internet 時安全性功能和需求以及如何鏈接伙伴的安全域。Internet 協(xié)議并不是為可靠性(有保證的提交和提交的順序)而設(shè)計,但是您不得不確保消息被提交并被處理一次。當這不可能時,請求者必須知道請求并沒有被處理。

          例如,您可能需要考慮您所部署服務(wù)的度量、可靠性以及響應時間,以便確保它們在承諾的范圍之內(nèi)。當您設(shè)計使用來自其他業(yè)務(wù)伙伴的服務(wù)的系統(tǒng)時,您就不得不考慮面向服務(wù)的管理來以協(xié)作方式管理伙伴之間的服務(wù)。

          主站蜘蛛池模板: 禹州市| 松桃| 西吉县| 紫阳县| 虹口区| 崇明县| 桐梓县| 常熟市| 阜南县| 双江| 林芝县| 清流县| 宜宾县| 巨鹿县| 临沂市| 澄城县| 临清市| 靖边县| 乌拉特中旗| 阜南县| 克东县| 桂平市| 金阳县| 巴南区| 敦煌市| 维西| 木里| 鄄城县| 南昌市| 拜泉县| 青海省| 六盘水市| 濉溪县| 融水| 清镇市| 沁源县| 会宁县| 垦利县| 华坪县| 霍州市| 茶陵县|