第十一章分布式應用程式
使用網絡的應用程式,稱為分布式應用程式(distributed applications),現在,已經越來越重要。幸運的是,.NETBCL 和其他的庫提供了許多結構,使得通過網絡通信變得容易,進而,用 F# 建立分布式應用程式也是很簡單。
網絡概述
已有幾類分布式應用程式,通常分為:用戶端-伺服器(client-server)應用程式,其中用戶端向中央伺服器的請求;點對點應(peer-to-peer)用程式,薩滿教這裡,計算機之間互相交換資料。這一章,我們将重點學習用戶端-伺服器應用程式,由于這是目前更常見的。
不管你想建立哪種分布式應用程式,計算機之間的資料交換都是由協定控制的。協定(protocol)是一種标準,定義了通過網絡進行通信的規則。
建構網絡應用程式通常考慮的一項最具挑戰性的任務,程式員有好的理由才可以執行。當建立應用程式時,必須考慮三個重要需求:
可伸縮性(Scalability):應用程式被許多使用者并行使用時,必須保持響應。通常,這就需要廣泛地測試與分析伺服器代碼,保證能在高負載下的執行。
容錯(Fault tolerance):網絡本來就不可靠,是以,寫的代碼不應該假定網絡永遠是好的;如果你這樣做了,應用程式對于最終使用者來說可能是令人沮喪的。每個應用程式都應盡力保證通信錯誤能夠順利處理,給使用者适當的回報,顯示出錯資訊,也可提供診斷和重試的機會,不要因為網絡故障而使應用程式崩潰;還應該考慮資料的一緻性(即,能夠保證所有必須的更新在到達目标計算機時保持資料一緻嗎?),使用事務(transactions)和關系型資料庫存儲資料可以幫助做到這一點。根據應用程式的類型不同,也可以考慮種離線模式,為使用者提供通路本地資料的能力,當網絡以後可用時,再響應網絡請求。是大多數的電子郵件的用戶端都提供了這種離線模式。
安全(Security):每個應用程式都有安全的問題,但是,在網絡程式設計中安全極其重要。這是因為,一理把應用程式公開到網絡上,也就開放了,網絡上的所有使用者可以攻擊;是以,如果應用程式公開到互聯崗上,就會有數千甚至上百萬的潛在攻擊者。通常,需要考慮的包括,需要跨網絡傳輸的資料安全,簽名保證它不被篡改,或者加密確定隻有适當的人可以讀;也要保證連接配接到應用程式的人經過認證和授權,知道他是誰,想做什麼。
幸運的是,現代程式員不需要自己動手,而是由網絡協定幫助解決這些問題。例如,如果我們想發送的資料很重要,不希望網絡其他人讀取,我們并不需要自己來加密資料,相反,應使用網絡協定提供的功能。這些協定以庫中的元件形式公開,為我們實作了這些功能。協定的類型、使用的庫,由應用程式的需求決定。有些協定提供了加密和認證,而有些則沒有;有些是用于用戶端伺服器應用程式,而有些适用于點對點應用程式。在這一章,我們将學習下面的元件和庫,以及它們所實作的協定:
TCP/IP 套接字(sockets:):為應用程式(用戶端伺服器、點對點)提供了大量的網絡傳遞控制;
HTTP/HTTPS 請求:支援網頁向伺服器的請求,通常隻為用戶端伺服器應用程式;
網站服務:公開應用程式,使其他應用程式可以請求服務,通常隻為用戶端伺服器應用程式;
Windows 通信基礎(WindowsCommunication Foundation,WCF):擴充網站服務,為現代程式員提供更多功能支援,包括但不限于,安全性、事務,同時為用戶端伺服器、點對點應用程式。
這些協定是彼此相接的,TCP/IP 是最低層的程式設計接口(API),Windows 通信基礎是最高層的程式設計接口,網站服務是獨立于Windows 通信基礎的,但是,由于Windows 通信基礎也實作了網站協定,是以,可以認為網絡服務是Windows 通信基礎的子集。圖 11-1 是這些協定彼此關系的概覽。
圖 11-1 .NET 網絡程式設計應用程式接口概覽
[ 這個圖也太寒碜了,可能是從視訊上截下來的吧 ]
盡管分布式程式設計天生具有挑戰,不這,通常還是值得學習的,因為它可能夠通路我們感興趣的資料,與其他人共享我們程式的結果。到本章結束,我們就能寫出這樣的程式,包括用戶端伺服器式聊天程式,讀 RSS(稱為簡易資訊聚合,或聚合内容)訂閱,通路儲存在谷歌電子表格中的資料,在推特(Twitter)上找出所有的朋友,以及建立網站服務和Windows 通信基礎服務。
在網絡上提供使用者界面的簡單方法是開發網站應用程式,網站應用程式不在這裡讨論,可以參考第八章的“ASP.NET”一節。