《什么是SOA》中可以看到松耦合對于SOA架構的意義,SOA架構最求的就是將原來(lái)一個(gè)超級大型的系統裁剪,減少依賴(lài),減少相互之間的影響,簡(jiǎn)單的說(shuō)就是增強靈活性:增強接需求的靈活性,增強修改bug的靈活性,SOA架構最求的就是這個(gè),當然這并不是說(shuō)引入了一個(gè)SOA框架,比如WCF,或者一種服務(wù)調用框架,hsf,就可以實(shí)現這個(gè)目標了,這還是和你的服務(wù)劃分的方式,部門(mén)之間的協(xié)作程度,一些技術(shù)點(diǎn)的抉擇有關(guān)。
下面講一下一些技術(shù)點(diǎn)里的耦合聯(lián)系:
| | 緊耦合 | 松耦合 |
| 物理連接 | 點(diǎn)對點(diǎn) | 通過(guò)中介者 |
| 通信風(fēng)格 | 同步 | 異步 |
| 數據模型 | 公共復雜類(lèi)型 | 只是簡(jiǎn)單的公共類(lèi)型 |
| 類(lèi)型系統 | 強 | 弱 |
| 交互模式 | 通過(guò)復雜的對象樹(shù)導航 | 以數據為中心、自足的消息 |
| 業(yè)務(wù)邏輯控制 | 集中控制 | 分布式控制 |
| 綁定方式 | 靜態(tài) | 動(dòng)態(tài) |
| 平臺 | 強平臺依賴(lài) | 平臺無(wú)關(guān) |
| 事務(wù)性 | 2PC(兩階段提交) | 補償 |
| 部署 | 同時(shí)進(jìn)行 | 非同時(shí)進(jìn)行 |
| 版本劃分 | 顯示升級 | 隱式升級 |
1.物理連接,在WCF中使用,直接使用添加引用的方式,其實(shí)就是點(diǎn)對點(diǎn)的連接,服務(wù)端關(guān)閉的時(shí)候就會(huì )調用失敗,包括hsf服務(wù),有時(shí)候也要配置地址,這也是緊耦合的,另外hsf還可以通過(guò)configserver去獲取,消費者可以通過(guò)服務(wù)名(標簽或者符號)來(lái)標識要訪(fǎng)問(wèn)的服務(wù),雖然還是點(diǎn)對點(diǎn)的,但是已經(jīng)實(shí)現了間接性(要做適當緩存,避免每次詢(xún)問(wèn)地址,影響性能)。這實(shí)際上就是通過(guò)中介者,這相對來(lái)說(shuō)可以更加松耦合。它可以同時(shí)在里面做負載平衡和是失效備援,這屬于那種在出發(fā)之前就告訴你正確的服務(wù)端點(diǎn),這要求消費者端只能一點(diǎn),比如配置一個(gè)ConfigServer。另外,還可以讓每個(gè)服務(wù)做到動(dòng)態(tài)提供,在啟動(dòng)或者運行時(shí),每個(gè)供應者注冊自己。
除了connfigServer,還可以提供一種攔截器的方式,或者叫做代理,每個(gè)請求都請求道一個(gè)七負載均衡作用的硬件或者軟件,消費者仍然使用一個(gè)正式的端點(diǎn),該端點(diǎn)再委派真正的任務(wù):當消息到達時(shí),負載均衡器把消息分發(fā)到自己所知的不同的物理服務(wù)供應者上。
更復雜一些的ESB方法為每個(gè)供應者和消費者提供一個(gè)攔截器代理,消費者只與正對自己的特定攔截器進(jìn)行“點(diǎn)對點(diǎn)“方式的通信。
Web Service天生就是一種點(diǎn)對點(diǎn)的協(xié)議,沒(méi)有包含對負載均衡和失效備援的規定。這兩個(gè)仍然是大型分布式系統的核心需求,因此,每個(gè)基于Web Service的ESB遲早都要把攔截器結合進(jìn)去。
2.通信風(fēng)格,異步通信意味著(zhù)消息的發(fā)送和消息的接收者沒(méi)有同步,這好比電子郵件。這里發(fā)送者面對的而一個(gè)難題就是需要一個(gè)答復,可以這并不是馬上就能獲得答復,這樣,當應答到來(lái)的時(shí)候,必須把答復和最初的請求關(guān)聯(lián)起來(lái)(例如,通過(guò)處理類(lèi)似ID的東西);另外,處理答復的時(shí)候看,可能需要最初請求的時(shí)候的初始狀態(tài)和上下文環(huán)境;還有,大量的異步請求發(fā)出的時(shí)候,收到應答的順序可能不同發(fā)出的順序,調試的時(shí)候可能非常悲??;這樣引入異步處理的邏輯變得這么復雜。
《ESB的消息交換》
3.數據類(lèi)型,.NET中有DataTable類(lèi)型,結合一些控件使用,非常方便,但是在使用WCF的時(shí)候,如果將它作為返回類(lèi)型,那么將會(huì )散失互操作性,java中并不能引用到解釋這種類(lèi)型,這就是緊耦合。
雖然搞一個(gè)簡(jiǎn)單的數據類(lèi)型是最好的,但是在一個(gè)大型的系統中,最求完美的一致性可能是一種災難,會(huì )讓你的工作停步不前;另外,在大型組織中,人們就是無(wú)法一致化意見(jiàn),各個(gè)子系統的所有者有不同的利益,達成一致意見(jiàn)很難;另外不斷變化的需求業(yè)務(wù),也會(huì )使得模型改變。
在大型的系統中,數據類(lèi)型如果沒(méi)有一致化,那你可能需要一種適合你的“數據映射”,雖然增加了一點(diǎn)復雜性,但是這是一種解耦,應該避免直接依賴(lài)供應者提供的數據類(lèi)型;另外不采用一致的數據模型,那么你的修改不會(huì )對其他系統直接造成影響。
4補償
為了保持狀態(tài)同步,可以使用稱(chēng)為2PC,兩階段提交的技術(shù)創(chuàng )建一個(gè)公共的事務(wù)上下文環(huán)境,最后執行成功的話(huà),提交執行在兩個(gè)系統,這可能是作為一個(gè)中間件的重要特性,這可能會(huì )造成死鎖和延遲,并且在多個(gè)異質(zhì)的平臺上實(shí)現這個(gè),會(huì )有很多技術(shù)上的復雜性。補償可能是一種更加松耦合的方式。BPEL直接支持補償。
聯(lián)系客服