日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PP团队圣经巨著《Application Architecture Guide2.0》24章-Web程式开发向导

發(fā)布時間:2024/4/14 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PP团队圣经巨著《Application Architecture Guide2.0》24章-Web程式开发向导 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
-

?

第二十四章? Web程式原型

目標(biāo)

l???????? 學(xué)習(xí)Web程式的通常設(shè)計考慮點。

l???????? 學(xué)習(xí)Web程式的主要原則。

l???????? 學(xué)習(xí)Web程式的層指導(dǎo)原則。

l???????? 學(xué)習(xí)性能,安全以及部署指導(dǎo)原則。

?

概覽

Web程式的核心是服務(wù)器端的邏輯。它可能由很多不同的層組成。典型的例子就是三層架構(gòu),表現(xiàn)層,業(yè)務(wù)層以及數(shù)據(jù)層。下面的圖表列舉了通用的Web應(yīng)用架構(gòu),由一些不同領(lǐng)域的通用組件組成。

?

?

設(shè)計考慮

設(shè)計安全和高性能的Web應(yīng)用的主要目標(biāo)是將任務(wù)分解成不同的關(guān)注點以減少復(fù)雜性。設(shè)計時請考慮以下原則:

l???????? 把應(yīng)用邏輯分區(qū)。將應(yīng)用邏輯分為表現(xiàn)層,業(yè)務(wù)層和數(shù)據(jù)層。這將提高代碼可維護(hù)性以及允許監(jiān)控和優(yōu)化每一層的性能。一個清晰的分層可以提供程式更好的擴(kuò)展性。

l???????? 在層間使用抽象來實現(xiàn)松耦合。如同輸入和輸出Facade可以將請求轉(zhuǎn)換成層組件理解的格式。而且,你可以使用接口類型或抽象基類來定義共享的抽象,以被接口組件實現(xiàn)。

l???????? 明確組件之間如何通信。這要求你首先要了解程式所支持的部署環(huán)境。你必須確定通信是要跨越物理邊界,進(jìn)程邊界還是所有組件都在同一個進(jìn)程中。

l???????? 減少數(shù)據(jù)包往返。當(dāng)設(shè)計Web程式,考慮使用緩存,輸出緩沖來減少瀏覽器和服務(wù)器,Web服務(wù)器和下載服務(wù)器之間的數(shù)據(jù)包往返。

l???????? 考慮使用緩存。一個好的緩存策略也許是與性能關(guān)系最大的設(shè)計考慮點。Asp.net的緩存包括輸出緩存,局部頁緩存以及緩存API,設(shè)計時請好好利用這些優(yōu)勢。

l???????? 考慮使用日志和監(jiān)控組件。你必須審核和記錄穿越程式層之間的活動。這些日志可以用來檢測可疑的活動,通常可以在早期發(fā)現(xiàn)對系統(tǒng)的攻擊行為。

l???????? 避免長時間運行的任務(wù)鎖。如果你有長時間運行或加鎖的操作,考慮使用異步的方法以允許Web服務(wù)器處理其它輸入請求。

l???????? 鑒別所有穿越信任邊界的用戶。比如,當(dāng)從表現(xiàn)層訪問遠(yuǎn)程的業(yè)務(wù)層時。

l???????? 不要在網(wǎng)絡(luò)間傳輸沒加密的敏感數(shù)據(jù)。如果你需要通過網(wǎng)絡(luò)傳遞密碼或授權(quán)cookie等敏感信息,考慮加密以及簽名數(shù)據(jù)或者使用SSL

l???????? 使用最小權(quán)限賬戶來運行Web程式。如果攻擊者利用一個進(jìn)程,而進(jìn)程被限制訪問文件系統(tǒng)和其它系統(tǒng)資源,這樣會減少可能的損害。

?

Web程式結(jié)構(gòu)

Category

Key Issues

Authentication

在信任邊界之間缺少驗證。

?

在數(shù)據(jù)庫中使用普通文本格式來存儲密碼。

?

設(shè)計自定義的驗證機制來代替內(nèi)置的機制。

Authorization

在信任邊界間缺少授權(quán)。

?

不正確的角色粒度。

?

在不需要的時候使用代理。

Caching

緩存了易變的數(shù)據(jù)。

?

沒有考慮緩存頁面輸出。

?

緩存敏感數(shù)據(jù)。

?

沒有緩存數(shù)據(jù)為ready-to-use格式。

Exception Management

對終端用戶暴露了敏感信息。

?

