这是我对系统架构中分层的自问自答,也是我对系统分层的理解。
Q. 为什么要系统分层(Why layered system architecture)
A. 系统分层不是软件系统才有,比如计算机网络中就由OSI 7层网络模型。 在所有的系统组件中,每个组件的关注点是不一样,相互的依赖程度不一样,变化的频率也是不一样的。比如,有些组件关注通讯、事务、安全(当然这些都被做成中间件产品了,比如WebShpere,WebLogic),而这些基础的东西当然应该放到基础服务层(Infrastructure Layer);从依赖程度上说,依赖紧密的可以放到同一层;从事物变化频率上来看,UI变化时最快的,然后是流程和业务逻辑,再是数据,然后才是基础服务。如果我们不加区分地把代码写到一起会导致系统变成A big ball of mud http://www.laputan.org/mud/。
Q. 为什么要独立出领域层(Why isolating domain layer)
A. 那么如何分层呢?从DDD(Domain Driven Design)观点来看。一个系统复杂有很多原因,比如硬件(分布式部署),软件(API,维护,配置复杂)等等。同时如果问题领域复杂,我们构建的软件系统就复杂,这就是DDD中说得根本性复杂(essential complexity)。 请看《A big ball of mud》这篇论文中的描述
Complexity: One reason for a muddled architecture is that software often reflects the inherent complexity of the application domain. This is what Brooks called "essential complexity" [Brooks
1995]. In other words, the software is ugly because the problem is ugly, or at least not well understood .
为了隔离这种根本性的复杂度,我们需要在我们的系统架构中区分领域层,使得我们让我们更关注问题本身。
Q. 除了领域层还有什么需要提及的
A. OOA/D/P 让我们很容易抽象现实世界(比如问题领域)。但是OO不是对现实世界的完全映射,比如MQ。 我们在描述问题领域的时候,我们通常会说下一个订单,但是下订单是通过什么技术手段是没有提及的。在异步系统中,我们往往采用MQ作为一个手段。我们无法在领域模型中描述MQ这样的东西。这种情况下,MQ,Buffer,Cache等等往往以Service形式存在于我们的系统架构和设计中的。
Q. DDD中系统分层是怎样的呢
A. 由上到下分为 User Interface、Application、Domain、Infrastructure