背景
一个问题,我们要把它搞清楚。需要深入的思考,从演进出发,从核心出发,探索它的本质。这样才能在工作中举一反三。探索本质的思想,对于架构者来说尤其重要。本文想探讨架构模式之分层设计的本质和核心。以便于更好的将正确的方式应用到项目中。
为什么分层
三层架构,多层架构我们听到的很多,那有没有考虑过为什么需要分层呢?不分不是更简单更方便吗,何必大费周折搞出一个分层架构?
举一个例子,如果我们开一个饭店,一个人把采购,炒菜,上菜全部做了,一个月也有不错的收入。只是会比较忙,很辛苦。因为自己的能力毕竟有限,有时候也会把事情搞错,再比如哪天生病了,生意就没法做了。当人多了的时候就忙不过来了,大批的顾客就会跑到别人的饭店。这时候,我们就会考虑雇人,人多了就会考虑分工的问题,有的负责采购,有的负责炒菜,有的负责上菜,这样实际分层就产生了。
分层本质是解耦和分类,解决职责不清的耦合问题,解决职责过大不利于发展的问题,在分层的基础上为团队分工和协作提供了依据。
分层的好处
1、 隔离业务复杂度和技术复杂度,可独立变化发展
2、 职责清晰,减少耦合,提高复用性,可维护性,扩展性(部分)
3、 有利于团队分工协作
分层的不足
1、 代码理解的复杂度高了
2、 性能低了,原本一次完成的事情,需要调多层实现
3、 管理成本高了,需要考虑每层的边界,代码结构和团队情况
如何分层
分层设计也是一种抽象的思想,每层代表一个关注点,多层之间的协作实现了整个调用链路。
1、 基于职责(关注点)不同进行分层
2、 基于变化的程度进行分层
3、 同一抽象层次的组件放在同一层
分层中的设计思想
如果用一句话描述的话,个人理解的就是高内聚,松耦合。展开讲的话有以下几点
1、 单一职责原则,分离关注点,每个层的职责是单一的,只做一类事情;
2、 开闭原则:隔离变化,对扩展开放,对修改关闭;
3、 依赖倒置原则:基于接口(抽象)编程,层与层之间的调用都应该依赖抽象而不是具体。
分层的方式
一般讲的都是逻辑分层,实际也存在物理层面进行分层。
物理分层(Tier)
主要从物理元素切入,个人理解从物理层面有两类,一类从部署的角度考虑,一类从项目结构角度。
从部署角度考虑,典型的J2EE N Tire架构,如下图:
大型分布式系统的分层(简化版),如下:
从项目结构考虑(很少有人这么讲)1、项目的分包结构;2、maven中的父子项目。
逻辑分层(Layer)
大家常见的分层方式,典型的有三层,四层,七层,如下。
其中三层和四层从结构上看相差不大,主要是在三层数据访问层的基础上,扩展了如服务,设备等的调用。但是从架构层面,已经有比较大的改进。
一个架构设计到这个程度就可以了吗?远远不够,下一步需要对分层架构进行细化。
分层详解
在做设计的时候,需要将每一个组件,每一个角色落地,让各个参与者都能清楚,明白。以四层架构为例,详细介绍每层的关注点和设计。
1、 明确各层的关注点和职责。
(1) 表现层
关注点:用户交互和页面渲染
职责:接收用户输入,调用业务逻辑层,接收业务逻辑返回实现页面渲染。
(2) 业务逻辑层
关注点:领域模型和业务逻辑
职责:系统的核心部分,实现业务逻辑和业务规则,实现事务控制,调用资源访问层;
(3) 资源整合层:
关注点:各类资源的调用和隔离
职责:整合数据访问(读写),整合外部接口,整合设备交互。
2、 明确各层的设计(代码级)
上图已经把代码层面的组件画出来了,按照这个方案就可以进行开发了。
(1) VO,BO,Entity可以使用同一套实体类也可以分开,比较推荐的做法是VO和BO使用一套,Entity使用一套。
(2) 业务逻辑层:抽象了Logic接口,用于定义每个服务方法的步骤,该部分会有一些通用的Logic用于多个服务方法复用。Service会调用具体的Logic实现逻辑逻辑,达到了最大程度的解耦和复用。
(3) 业务逻辑层:对于Logic内复用的,可以下沉到Manager中。
(4) 业务逻辑层:还可以在Servide的基础上封装一层Façade,用于聚合多个Servie方法的调用。
(5)资源整合层:包含传统的数据库访问层结构和,调用接口的实现。调用接口使用代理模式实现,隔离了外部差异。复杂的话,可以考虑使用策略+适配器的方式。
3、 层之间的调用关系
标准的调用是严格按照上次调用下层的顺序,实际也可以跨层调用(根据团队规范,约定好)。但是,应避免循环调用。
物理分层与逻辑分层的关系
逻辑架构会以不同的方式,表现到物理架构中。拿分层来讲,常见的方式有全部逻辑分层一起部署,逻辑分层部分分开部署和逻辑分层完全分开部署。分开部署后会涉及到RPC调用和服务高可用等问题。
文章总结
分层架构是项目中用到的最多的架构模式之一,核心思想是归类和解耦,实现有多种方式,不应局限于三层,四层,也可能是两层,五层,六层,具体以实际的项目为准。
本文希望由浅入深的介绍分层相关的知识,使大家不仅知道分层,还知道为什么分,怎么分。从概念到落地是架构师必须跨过的一道坎。通过了这个坎就可以将架构知识灵活的运用到项目中,实现能力的升华,成为真正的架构师。
实际每一层还会有一些变化,不同的设计模式和架构模式实现的分层和代码的组织方式也是不同的,没有完全一样的架构,合适的就是最好的。