沒有記錄異常的完整信息。

?

用異常來處理應(yīng)用程式邏輯。

Logging and Instrumentation

沒有在所有層實現(xiàn)適當(dāng)?shù)谋O(jiān)控。

?

沒有記錄嚴(yán)重系統(tǒng)事件和關(guān)鍵業(yè)務(wù)事件。

?

不支持運行時的日志和監(jiān)控配置。

?

記錄了敏感信息。

Navigation

在用戶接口混合了導(dǎo)航邏輯。

?

硬編碼視圖聯(lián)系。

?

沒有核實用戶是否被授權(quán)訪問視圖。

Page Layout(UI)

對于復(fù)雜的布局使用基于表格的布局。

?

設(shè)計了復(fù)雜的重載頁面。

Page Rendering

使用過多的回傳影響用戶體驗。

?

使用過大的頁面降低了性能。

Presentaion Entity

在不需要的時候創(chuàng)建了自定義的實體對象。

?

將業(yè)務(wù)邏輯添加到了表現(xiàn)層實體。

Request Processing

混合了處理邏輯和呈現(xiàn)邏輯。

?

選擇了不適當(dāng)?shù)哪J健?/span>

Service Interface Layer

破壞了服務(wù)接口。

?

在服務(wù)接口里實現(xiàn)了業(yè)務(wù)規(guī)則。

?

沒有考慮互操作性需求。

Session Management

使用了不正確的狀態(tài)存儲。

?

沒有考慮串行化需求。

?

在需要的時候沒有維護(hù)狀態(tài)。

?

對大量數(shù)據(jù)如Dataset使用ViewState

Validation

依賴客戶端驗證。

?

在信任邊界間缺少驗證。

?

沒有重用驗證邏輯。

?

?

驗證

不適當(dāng)?shù)幕蜉^弱的驗證可能會導(dǎo)致你的程式易受欺騙攻擊,字典攻擊,會話劫持以及其它類型的攻擊。

當(dāng)設(shè)計驗證策略時,考慮以下原則:

l???????? 識別Web程式層之間的信任邊界。這將幫助你決定哪里需要驗證。

l???????? 使用平臺支持的驗證機制,如Windows驗證。

l???????? 如果你使用Forms驗證,盡可能利用平臺特性。

l???????? 如果你使用Forms驗證,保護(hù)你的授權(quán)cookie

l???????? 如果你沒有使用SSL,考慮縮短session過期時間以降低授權(quán)cookie的暴露。

l???????? Web程式中將公共區(qū)和限制區(qū)分開。

l???????? 加強賬戶管理,如使用賬戶鎖定和過期。

l???????? 使用強密碼策略。包括特定的密碼程度和復(fù)雜度,以及密碼過期策略。

l???????? 不要在數(shù)據(jù)庫或數(shù)據(jù)源中存儲密碼,應(yīng)該存儲hash加密過的密碼。

l???????? 保護(hù)信任的存儲區(qū)。

?

授權(quán)

不適當(dāng)?shù)幕蜉^弱的授權(quán)會導(dǎo)致信息暴露,數(shù)據(jù)被篡改以及權(quán)限被提升。深度防御是程式授權(quán)策略的關(guān)鍵安全原則。? 設(shè)計時考慮以下原則:

l???????? 識別Web層的信任邊界。

l???????? 對頁面和目錄訪問控件使用URL授權(quán)。

l???????? 使用Asp.net角色管理來進(jìn)行角色授權(quán)。

l???????? 如果查找角色進(jìn)程比較消耗資源,考慮緩存角色信息。

l???????? 考慮授權(quán)設(shè)置粒度。

l???????? 使用加密來保護(hù)授權(quán)過的cookie,或者設(shè)置HttpOnly屬性來防止客戶端腳本訪問。

l???????? 訪問下載資源時,用信任的子系統(tǒng)模型來實現(xiàn)身份識別。

l???????? 如果使用代理來指定特定的授權(quán)和訪問粒度,要考慮對性能和擴(kuò)展性的影響。

?

緩存

緩存可以提高應(yīng)用程式的性能和響應(yīng)。但是,錯誤的緩存選擇和低劣的緩存設(shè)計可以降低性能和響應(yīng)。你應(yīng)該使用緩存來優(yōu)化數(shù)據(jù)查找,避免網(wǎng)絡(luò)數(shù)據(jù)包往返,避免不必要和重復(fù)的處理。為實現(xiàn)緩存,你必須決定何時加載緩存數(shù)據(jù)。使用異步加載緩存或使用批處理可以避免客戶端延遲。

