像許多建築問題一樣,它可以是一個平衡的行爲。
將3層Web應用程序拆分爲獨立機器上的每個層的一個好處是,您現在可以分別負載平衡應用程序的各個部分。例如,您可以有3個Web服務器只提供GUI,這個「集羣」將連接到3個應用程序服務器的「集羣」,所有這些服務器都很好地進行負載平衡,並被視爲Web服務器的單個「實例」。同樣,與DAL(數據訪問層)類似的情況。
以這種方式分離層也允許一定程度的整體應用層的「分離」。這允許每個層以不同的方式設置(即,可以使用不同的硬件或不同的OS等),並且只要界面保持一致,如果任何單獨的層被改變,則不應該存在問題。因爲DAL/BLL/UI現在將是獨立的程序集(可能是單獨編譯的DLL或等效的),並且真正地分離了層,而不是僅僅將代碼結構化爲單獨的一個應用程序/項目中的層。
過去,我已經將Web應用程序的業務層公開爲Web服務,並且Web GUI完全是針對該服務編寫的。這使得該公司可以將該產品作爲託管的基於網絡的解決方案進行銷售,客戶可以使用該解決方案,同時還可以銷售與Web服務相同的產品,從而允許客戶將產品的功能集成到自己的內部應用程序中(ala垂直市場解)。
當然,這是平衡的行爲。將各層分離到單獨的機器上會給系統的整體結構帶來一些複雜性。您正確地指出了一些潛在的問題,例如機器之間的流量,如果通信層位於同一臺機器上,現在會增加一些開銷,而這些開銷不在那裏。還有各層之間的數據編組也會增加開銷。當然,在Web服務的情況下,序列化和反序列化複雜對象可能會增加大量開銷並對性能產生負面影響,尤其是在流量非常大的情況下。
根據實際暴露給整個應用程序的用戶的情況,可能需要也可能不需要「較低」層的安全性。如果您只是公開Web GUI,則應將較低層配置爲不可訪問(不是通過Web服務器),但是,如果要公開「業務層」以及Web GUI層,則您將還有額外的負擔來確保您應用程序的多個潛在攻擊「表面」。儘管如此,如果你知道你不需要負載平衡單獨的層,並且你知道你不需要切換出一個層,或者將業務邏輯與Web分開公開用戶界面,它可能比它的價值更努力。
那麼客戶給這個建築選擇的理由是什麼? – SteveD 2009-10-06 14:54:07
他們還沒有完全解釋它...我現在寫這個,所以我會有一些背景,他們可能的原因可能是什麼,當他們做 – John 2009-10-06 18:19:00
可能是有益的。我想知道我們能找到一個真正的例子。 – Leo 2014-11-04 18:21:16