發個廣告:周末有想一起鍛煉身體的兄弟,可與我聯絡,最好住在回龍觀或者西三旗附近,大家可以搭伴去打籃球,乒乓球或者遊泳。 本人連絡方式:Msn:jillzhang@126.com qq:183317744 |
前面的文章中介紹過wse有路由的功能,它能像路由器一樣,將soap訊息動態路由到指定的目的地,有關wse實現路由的功能描述,請查看:WSE 3.0 文檔翻譯:路由。
下面主要通過項目執行個體來具體闡述如何?wse路由和一些項目開發中的細節。本人水平有限,有不對的地方,請朋友們不吝賜教。
在開始項目之前,先瞭解一下路由的概念,所謂"路由",是指把資料從一個地方傳送到另一個地方的行為和動作,它通常包括兩種行為:選擇最佳路徑和通過網路交換資料。我們平時使用的路由器就是為了此項功能而產生的機器。那麼wse為何要具備路由的功能呢?這個必須是我們首先要弄明白的問題。
對SOA不瞭解或者沒有相關開發和營運經驗的朋友可能體會不出wse為何要有路由功能的理由,從表面看來,完全沒必要嘛!用戶端指定一個服務端,雙方交換資料就可以了!非也,在SOA中,要面對的往往是部門與部門之間,企業與企業之間,機構與機構之間的系統協作問題,此時如果提供服務的一方出現維修問題,會影響到很多用戶端,而這些用戶端可能分布在不同的個人或者機構中,中間一些協調和溝通問題會很快讓你進入hell,而有些用戶端系統對於系統的穩定性要求極高。所以如果服務端不做傷筋動骨的改動,應該盡最大可能保持用戶端的正常運行。Wse的路由功能就是為瞭解決此類問題的方案之一。一句話它能夠使服務端能夠在對服務進行維護的時候,經過簡單的配置,改變soap訊息的原有路由,從而保證用戶端的穩定運行。
要實現wse的路由功能,有兩種手段:第一是通過設定檔,這個設定檔在wse架構中被稱為referral cache.另外一種是基於soap訊息內容來實現。本文首先解決如何通過設定檔來實現wse路由。
實現wse路由,需要兩個大的步驟:
- 準備一台路由伺服器(以後我們稱之為R),並對其進行配置
- 配置一個Referral Cache,這個檔案定義了soap訊息的路由資訊
我們通過以下情景來實現項目示範:目前我們存在一個服務,所在伺服器為S1,因為路由對用戶端沒有影響,所以我們只類比一個用戶端,伺服器為C,我們目前的路由情況如所示:
首先我們看一下使用了路由的網路服務,路由,和用戶端程式的特點。
網路服務:使用了路由的網路服務必須接受來源於路由伺服器R的請求,因此需指定網路服務的SoapActor Attribute,為路由的URL或者接受所有的來源。有關SoapActor的描述如下:一個SOAP訊息從始節點到終節點的過程中,可能沿著訊息路徑經過一系列SOAP中間節點。一個SOAP中間節點是一個可以接收轉寄SOAP訊息的應用程式。中間節點和終節點由URI區分。可能SOAP訊息的終節點並不需要所有部分,而在訊息路徑上的一個和幾個中間節點可能需要這些內容。頭元素的接收者扮演的角色類似於一個過濾器,防止這些只發給本接受者的訊息部分擴散到其它節點。即一個頭元素的接收者必須不轉寄這些頭元素到SOAP訊息路徑上的下一個應用程式。同樣的,接收者可能插入一個相似的頭元素。SOAP actor全域屬性可以用於指示頭元素的接收者。SOAP actor屬性的值是一個URI。省略SOAP actor屬性工作表示接收者是SOAP訊息的終節點
對網路服務的建立和設計需要注意的地方如:
除了此處,網路服務和其他的使用wse3.0的服務,沒有區別。
再看一下路由,路由程式是一個非常特殊的程式,他可以沒有任何程式,只包含兩個設定檔,這裡主要講述一下如何設定這兩個設定檔
- 首先我們先對建立的路由網站做wse設定,可以採用wse與vs2005的整合工具。如所示:
這樣就添加了對Microsoft.Web.Services3的引用,需要注意的是,web.config中添加引用的部分必須類似如下
因為這個項目沒有bin目錄,當然如果您打可sp1的補丁,添加引用後,bin目錄會有相關dll,是不需要如所示的。我這裡建立的是網站,所以必須如此,因為沒有這個網站將無法使用wse,也就無法實現路由的功能了。
對路由網站的設定還包括如下操作,它為web.config添加了一個HttpHandler,用於處理http請求,您可以自訂HttpHandler,也可以使用wse3.0預設提供的Microsoft.Web.Services3.Messaging.SoapHttpRouter,添加方法如下:
點擊確定後
經過上面的操作,會在web.config添加如下的代碼:
您也可以手動添加。
- 建立一個referral cache檔案,在裡面寫路由配置,如下:
下面說明一下各個節點的意義:
<r:referrals>節點是根節點。在一個設定檔中有且只有一個。
<r:ref>節點用於標識一個特定的路由配置,在一個設定檔中可有可無,也可以是多個
<r:for>節點用於指示來源訊息的部分資訊
<r:exact>節點用於指定一個來源資訊的詳細資料,一個<r:for>必須包含一個<r:exact>或者<r:prefix>
<r:if>節點指定路由的條件,一個<r:for>必須有一個<r:if>
<r:go>節點指示重新導向的一些資訊,一個<r:ref>一個<r:go>
<r:via>節點指示訊息重新導向到的url地址,一個<r:go>至少一個<r:via>
<r:refId>節點指示路由配置的唯一標識
設定好referral cache後,需要做如下的設定:
點擊確定後,在web.config添加如下代碼:
部署路由網站的時候,一定要注意要對referral cache給網路使用者(IIS6.0中是network service)設定檔案寫入權限,這個是必須的,不要忘記。
對於用戶端而言,和其他用戶端沒有區別,只是將訊息的發送地址設定為路由地址。設定方式如下:
此時,啟動用戶端程式,便可以出現如所示的結果:
表明如第一張圖中所示的三個部分都已經正常工作了。
下面類比一下路由的優點,當運行網路的伺服器S1需要維修或者系統需要升級的時候,我們可以按照以下的步驟來進行操作:
第一步:準備好一個待命伺服器S2,將S2上部署一個和S1上一樣的環境,並部署網路服務程式。
第二步:準備另外一個referral cache設定檔,將其中的<r:go>中的資訊更改為S2上服務的Url地址。
第三部:用新的referral cache檔案替換路由伺服器R上的referral cache
經過這三步,用戶端可以沒有任何的改動和影響。訊息可以照常發送,但實際的接收方已經變為了S2.
運行用戶端,我們有得到了我們期待的結果
限於條件所限,本文中在一台機器中類比用戶端,路由,和服務端,下載到本地的程式需要更改url才能運行
還可以通過更改Soap訊息內容來實現此種功能,留作下一篇做闡述。
項目樣本:專案檔