當(dāng)設(shè)計緩存時,可以考慮以下原則:

l???????? 避免為每一個用戶緩存數(shù)據(jù)。

l???????? 緩存全局?jǐn)?shù)據(jù)或者多用戶使用的數(shù)據(jù)。

l???????? 避免緩存易變數(shù)據(jù)。

l???????? 使用output緩存來緩存相對靜態(tài)的頁面。

l???????? 對頁面中的靜態(tài)用戶控件數(shù)據(jù)使用局部頁面緩存。

l???????? 選擇何時的緩存位置,如客戶端,代理服務(wù)器或Web服務(wù)器。

l???????? 貧困的共享資源是昂貴的,如網(wǎng)絡(luò)連接,可以使用緩存。

l???????? 緩存數(shù)據(jù)用ready-to-use格式。

l???????? 對于大量緩存,考慮用異步單線程加載或者使用批處理進(jìn)程。

l???????? 考慮在表現(xiàn)層緩存要展示給用戶的數(shù)據(jù)。

l???????? 當(dāng)數(shù)據(jù)不能有效的從數(shù)據(jù)庫檢索的時候,考慮在業(yè)務(wù)層緩存它。

l???????? 如果需要緩存大量的數(shù)據(jù)較長時間,那么將它緩存在數(shù)據(jù)庫里。

l???????? 避免使用分布式的聚合的緩存。

?

異常管理

設(shè)計有效的異常管理對于系統(tǒng)的安全性和可靠性非常重要。在Web頁面上正確的異常處理可以阻止將敏感的異常詳細(xì)信息展現(xiàn)給用戶,可以提高系統(tǒng)的穩(wěn)固性以及避免系統(tǒng)不一致狀態(tài)的發(fā)生。

當(dāng)設(shè)計異常管理策略時,考慮以下原則:

l???????? 不要用異常來控制邏輯流程,并且避免你的代碼發(fā)生異常。

l???????? 除非你處理它,否則不要捕獲異常。

l???????? 集中異常處理方案。

l???????? 對于不可料的錯誤使用全局的錯誤處理。

l???????? 對終端用戶使用友好的異常信息。

l???????? 不要在異常明細(xì)里顯示敏感信息。

l???????? 設(shè)計合適的異常傳播策略。

l???????? 設(shè)計合適的異常記錄策略。

l???????? 要記錄異常的詳細(xì)信息。

l???????? 設(shè)置異常管理系統(tǒng)以在錯誤發(fā)生的時候也要保證安全。

?

記錄和監(jiān)控

l???????? 考慮使用平臺特性,如異常檢測來記錄和審核事件。

l???????? 集中設(shè)置日志和監(jiān)控機制。

l???????? 考慮審核用戶管理的事件。

l???????? 審核不正常的活動。

l???????? 審核關(guān)鍵業(yè)務(wù)操作。

l???????? 創(chuàng)建安全日志文件管理策略。

l???????? 不要在日志或?qū)徍宋募锎鎯γ舾行畔ⅰ?/span>

?

導(dǎo)航

設(shè)計導(dǎo)航策略時,要把它與處理邏輯分開。它幫助用戶快速瀏覽網(wǎng)站,設(shè)計一致的導(dǎo)航結(jié)構(gòu)可以降低系統(tǒng)的使用復(fù)雜性。

?

當(dāng)設(shè)計導(dǎo)航策略時,考慮以下原則:

l???????? 使用眾所周知的模式,如MVC,可以將UI和復(fù)雜的導(dǎo)航邏輯解藕。

l???????? 考慮在MasterPage中封裝導(dǎo)航,這樣可以跨頁面保持一致性。

l???????? 在小的Web應(yīng)用程式中,可以考慮將導(dǎo)航封裝于控件中。

l???????? 如果使用Menu,考慮使用.netSiteMap Provider

l???????? 設(shè)計SiteMap可以幫助用戶查找頁面,同時也允許搜索引擎抓取站點。

l???????? 如果在窗體間使用向?qū)韺崿F(xiàn)導(dǎo)航。

l???????? 對于信息豐富且類似于樹狀管理的站點可以使用有層次的導(dǎo)航,如圖書館。

l???????? 使用可視的元素,如鏈接,導(dǎo)航菜單等以幫助用戶迅速的找到站點可用的東西。

l???????? 設(shè)計保存導(dǎo)航狀態(tài)策略。

?

頁面布局(UI)

