N tier architecture 三层体系结构有用吗?

N tier architecture 三层体系结构有用吗?,n-tier-architecture,N Tier Architecture,十多年来,我们一直在构建三层体系结构。将表示层、逻辑层和数据层分开,可以让我们在需要时单独交换每一层,无论是通过更改的需求还是新的技术 我从未见过它在实践中起作用… 主要是因为(至少)以下原因之一: 三层概念仅在源代码中可见(例如Java中的包命名),然后将其部署为一个捆绑在一起的包。 表示每一层的代码都以其自己的可部署格式很好地捆绑在一起,但随后被投入到相同的流程中(例如“企业容器”)。 每一层都在自己的过程中运行,有时甚至在不同的机器上运行,但通过静态特性,它们相互连接,替换其中

十多年来,我们一直在构建三层体系结构。将表示层、逻辑层和数据层分开,可以让我们在需要时单独交换每一层,无论是通过更改的需求还是新的技术

我从未见过它在实践中起作用…

主要是因为(至少)以下原因之一:

  • 三层概念仅在源代码中可见(例如Java中的包命名),然后将其部署为一个捆绑在一起的包。
  • 表示每一层的代码都以其自己的可部署格式很好地捆绑在一起,但随后被投入到相同的流程中(例如“企业容器”)。
  • 每一层都在自己的过程中运行,有时甚至在不同的机器上运行,但通过静态特性,它们相互连接,替换其中一层意味着破坏所有层。
因此,您通常最终得到的是一个单片的、紧密耦合的系统,它不能提供它所承诺的体系结构

因此,我认为“三层架构”完全是用词不当。它带来的真正好处是代码在逻辑上是合理的。但这是在“写入时间”,而不是在“运行时间”。更好的名字应该是“责任分层”。无论如何,“架构”这个词是误导性的

你对此有何看法?如何实现可工作的三层体系结构?我指的是一个信守承诺的层:允许在不影响其他层的情况下插入一层。该系统应该在这一点上生存下来,并在之后处于一个定义良好的状态


谢谢

三层体系结构的一个示例是典型的数据库驱动web应用程序:

  • 最终用户的web浏览器
  • 服务器端web应用程序逻辑
  • 数据库引擎

  • 分层体系结构(包括逻辑层和物理层)的真正目的不是使替换层变得容易(这是非常罕见的),而是使在一个层内进行更改变得容易,而不会影响其他层(并且,为了促进可伸缩性、一致性和安全性),这一点在我们周围一直有效。

    在每个系统中,有一个刚开始构思的漂亮、优雅的体系结构,然后是最终投入生产时的毛茸茸的混乱,充满了数百个错误修复和特殊案例处理程序,以及其他典型的讨厌的更改,以解决设计过程中未实现的特定问题


    我认为您所描述的问题根本不是三teir体系结构所特有的。

    任何操作系统都会有类似的体系结构,否则它将无法工作。表示层独立于硬件层,硬件层被抽象为实现特定接口的驱动程序。数据处理使用的逻辑会根据读取的数据类型而变化(比如NTFS与FAT32、EXT3与CD-ROM)。Linux可以在任何硬件上运行,它的外观和行为都是一样的,因为各层之间的抽象将彼此隔离,不受单个层中的更改的影响。

    一旦您接受了n层的主要好处——即可扩展性、逻辑一致性、,安全性——不可能通过其他方式轻松实现,是否可以在不破坏其他层的情况下直接替换任何一层的问题更像是问蛋糕上是否有糖霜。

    如果您没有看到它工作,您可能只是运气不好。我从事过从一个web服务(逻辑)服务多个UI(表示)的项目。此外,我们通过配置(数据)交换了数据提供程序,以便在更高的环境中开发和使用Oracle时使用低成本数据库


    当然,总是会有一些重复—可能在UI中添加响应验证,然后在逻辑层中再次验证—但总的来说,一个干净的分离是可能的,而且很好使用。

    三层方法的最大实际好处之一是,它可以轻松地拆分工作。您可以很容易地让一个DBA和一两个业务任意列表构建一个数据层,一个传统的程序员构建服务器端应用程序代码,一个图形设计师/web设计师构建UI。当然,这三个团队仍然需要沟通,但在大多数情况下,这可以让开发更加顺利。在这方面,我看到三层方法每天都在可靠地工作,这对我来说已经足够了,即使我不能指望“可互换部件”,可以这么说。

    完全同意。我只是说“三层架构”这个术语是误导性的。“它承诺的太多了。”拉乌尔松:我不确定它是否承诺。“体系结构”这个词是单数的——它不是“三个独立的体系结构通过一个通用的、经得起未来考验的协议进行通信”@本:是的。很可能是我自己主观上的误解…事实上,我认为从高层次上来说,这就是海报所要寻找的。3层具有明确的边界和界面。我相信,他只是在寻找一个在一个过程中完成的例子。我以为他在抱怨,因为/当它在一个过程中完成时,它就不算了:所以这是一个在单独的过程中(通常在三台单独的机器上)完成的例子。如何利用单片系统获得可伸缩性?您构建的是n层的,您运行的通常是一组同步通信的应用程序,因此存在“最薄弱环节”的问题。我将尝试回答这个问题-当您设计一个系统以将处理负载分布到各个层并设计系统以使其组成组件异步通信时,n层体系结构有助于扩展。