1.什么是分层架构
将系统纵向的拆分为几层,每个层次有独立的功能,多个层次协同提供完整的功能
常见的分层模型
名称 | 实现细节 | 图片 |
---|---|---|
MVC | Model View Controller | |
web+service+dao | 表现层:展示用户指令 逻辑层:复杂业务的具体实现 数据访问层:处理与存储间的交互 |
分层的例子
名称 | 实现细节 | 图片 |
---|---|---|
OSI七层网络模型 TCP/IP四层协议 | 网络层:负责端到端的寻址与建立连接 传输层:端到端的数据传输 相邻两层会有数据交互 隔离关注点,不同的层专注不同的事情 | |
Linux文件系统 | VFS:虚拟文件系统,屏蔽系统间的差异 层次是对下层不同实现的抽象 |
2.分层的优点与缺点
分层的优势 | 分层的劣势 |
---|---|
分层可以简化系统设计,不同的人专注某一层的事情 技术大盘:API,中台,基础架构 | 增加代码的复杂度 简单的查询,需要在每个层次间进行数据传递 |
分层可以有很高的复用性 中台、biz-lib、biz-common | 每个层次单独部署,增加网络交互 |
分层可以便于做横向扩展 针对某一层的瓶颈进行扩展 | CPU耗时(增加机器),磁盘读写慢(SSD).... |
3.如何分层
需要考虑清楚分层的边界问题
因需求变更和业务复杂度,导致分层模糊
终端显示层:各端模板渲染并执行显示的层。当前主要是 Velocity 渲染,JS 渲染, JSP 渲染,移动端展示等。
开放接口层:将 Service 层方法封装成开放接口,同时进行网关安全控制和流量控制等。
Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
Service 层:业务逻辑层。
Manager 层:通用业务处理层。这一层主要有两个作用,其一,你可以将原先 Service 层的一些通用能力下沉到这一层,比如与缓存和存储交互策略,中间件的接入;其二,你也可以在这一层封装对第三方接口的调用,比如调用支付服务,调用审核服务等
DAO 层:数据访问层,与底层 MySQL、Oracle、HBase 等进行数据交互。
外部接口或第三方平台:包括其它部门 RPC 开放接口,基础平台,其它公司的 HTTP 接口
Manager 层提供原子的服务接口(多次调用结果一致),Service 层负责依据业务逻辑来编排原子接口。
4.总结
分层架构是软件设计思想的外在体现,是一种实现方式。
单一原则:每一层的拥有单一的职责
迪米特法则:数据的交互不能跨层,必须在相邻层间进行
开闭原则:将抽象层与实现层分离,抽象层是对实现层共有特征的归纳总结(不可修改),具体实现无限扩展(随意替换)
当某一层复杂度过高后,将其拆分为多层