設(shè)計程式時,要將頁面布局和特定的UI組件及UI處理過程分開。當(dāng)選擇了一種布局策略,考慮是設(shè)計者還是開發(fā)者創(chuàng)建此布局。如果設(shè)計者創(chuàng)建此布局,那么選擇不需要編碼的布局方法或使用專門的開發(fā)工具。

?

當(dāng)設(shè)計布局策略時,考慮以下原則:

l???????? 確定是否要支持跨瀏覽器。

l???????? 在任何可能的布局使用CSS

l???????? 當(dāng)你需要支持網(wǎng)格布局,那使用基于表格的布局,但是要牢記表格布局可能呈現(xiàn)較慢,而且不能完全的跨瀏覽器,并且在布局復(fù)雜的時候可能會有問題。

l???????? 如果你要在網(wǎng)格或以表格樣式來展現(xiàn)數(shù)據(jù),那么使用HTML 表格來幫助弱視人群或其它特別的用戶。

l???????? 使用統(tǒng)一的布局可以盡可能的提供易用性。

l???????? ASP.NET里使用MasterPage為所有的頁面提供一個統(tǒng)一的視覺效果和感受。

l???????? 避免設(shè)計和開發(fā)大型頁面來完成多個功能,特別是通常一個請求只會調(diào)用很少的任務(wù)。

l???????? 分割頁面內(nèi)容可以提高緩存效率和減少呈現(xiàn)。

?

頁面呈現(xiàn)

當(dāng)設(shè)計頁面呈現(xiàn)時,要保證頁面呈現(xiàn)的效率和接口的最大利用。請遵循以下原則:

l???????? 盡量減少傳遞的頁面大小,例如,在不需要的地方DisableViewState

l???????? 考慮使用數(shù)據(jù)綁定選項。例如,可以為控件綁定自定義對象或DataSet。但是,數(shù)據(jù)綁定只能在ASP.NET里使用。

l???????? 使用AJAX來提高用戶體驗和獲取較好的響應(yīng)。

l???????? 對大數(shù)據(jù)量使用分頁技術(shù)。

l???????? 設(shè)計全球化策略。如為字符串?dāng)?shù)據(jù)使用資源文件。

l???????? 考慮在用戶接口組件里設(shè)計本地化。

l???????? 將用戶處理組件從數(shù)據(jù)呈現(xiàn)和獲取程式里抽象出來。

?

表現(xiàn)實體(Presentation Entity)

在表現(xiàn)層里使用表現(xiàn)實體存儲數(shù)據(jù)以管理視圖表現(xiàn)實體不一定是必須的。只有當(dāng)DataSet非常大或者復(fù)雜時,才使用表現(xiàn)實體將數(shù)據(jù)單獨從UI控件中分離出來存儲。設(shè)計或選擇合適的表現(xiàn)實體可以很容易的與UI控件進(jìn)行綁定。

?

設(shè)計表現(xiàn)層實體時,考慮以下原則:

l???????? 決定你是否需要表現(xiàn)層實體。

l???????? 考慮使用自定義的類來將控件直接映射到業(yè)務(wù)實體。

l???????? 考慮表現(xiàn)層實體的串行化需求。

l???????? 避免將業(yè)務(wù)邏輯添加到表現(xiàn)實體中。

l???????? 考慮在表現(xiàn)實體中實現(xiàn)輸入數(shù)據(jù)驗證。

l???????? 考慮使用表現(xiàn)實體來存儲用戶接口狀態(tài)。

?

請求處理

當(dāng)設(shè)計請求處理策略時,你要將請求處理邏輯從用戶接口分離出來,以分離每一個關(guān)注點。

?

當(dāng)設(shè)計請求處理策略時,考慮以下原則:

l???????? 統(tǒng)一實現(xiàn)頁面請求處理前后邏輯以提高重用。例如,創(chuàng)建一個基類派生于Page類,并且包含了請求處理前后邏輯。

l???????? 考慮將UI處理分成三類,Model,View以及Controller/Presenter,通過使用MVCMVP模式。

l???????? 為提高可測試性,避免在ViewModel之間使用Passive View模式(MVP模式的一種)

l???????? 如果你在設(shè)計需要處理大量數(shù)據(jù)的視圖,考慮View訪問Model時使用Supervising Contorller模式(MVP模式的一種)

l???????? 如果程式不依賴于viewstate,而且也沒有很多控件事件,考慮使用MVC模式。

l???????? 如果包含復(fù)雜的導(dǎo)航和命令處理需求,考慮使用Front Controller模式(MVC的一種)

