目录
一、什么是分层架构
在系统从0到1的阶段,为了让系统快速上线,我们通常是不考虑分层的。但是随着业务越来越复杂,大量的代码纠缠在一起,会出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动一处就牵一发而动全身等问题,需要对系统进行分层。
“MVC”(Model-View-Controller)架构。它将整体的系统分成了Model(模型),View(视图)和Controller(控制器)三个层次,也就是将用户视图和业务处理隔离开,并且通过控制器连接起来,很好地实现了表现和逻辑的解耦,是一种标准的软件分层架构。
另外一种常见的分层方式是将整体架构分为表现层、逻辑层和数据访问层。
比如在构建项目的时候,我们通常会建立三个目录:Web、Service和Dao,它们分别对应了表现层、逻辑层还有数据访问层。
- 表现层 顾名思义嘛,就是展示数据结果和接受用户指令的,是最靠近用户的一层;
- 逻辑层 里面有复杂业务的具体实现;
- 数据访问层 则是主要处理和存储之间的交互。
Linux文件系统也是分层设计的,从下图你可以清晰地看出文件系统的层次。
二、分层的好处
- 分层的设计可以简化系统设计,让不同的组件专注做某一层次的事情
- 分层之后可以做到很高的复用
- 分层架构可以让我们更容易做横向扩展
三、如何来做系统分层
当业务逻辑简单时,层次之间的边界的确清晰,开发新的功能时也知道哪些代码要往哪儿写。但是当业务逻辑变得越来越复杂时,边界就会变得越来越模糊。
任何一个系统中都有用户系统,最基本的接口是返回用户信息的接口,它调用逻辑层的GetUser方法,GetUser方法又和User DB交互获取数据,就像下图左边展示的样子。
这时,产品提出一个需求,在APP中展示用户信息的时候,如果用户不存在,那么要自动给用户创建一个用户。同时,要做一个HTML5的页面,HTML5页面要保留之前的逻辑,也就是不需要创建用户。这时逻辑层的边界就变得不清晰,表现层也承担了一部分的业务逻辑。
可以将原先的三层架构细化成下面的样子
- 终端显示层:各端模板渲染并执行显示的层。当前主要是 Velocity 渲染,JS 渲染, JSP 渲染,移动端展示等。
- 开放接口层:将Service层方法封装成开放接口,同时进行网关安全控制和流量控制等。
- Web层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
- Service层:业务逻辑层。
- Manager 层:通用业务处理层。这一层主要有两个作用,其一,你可以将原先Service层的一些通用能力下沉到这一层,比如与缓存和存储交互策略,中间件的接入;其二,你也可以在这一层封装对第三方接口的调用,比如调用支付服务,调用审核服务等。
- DAO层:数据访问层,与底层 MySQL、Oracle、HBase 等进行数据交互。
- 外部接口或第三方平台:包括其它部门 RPC 开放接口,基础平台,其它公司的 HTTP 接口。