3 层架构 v. 3 服务器架构
Posted
技术标签:
【中文标题】3 层架构 v. 3 服务器架构【英文标题】:3-tier architecture v. 3-server architecture 【发布时间】:2011-02-06 18:03:42 【问题描述】:我正在构建一个传统的 .NET MVC 站点,所以我有一个自然的 3 层软件架构设置(以视图的形式呈现,控制器中的业务层以及模型和数据访问中的数据层层)。
当我部署此类站点时,它通常在一台服务器上(网站和数据库所在的位置)或两台服务器上(一个 Web 服务器和一个单独的数据库服务器)。
如何实现三服务器架构(WEB、APP 和 DB)? Web 服务器是否只有演示文稿(例如物理视图/aspx 页面),应用服务器将保存配置文件和 bin 文件夹,而 db 服务器将保持原样?
我的问题本质上是,您可以简单地将 /bin 和所有应用程序逻辑从演示视图移到单独的服务器上吗?如果是这样,您如何配置服务器以知道在哪里查找?如果某处有很好的入门读物,或者有人可以告诉我内幕,我将永远感激不尽。
【问题讨论】:
【参考方案1】:MVC 不是三层架构。并非每个解决方案都需要为 3 层或 n 层,但了解区别仍然很重要。 MVC 恰好有 3 个主要元素,但这些元素不能以“分层”方式工作,它们是相互依赖的:
Model <----- Controller
\ |
\ v
---- View
视图取决于模型。控制器依赖于视图和模型。因此,这些多个依赖路径不能用作层。
3 层解决方案通常如下所示:
Data Access <--- [Mapper] ---> Domain Model <--- [Presenter/Controller] ---> UI
Presenter/Controller 在某种程度上是可选的 - 例如,在 Windows 窗体开发中,您通常看不到它,而是有一个“智能客户端”UI,这也可以。
这是一个 3 层架构,因为 3 个主要层(数据、域、UI)中的每一层都只有一个依赖项。传统上,UI 依赖于域模型(或“业务”模型),而域模型依赖于 DAL。在更现代的实现中,域模型不依赖于 DAL。相反,这种关系是倒置的,稍后会使用 IoC 容器注入一个抽象的映射层。无论哪种情况,每个 tier 只依赖于前一个 tier。
在 MVC 架构中,C 是 Controller,V 是 UI(视图),M 是 Domain Model。因此,MVC 是一种表示架构,而不是一种系统架构。它不封装数据访问。它可能不一定完全封装了域模型,可以将其视为外部依赖项。它没有分层。
如果您想在物理上分离层,那么通常通过将域模型公开为 Web 服务(即 WCF)来完成。这为您提供了改进的可扩展性和更清晰的关注点分离 - 域模型字面上可在任何地方重用,并且可以部署在多台机器上 - 但伴随着重要的前期开发成本以及持续的维护成本。
服务器架构反映了上面的 3 层图:
Database Server <----- Web Services <----- Application
“应用程序”是您的 MVC 应用程序,它与 Web 服务共享一个域模型(通过 SOAP 或 REST)。 Web 服务在一个(或多个)专用服务器上运行,而数据库显然托管在它自己的服务器上。这是一个 3 层、3 个服务器的架构。
【讨论】:
【参考方案2】:在某些圈子中,我看到这个讨论被表述为 n 层和 n 层之间的区别,其中“层”在这种情况下可能代表另一台机器。为了有一个使用这个定义的中间层,它必须被托管。例如,如果您有一个服务层,表示层调用它来获取其数据,那么服务层可能位于与表示或数据库不同的机器上。但是,该服务层作为 Windows 服务或 Web 服务托管。即,有一个进程在该机器上侦听请求。因此,您不能简单地将 bin 文件夹移动到不同的机器上并希望能够完成这项工作。我会看看 WCF (Windows Communication Foundation) 来创建这些类型的服务。
【讨论】:
【参考方案3】:ASP.NET MVC 无法帮助您设置 3tier 系统。这实际上只是一种前端模式。
实现多层系统必须解决的主要问题是将对象从一台服务器传输到另一台服务器。您必须找到一种方法来根据传输通道序列化所有对象。这会变得很慢,并且开发变得更加复杂。
有一个单独的应用程序服务器的原因:您可能在其中包含其他应用程序需要的逻辑,或者应用程序服务器可能具有与 Web 服务器不同的权限。但是很难想象一个高流量的网站,所有请求都会导致调用远程应用程序 - 服务器。
【讨论】:
【参考方案4】:下一个逻辑扩展将是两台 Web 服务器和一台数据库服务器。
最终在添加许多 Web 服务器之后,可能值得添加一个服务层。
您可能还想在扩展时添加分布式缓存、会话状态服务器、电子邮件服务器和其他专用服务器。
【讨论】:
【参考方案5】:所以你的问题似乎是......
“你能简单地将 /bin 和所有应用程序逻辑从演示视图移到单独的服务器上吗?”
如果我理解正确,我相信您的 bin 文件夹中的文件将是您的 asp.net 页面的编译代码。如果是这样的话,不,我相信它们需要与 asp 页面在同一台机器上。
如果您希望将业务逻辑与表示层放在单独的机器上,您需要将该代码包装到单独的 dll 中并通过肥皂或其他协议公开它..然后调用这些 SOAP 公开的 dll表示层代码中的其他服务器。
【讨论】:
以上是关于3 层架构 v. 3 服务器架构的主要内容,如果未能解决你的问题,请参考以下文章