l???????? 不要在視圖中實現(xiàn)請求處理。

l???????? 在合適的地方使用過濾器模式來實現(xiàn)可拆卸的過濾器。

l???????? 考慮使用事件來通知調(diào)用者更改狀態(tài)數(shù)據(jù)。例如,使用觀察者模式。

l???????? 確保在請求處理邏輯中沒有混合業(yè)務(wù)規(guī)則。

?

會話管理

當(dāng)設(shè)計Web程式時,一個有效的和安全的Session管理策略對于性能和可靠性非常重要。你要考慮Session管理的一些因素,如存放什么,存放位置以及信息保存時間。

?

當(dāng)設(shè)計Session管理策略時,考慮以下原則:

l???????? 不要依賴客戶端狀態(tài)管理。

l???????? 選擇合適的會話狀態(tài)存儲,如進(jìn)程,Asp.net StateServer,或者SQLServer

l???????? 如果你有一個Web服務(wù)器,需要最適宜的會話性能以及并發(fā)會話相對較少,可以使用在進(jìn)程內(nèi)存儲會話狀態(tài)。

l???????? 如果你的Session重建代價非常昂貴,并且在Asp.net重啟的時候還會保持,那么在本地的WebServer上使用會話狀態(tài)服務(wù)。

l???????? 如果你首先考慮的是可靠性,那么將會話存儲在SQLServer中。

l???????? 對于Web farm可以使用遠(yuǎn)程的會話狀態(tài)服務(wù)或Sqlserver狀態(tài)存儲。

l???????? 保護(hù)你的會話狀態(tài)通信渠道。

l???????? 限制訪問會話狀態(tài)數(shù)據(jù)。

l???????? 對于會話數(shù)據(jù)使用基本類型以減少串行化花費。

l???????? 使用平臺特性來加密Cookie中的Session ID

l???????? 如果客戶端瀏覽器禁用cookies,使用無cookieSession

?

驗證

設(shè)計一個有效的驗證方案對于程式的安全性和可靠性非常重要,請遵循以下原則:

l???????? 識別Web程式層之間的信任邊界,并且驗證所有穿越邊界的數(shù)據(jù)。

l???????? 假定所有客戶端的數(shù)據(jù)都是惡意的。

l???????? 設(shè)計驗證策略以限制,拒絕和清除所有惡意的數(shù)據(jù)。

l???????? 驗證輸入長度,范圍,格式和類型。

l???????? 驗證所有輸入,如查詢字符串,CookieHtml控件。

l???????? 不要只依賴Asp.net 請求驗證。

l???????? 考慮使用Asp.net 驗證控件。

l???????? Asp.net中使用正則表達(dá)式來限制輸入。

l???????? 不要顯示不信任的輸入。

l???????? 如果需要輸出不信任的數(shù)據(jù),用HTML編碼輸出。

l???????? 為提高用戶體驗使用客戶端驗證,以及在服務(wù)器端再次驗證以提高安全。

l???????? 避免用戶輸入文件路徑和名稱。

?

表示層考量

Web程式的表現(xiàn)層提供了用戶接口和用戶交互。設(shè)計必須集中于分離關(guān)注點,將用戶交互邏輯和用戶接口組件解藕。

?

當(dāng)設(shè)計表現(xiàn)層時,考慮以下原則:

l???????? 考慮將用戶接口組件和用戶接口處理組件分離。

l???????? 評估表現(xiàn)層和業(yè)務(wù)及數(shù)據(jù)層的交互方式。

l???????? 對于客戶端和服務(wù)器端都使用輸入驗證策略。

l???????? 設(shè)計數(shù)據(jù)格式和顯示策略,包括對用戶的視覺樣式。

l???????? 使用頁面輸出緩存換局部緩存來緩存靜態(tài)頁或頁面的一部分。

l???????? 使用觀察者模式來處理用戶事件。

l???????? 使用Page Controller模式將業(yè)務(wù)層和表現(xiàn)層分離。

l???????? 當(dāng)你有復(fù)雜的頁面導(dǎo)航邏輯并且需要動態(tài)配置時,使用Front Controller模式。

l???????? 如果需要將控件編譯進(jìn)程序集以重用,或你需要對現(xiàn)存的服務(wù)器控件添加額外特征,使用Web服務(wù)器控件。

l???????? 如果需要重用一些頁面的局部UI或需要緩存頁面的特定部分,使用Web用戶自定義控件。

?

