|
頭疼的Bug,糟糕的代碼,崩潰的調(diào)試作為開(kāi)發(fā)人員的你,遇到上述任何一種情況可能就會(huì)陷入抓狂。如果能直接獲得需要的代碼,編程的活兒就會(huì)輕松許多。
微軟最新推出的一站式示例代碼庫(kù),讓開(kāi)發(fā)人員可以免費(fèi)獲得所需的示例代碼或向微軟工程師提出示例請(qǐng)求,輕松解決常見(jiàn)的編程問(wèn)題,大大減輕工作負(fù)擔(dān)。
本文以一個(gè)名為AzureBingMaps的示例應(yīng)用程序?yàn)槔?,分享了一些在開(kāi)發(fā)該示例過(guò)程中積累的經(jīng)驗(yàn),以期對(duì)廣大開(kāi)發(fā)人員有所幫助。AzureBingMaps是一個(gè)旅游站點(diǎn)管理系統(tǒng),演示了很多技術(shù),可以認(rèn)為是一個(gè)實(shí)際項(xiàng)目。
寫這個(gè)示例的初衷
在Windows Azure論壇,我們常見(jiàn)到這樣的開(kāi)發(fā)人員:他們已經(jīng)學(xué)習(xí)了很多開(kāi)發(fā)技術(shù),例如ASP、.NET、Silverlight等,并對(duì)這些技術(shù)有了較深入的了解。但當(dāng)他們需要將學(xué)到的知識(shí)應(yīng)用到實(shí)際項(xiàng)目中時(shí),新的問(wèn)題便產(chǎn)生了。
- 針對(duì)特定場(chǎng)景該如何選擇平臺(tái)和技術(shù)?
- 不同的技術(shù)怎樣結(jié)合起來(lái)使用?
- 如果在使用某項(xiàng)技術(shù)的過(guò)程中發(fā)現(xiàn)了局限性該如何解決?
- 如果必須使用不熟悉的技術(shù)該怎么辦?
如今的網(wǎng)絡(luò)技術(shù)資源絕大多數(shù)都只針對(duì)某一種特定的技術(shù),指導(dǎo)人們?nèi)绾问褂靡粋€(gè)特定的功能,對(duì)那些希望學(xué)以致用、開(kāi)發(fā)實(shí)際項(xiàng)目的開(kāi)發(fā)人員而言,這遠(yuǎn)遠(yuǎn)不夠。
鑒于此,我們開(kāi)始嘗試使用微軟的各種技術(shù)開(kāi)發(fā)一個(gè)相對(duì)完整的項(xiàng)目,體會(huì)大家可能遇上的問(wèn)題,從而形成了本文。
選擇合適的平臺(tái)與技術(shù)
了解用戶需求
在項(xiàng)目開(kāi)發(fā)前,必須了解客戶的需求。這項(xiàng)工作的范圍很廣,但由開(kāi)發(fā)人員負(fù)責(zé)的部分通常僅限于選擇合適的平臺(tái)與技術(shù)。因此作為一個(gè)示例,我們省略了與客戶訪談以了解需求的過(guò)程,直接將非功能性需求定義如下。
- 本系統(tǒng)在旅游旺季需要支持1,000,000個(gè)用戶同時(shí)訪問(wèn),在非旅游旺季只需要支持1,000個(gè)用戶同時(shí)訪問(wèn)。
- 公司沒(méi)有自己的數(shù)據(jù)中心,IT部門最多只能提供3臺(tái)中檔服務(wù)器給我們的系統(tǒng)。
- 我們團(tuán)隊(duì)對(duì).NET和Visual Studio比較熟悉。
- 本系統(tǒng)對(duì)操作系統(tǒng)及網(wǎng)絡(luò)環(huán)境并沒(méi)有特定的需求。
- 第三方開(kāi)發(fā)人員應(yīng)該可以針對(duì)我們的服務(wù)自行開(kāi)發(fā)客戶端應(yīng)用程序。
這些需求也正是我們的客戶—Windows Azure論壇上參與討論的開(kāi)發(fā)人員—常常需要解決的問(wèn)題。
選擇合適的平臺(tái)
需求明確地指出可伸縮性是必須考慮的因素。為了滿足旅游旺季時(shí)1,000,000個(gè)用戶同時(shí)訪問(wèn)的需求,我們可能會(huì)考慮如下方案。
- 采用負(fù)載平衡,然而3臺(tái)中檔服務(wù)器即使采用了負(fù)載平衡也很難保證滿足我們的需求。
- 尋找云計(jì)算供應(yīng)商,將我們的系統(tǒng)部署在外部的數(shù)據(jù)中心,如果選擇的供應(yīng)商合適,支持多臺(tái)服務(wù)器負(fù)載平衡,就能確保滿足高并發(fā)訪問(wèn)的需求。
于是,我們的需求引領(lǐng)我們考慮選擇云計(jì)算。然而市場(chǎng)上也有很多云計(jì)算供應(yīng)商,選擇哪家最適合呢?這個(gè)問(wèn)題還是要通過(guò)需求來(lái)解答。
- 在非旅游旺季我們只需要支持1,000個(gè)用戶同時(shí)訪問(wèn),因此我們選擇的供應(yīng)商必須允許我們隨時(shí)更改使用計(jì)劃,例如,旅游旺季租用2,000臺(tái)服務(wù)器,非旅游旺季只租用2臺(tái)服務(wù)器。
- 鑒于項(xiàng)目組對(duì).NET和Visual Studio比較熟悉,我們希望應(yīng)用現(xiàn)有的知識(shí)進(jìn)行開(kāi)發(fā),這意味著我們選擇的供應(yīng)商必須支持.NET。
- 既然我們的系統(tǒng)對(duì)操作系統(tǒng)和網(wǎng)絡(luò)環(huán)境沒(méi)有特定的需求,我們就不希望花太多的時(shí)間在這些環(huán)境配置上。例如,我們不希望手工配置操作系統(tǒng)和安裝各種需要的軟件;希望即使需要租用2,000臺(tái)服務(wù)器,也可以讓項(xiàng)目組致力于應(yīng)用程序的開(kāi)發(fā),而不是基礎(chǔ)設(shè)施的配置。
綜上所述,我們發(fā)現(xiàn)Windows Azure平臺(tái)可以滿足需求。在Windows Azure平臺(tái)中,我們可以隨時(shí)簡(jiǎn)單通過(guò)修改配置文件的方式來(lái)選擇租用幾臺(tái)服務(wù)器,而且理論上可租用的服務(wù)器數(shù)量確實(shí)沒(méi)有上限。它也完全支持.NET平臺(tái),而且操作系統(tǒng)以及常用的軟件(例如數(shù)據(jù)庫(kù)),也不需要手工配置。
當(dāng)然,我們承認(rèn)如上定義正好符合WindowsAzure平臺(tái)的需求,這也是出于我們是針對(duì)這個(gè)平臺(tái)撰寫示例的考慮。但在實(shí)際項(xiàng)目中,大家確實(shí)需要考慮上述因素。如果你不需要高度可伸縮性,Windows Azure平臺(tái)可能就不適合你,畢竟它的價(jià)格相對(duì)于一般的Web供應(yīng)商而言是比較高的。如果你對(duì)操作系統(tǒng)和網(wǎng)絡(luò)環(huán)境有特定的需求,那么目前Windows Azure平臺(tái)也不適合你。你應(yīng)該根據(jù)實(shí)際需求,尋找合適的平臺(tái)。
選擇合適的技術(shù)
在選取技術(shù)的過(guò)程中,客戶需求以及開(kāi)發(fā)團(tuán)隊(duì)的經(jīng)驗(yàn)也是非常重要的。
需求指出第三方開(kāi)發(fā)人員需要針對(duì)我們的服務(wù)自行開(kāi)發(fā)客戶端程序,因此開(kāi)發(fā)服務(wù)時(shí)我們需要選擇一個(gè)能讓較多客戶端平臺(tái)都接受的技術(shù),最好是一個(gè)國(guó)際標(biāo)準(zhǔn)。于是我們決定使用REST。此外,我們的服務(wù)需要暴露一些數(shù)據(jù)給客戶端,因此將使用OData。OData是基于REST標(biāo)準(zhǔn),定義了如何訪問(wèn)數(shù)據(jù)的一種拓?fù)?,并且被廣泛地使用著。我們的開(kāi)發(fā)團(tuán)隊(duì)熟悉.NET,于是我們選擇在.NET平臺(tái)上能方便地實(shí)現(xiàn)OData的一項(xiàng)技術(shù),也就是WCF Data Services。
在數(shù)據(jù)存儲(chǔ)方面,Windows Azure平臺(tái)上有兩種常見(jiàn)的數(shù)據(jù)存儲(chǔ)服務(wù):Table Storage和SQL Azure??紤]到Table Storage目前還有較多局限性(例如不支持排序),我們決定使用SQL Azure。不過(guò)SQL Azure也有自己的局限性,最重要的一點(diǎn)就是目前它不具備Table Storage所提供的自動(dòng)伸縮功能,也就是說(shuō)當(dāng)數(shù)據(jù)量大的時(shí)候,如何確保高效訪問(wèn)數(shù)據(jù),是一個(gè)問(wèn)題。不過(guò)這個(gè)問(wèn)題也不是特別難以解決,請(qǐng)參考本文設(shè)計(jì)可伸縮的數(shù)據(jù)庫(kù)章節(jié)尋找解決方案。此外,SQL Azure還支持空間數(shù)據(jù)(Spatial Data),也就是存放地理信息的數(shù)據(jù),我們示例的場(chǎng)景正需要地理信息,所以空間數(shù)據(jù)也是一個(gè)很自然的選擇。
至于數(shù)據(jù)訪問(wèn),.NET平臺(tái)提供了Entity Framework,這是一種O/R Mapping的框架,可以讓開(kāi)發(fā)人員在不需要考慮如何撰寫SQL語(yǔ)句的情況下進(jìn)行數(shù)據(jù)訪問(wèn)操作,而將精力專注于面向?qū)ο蟮脑O(shè)計(jì)。不過(guò)目前Entity Framework對(duì)空間數(shù)據(jù)的支持并不很完美,所以采用它將會(huì)給項(xiàng)目帶來(lái)一定風(fēng)險(xiǎn)。
另外一個(gè)選擇是直接使用SqlConnection以及SqlCommand,但這種方式比較煩瑣,而且代碼也不易維護(hù)。綜合考慮,我們決定先做一個(gè)簡(jiǎn)單的原型,嘗試將Entity Framework和Spatial Data結(jié)合使用,如果在開(kāi)發(fā)該原型的過(guò)程中遇上了太多困難,我們將采用SqlConnection的方式。當(dāng)然最終證明困難并不是很大,于是我們的示例還是采用了Entity Framework。
最后還有客戶端,在客戶端的技術(shù)選擇上,我們首先考慮是選擇Web還是Desktop。絕大多數(shù)情況下,Web應(yīng)用程序都占據(jù)著得天獨(dú)厚的優(yōu)勢(shì),因?yàn)橛脩舨恍枰惭b,甚至不需要下載。當(dāng)然Web應(yīng)用程序在用戶體驗(yàn)上可能略有不足,不過(guò)隨著HTML5以及Silverlight的普及,差距也是越來(lái)越小了。如今Desktop程序最大的優(yōu)勢(shì)在于能夠訪問(wèn)更多的系統(tǒng)資源,以及可以更好地支持離線使用。
對(duì)于我們的場(chǎng)景而言,我們不需要訪問(wèn)特定的系統(tǒng)資源,而且可以暫時(shí)不考慮離線訪問(wèn)的狀況,所以針對(duì)PC類的大型設(shè)備我們選擇了Web。不過(guò),手機(jī)類的設(shè)備則是另外一回事。大多數(shù)手機(jī)瀏覽器不僅相對(duì)而言屏幕較小,而且功能支持也比較少,例如Silverlight一類的插件不受支持,而且也缺乏PC瀏覽器常見(jiàn)的那種TabbedView一類的效果。所以如果針對(duì)手機(jī)設(shè)備開(kāi)發(fā),往往還需要選擇該設(shè)備直接支持的技術(shù)。
至于為何選擇AJAX和Silverlight兩個(gè)PC客戶端,以及Windows Phone,就純粹是出于示例的需要了。還是那句話,如果你的需求不同,你就應(yīng)該根據(jù)需求選擇適合于當(dāng)前項(xiàng)目的技術(shù),而不是生搬硬套...
NET技術(shù):Azure和Bing Maps API示例經(jīng)驗(yàn)分享,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。