一、单层结构不分层
最开始开发项目时,由于需求较少,用一个单独的工程文件就可以满足开发的需求了,不需要进行划分。
二、MVC 分层和三层
到后面需求越来越多,于是就把文件进行分解,怎么分解?有人提出了 MVC 的分层方式。
MVC 分层是一个 3 层结构,将整个应用划分为:
- M:model 模型层,用于封装应用业务逻辑相关数据和对数据处理方法。
- V:view 表现层,把数据展示给用户。
- C:controller,控制器,把不同层组织起来,用来控制程序的流程。
最有名的框架就是 Spring MVC。Spring MVC 架构如下:
如果从业务角度来分 3 层:
- 数据库访问层(DAO)
- 业务逻辑层(Business)
- 表现层(UI)
java 代码的包分层:
- controller:控制层,输出数据到表示层
- dao:数据库访问层,对数据库访问的操作
- entity:model 实体层,把数据库表字段的映射到 java 代码
- service:业务逻辑层business/服务层service,业务逻辑层上面可能还有一个服务层
在 java 项目中,一些资源会放在 resources 里,比如 js,css,html,配置文件等
- resources
- UI(CSS, HTML) 表示层
三、N 层架构
N 层架构是在三层架构上的进一步细分。
(www.herbertograca.com)
- 原生浏览器应用程序,渲染和运行用户界面,向服务器应用发送请求;
- 应用服务器,包括了展现层、应用层、领域层和持久化层;
- 数据库服务器,应用服务器用它来完成数据的持久化。
这个由三层架构变化而来的 N 层架构,尽管用户界面是在客户浏览器渲染和运行,但是用户界面是在存于服务器上并在它上面编译,它解决了
客户端更新问题。
四、领域驱动设计DDD用到的架构
Eric Evans 于 2003 年出版了《领域驱动设计:软件核心复杂性应对之道》,在书中他创造了领域驱动设计方法
五、EBI 架构
EBI 架构(Entity-Boundary-Interactor,实体-边界-交互器)。
Ivar Jacobson 早在 1992 年就在他的著作 Object-Oriented Software Engineering: A use case driven approach中提出了这个模式。
那时,Jacobson 实际上把它叫做实体-接口-控制(Entity-Interface-Control),但是后来改成了 EBI,避免“接口”和编程语言中的结构“接口”混淆,以及“控制”和 MVC 中的控制器混淆。
六、端口和适配器架构(六边形架构)
2005年,Alistair Cockburn构思了端口和适配器架构 (又称六边形架构)并记录在他的博客中。
(www.herbertograca.com)
七、洋葱架构
2008 年 Jeffrey Palermo 提出了洋葱架构 。它在端口和适配器架构中贯彻了将领域放在应用中心。
(www.herbertograca.com)
它明确了端口和适配器中关于依赖的方向:
- 外层依赖内层。
- 内层对外层无感知。
耦合的方向是从外层指向中心,它提供了一个完全独立的对象模型(领域模型),该模型位于架构的核心,不依赖其它任何层次。我们拥有了在不影响内层的情况下改变外层的灵活性。
洋葱架构的关键原则:
- 围绕独立的对象模型构建应用
- 内层定义接口,外层实现接口
- 依赖的方向指向圆心
- 所有的应用代码可以独立于基础设施编译和运行
—— Jeffrey Palermo 2008, The Onion Architecture: part 3
八、整洁架构
Robert C. Martin(大名鼎鼎的 Uncle Bob)于2012年在他的一篇博客中发表了整洁架构的观点,并在一些会议上做了关于该架构的演讲。站在 EBI 架构、六边形架构和洋葱架构的肩膀上的架构。
九、清晰架构
融合 DDD、洋葱架构、整洁架构、CQRS 等的架构。
十、参考
- https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/
- https://herbertograca.com/2017/07/03/the-software-architecture-chronicles/
- https://herbertograca.com/2017/09/07/domain-driven-design/
- https://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
- https://www.jianshu.com/p/d87d5389c92a 洋葱架构(译)
- https://www.jianshu.com/p/395814410cf5 EBI 架构(译)