業(yè)務(wù)層考量

當(dāng)設(shè)計Web程式的業(yè)務(wù)層時,考慮怎樣實現(xiàn)業(yè)務(wù)邏輯和長時間運行的工作流。設(shè)計業(yè)務(wù)實體代表真實世界數(shù)據(jù),以及使用它來在組件間傳遞數(shù)據(jù)。

?

當(dāng)設(shè)計業(yè)務(wù)層時,考慮以下原則:

l???????? 設(shè)計一個單獨的業(yè)務(wù)層來實現(xiàn)業(yè)務(wù)邏輯和工作流。這將提高程式的可維護(hù)性和可測試性。

l???????? 考慮集中和重用通用業(yè)務(wù)邏輯功能。

l???????? 設(shè)計無狀態(tài)的業(yè)務(wù)層。這將幫助減少資源爭奪及提高性能。

l???????? 對于業(yè)務(wù)實體使用粗粒度的包,如DTO

l???????? 業(yè)務(wù)組件要高內(nèi)聚,低耦合。

l???????? 對重要的業(yè)務(wù)操作使用事務(wù)。

l???????? 決定同步或異步執(zhí)行業(yè)務(wù)流中的處理步驟。

?

數(shù)據(jù)層考量

Web程式設(shè)計一個抽現(xiàn)訪問數(shù)據(jù)庫的數(shù)據(jù)層。使用單獨的數(shù)據(jù)層將使程式容易配置和維護(hù)。可以使用服務(wù)代理來使數(shù)據(jù)層訪問外部服務(wù)。

?

當(dāng)設(shè)計數(shù)據(jù)層時,考慮以下原則:

l???????? 設(shè)計一個單獨的數(shù)據(jù)層以隱藏數(shù)據(jù)庫的詳細(xì)信息。

l???????? 使用實體對象在層間傳輸數(shù)據(jù)和交互。

l???????? 對不同類型的數(shù)據(jù)存儲選擇合適的數(shù)據(jù)訪問技術(shù)。

l???????? 利用連接池來減少打開的連接數(shù)量。

l???????? 設(shè)計異常處理策略來處理數(shù)據(jù)訪問錯誤,并且將異常拋轉(zhuǎn)到業(yè)務(wù)層。

l???????? 考慮使用批處理操作來減少數(shù)據(jù)庫的數(shù)據(jù)包往返。

?

服務(wù)層考量

如果你計劃遠(yuǎn)程部署業(yè)務(wù)層或者使用Web Service來暴露業(yè)務(wù)邏輯,考慮使用單獨的服務(wù)層。

?

當(dāng)設(shè)計服務(wù)層時,考慮以下原則:

l???????? 設(shè)計粗粒度的服務(wù)方法以減少客戶端和服務(wù)器的交互,以及提供松耦合。

l???????? 不要認(rèn)為只有一種客戶端來訪問服務(wù)。

?

?

性能考量

Web程式的早期設(shè)計階段,通過獲取非功能的需求來識別性能對象。響應(yīng)時間,吞吐量,CPU,內(nèi)存以及磁盤IO是必須考慮的關(guān)鍵因素。

注意以下原則:

l???????? 保證性能需求是特定的,現(xiàn)實的和靈活的。

l???????? 使用非分布式部署來提高性能。

l???????? 實現(xiàn)緩存技術(shù)以提高程式性能和擴(kuò)展。

l???????? 執(zhí)行批處理操作來減少邊界的數(shù)據(jù)包往返。

l???????? 避免在表現(xiàn)層進(jìn)行原子事務(wù)操作,這會降低可擴(kuò)展性。

l???????? 在進(jìn)程里存儲會話信息。

l???????? 減少在服務(wù)器和客戶端之間傳輸?shù)?/span>HTML數(shù)據(jù)。

l???????? 避免不必要的網(wǎng)絡(luò)數(shù)據(jù)包往返。

?

安全考量

安全對于保證數(shù)據(jù)的一致性和機密性非常重要。你需要為Web程式設(shè)計一個安全策略,使用已測試和證明的安全解決方案,以及實現(xiàn)審核,授權(quán)和數(shù)據(jù)驗證,以保護(hù)系統(tǒng)免受威脅。

?

考慮以下原則:

l???????? 在任何的信任邊界使用審核。

l???????? 考慮使用強大的授權(quán)機制以限制資源訪問和保護(hù)業(yè)務(wù)邏輯。

l???????? 考慮使用輸入和數(shù)據(jù)驗證以防止跨站腳本攻擊和代碼注入等安全威脅。

l???????? 不要依賴客戶端驗證。

l???????? 考慮加密和簽名任何通過網(wǎng)絡(luò)的敏感數(shù)據(jù)。

?

部署考量

當(dāng)部署Web程式時,你需要考慮層和組件的位置對性能,擴(kuò)展和安全的影響,另外也要設(shè)計取舍。使用分布式或非分布式的部署取決于業(yè)務(wù)需求和Infrastructure限制。

?

部署時考慮以下原則:

l???????? 考慮使用非分布式部署來提高性能。

l???????? 考慮使用分布部署來實現(xiàn)可擴(kuò)展性和提高每層的安全性。

?

非分布式部署

在非分布式部署的環(huán)境里,Web程式的各個邏輯層都放置在相同的Web服務(wù)器上,除了數(shù)據(jù)庫。你必須考慮程式怎樣處理多個并發(fā)用戶,以及怎樣保證在同個Server上其它層的安全。

?

考慮以下原則:

l???????? 如果你不需要和其它程式共享業(yè)務(wù)邏輯考慮使用非分布式的部署。

l???????? 如果Web程式對性能要求較高,可以使用非分布式的部署,因為從本地調(diào)用其它層會提供額外的負(fù)擔(dān)。

l???????? 為你的業(yè)務(wù)層使用基于組件的接口。

l???????? 如果你的業(yè)務(wù)邏輯運行在同一個進(jìn)程里,避免在業(yè)務(wù)層審核。

l???????? 考慮使用可信任的身份來訪問數(shù)據(jù)庫(通過信任的子系統(tǒng)Model)。這可以提高性能和系統(tǒng)可擴(kuò)展性。

l???????? 考慮加密以及數(shù)字簽名Web服務(wù)器和數(shù)據(jù)庫間傳遞的敏感數(shù)據(jù)。

?

分布式部署

在分布式部署環(huán)境里,Web程式的表示層和業(yè)務(wù)層邏輯在單獨的物理層,并且需要遠(yuǎn)程通信。通常需要把業(yè)務(wù)和數(shù)據(jù)訪問層放置于同一服務(wù)器。

?

當(dāng)選擇分布式部署時,考慮以下原則:

l???????? 除非需要否則不要將業(yè)務(wù)邏輯組件單獨放置。

l???????? 如果你的業(yè)務(wù)邏輯被其它程式共享,考慮使用分布式部署。

l???????? 如果為了安全考量,禁止在前端Web服務(wù)器上部署業(yè)務(wù)邏輯的話,考慮使用分布式部署。

l???????? 在表現(xiàn)層和業(yè)務(wù)層之間使用防火墻以增加安全性。

l???????? 表現(xiàn)層不需要初始化,參與原子事務(wù)。

l???????? 為業(yè)務(wù)層使用基于消息的接口。

l???????? 使用TCP協(xié)議和業(yè)務(wù)層通信可以獲取更好的性能。

l???????? 在不同的物理層間保護(hù)敏感信息傳輸。

l???????? 如果業(yè)務(wù)層也被其它程式訪問,考慮在業(yè)務(wù)層使用審核。

?

負(fù)載平衡

當(dāng)在多臺服務(wù)器上部署你的Web程式,你可以使用負(fù)載平衡來分派請求以保證它們可以被多個Web服務(wù)器處理。這將幫助提高響應(yīng),資源利用以及吞吐量。

如果設(shè)計Web程式使用負(fù)載平衡,考慮以下原則:

l???????? 設(shè)計可擴(kuò)展的Web程式時避免太傾向于Server。請求從服務(wù)器發(fā)出,也被服務(wù)器處理。這種現(xiàn)象經(jīng)常發(fā)生于你使用本地可更新的緩存,或者進(jìn)程中或本地存儲會話狀態(tài)。

l???????? 考慮為Web程式設(shè)計無狀態(tài)的組件;例如,一個Web前段沒有進(jìn)程狀態(tài)和有狀態(tài)的業(yè)務(wù)組件。

l???????? 考慮使用Windows網(wǎng)絡(luò)負(fù)載平衡(NLB)作為一個軟件方案來實現(xiàn)請求的重定向。

?

Web Farm考量

Web farm允許擴(kuò)展程式,并且盡量減少硬件故障的沖擊。當(dāng)你增加更多的服務(wù)器,你可以使用負(fù)載平衡或者集群方法。

?

考慮以下原則:

l???????? 考慮使用集群來減少硬件錯誤的影響。

l???????? 如果程式要求高輸入和輸出需求,考慮通過多數(shù)據(jù)庫服務(wù)器來分區(qū)數(shù)據(jù)庫。

l???????? 考慮配置Web farm來將同一個用戶的所有請求路由到同一個Server以提供親和性。

l???????? 當(dāng)同一個用戶的請求不能保證被路由到同一個服務(wù)器時,在web farm不要使用進(jìn)程內(nèi)的會話管理。使用進(jìn)程外的狀態(tài)服務(wù)器服務(wù)或數(shù)據(jù)庫服務(wù)器。

?

模式映射

Category

Scenarios

Authentication and Authorization

Brokered Authentication

?

Direct Authentication

?

Federated Authentication (Single Sign On or SSO)

?

Trusted Sub-System

Caching

Cache Dependency

?

Page Cache

Exception Management

Exception Shielding

Logging and Instrumentation

Provider

Navigation

MVP

?

MVC

Page Layout

Template View

?

Composite View

?

Transform View

?

Two Step View

Request Processing

Page Controller

?

Front Controller

?

Passive View

?

Supervising Controller

?

關(guān)鍵模式

l???????? Composite View-將單個視圖合并為一個組合的表現(xiàn)層。

l???????? Exception Shielding –對外部系統(tǒng)或用戶過濾異常數(shù)據(jù)。

l???????? Front Controller – 將所有請求裝入管道以通過一個處理對象,它可以在運行時被裝飾者修改。

l???????? Modal View Controller – 將用戶接口和數(shù)據(jù)存放以及兩者間的代碼邏輯分離開來。

l???????? Modal View Presenter – 將用戶接口,數(shù)據(jù)存放以及代碼邏輯分離。

l???????? Page Cache – 使用頁面緩存來提高頻繁訪問的動態(tài)Web頁面(頁面不經(jīng)常變化以及構(gòu)建時消耗了系統(tǒng)的大量資源)的響應(yīng)時間。

l???????? Page Controller – 將頁面的輸入請求,交給一個特定的頁面或Action來處理。

l???????? Template View – 實現(xiàn)一個通用的模板視圖,然后從它派生或創(chuàng)建視圖。

?

技術(shù)考量

基于微軟平臺,從Asp.net出發(fā),你可以在Asp.net Web窗體中融合大量的技術(shù),如Asp.net Ajax,Asp.net MVC,SilverLight,以及Asp.net Dynamic Data

l???????? 如果通過Web瀏覽器來訪問Web程式,考慮使用asp.net web窗體。

l???????? 如果Web程式需要加強交互性或后臺處理,考慮使用Asp.net Ajax

l???????? 如果Web程式包含富多媒體的內(nèi)容和交互性,考慮使用SilverLight

l???????? 如果Web程式需要實現(xiàn)以控制為中心的模型,將控制器分離以及提高可測試性,考慮使用Asp.net MVC

l???????? 如果設(shè)計Web程式需要基于數(shù)據(jù)開發(fā),考慮使用Asp.net Dynamic Data

?

patterns & practices Solution Assets

? Web Client Software Factory at http://msdn.microsoft.com/en-us/library/bb264518.aspx.

? Building Secure ASP.NET Applications at http://msdn.microsoft.com/enus/

library/aa302415.aspx.

? Improving Web Application Security at http://msdn.microsoft.com/enus/

library/ms994921.aspx.

Additional Resources

? For more information on design patterns for Web applications, see Enterprise Solution

Patterns Using Microsoft .NET at http://msdn.microsoft.com/en-us/library/ms998469.aspx.

? For more information on designing and implementing Web client applications, see Design

and Implementation Guidelines for Web Clients at http://msdn.microsoft.com/enus/

library/ms978605.aspx.

? For more information on designing distributed Web applications, see Designing Distributed

Applications at http://msdn.microsoft.com/en-us/library/aa292470(VS.71).aspx.

? For more information on Web application performance issues, see Improving .NET

Application Performance and Scalability at http://msdn.microsoft.com/enus/

library/ms998530.aspx.

? For more information on Web application security, see Improving Web Application Security:

Threats and Countermeasures at http://msdn.microsoft.com/en-us/library/ms994921.aspx.

轉(zhuǎn)載于:https://www.cnblogs.com/niujunjie1/archive/2008/12/13/1354111.html

總結(jié)

以上是生活随笔為你收集整理的PP团队圣经巨著《Application Architecture Guide2.0》24章-Web程式开发向导的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。