现在的大部分 Web 框架都是使用金字塔式的分层架构,一般这种应用都是阻塞同步 IO 模型的编程实现,理解这种分层架构模型的实质有助于理解框架。

因为万变不离其宗,理解这种架构后你不管这种模型如何变化实际上都是在遵守一些约定和规则,那么理解这个模型,只要这个框架是这种架构那么你都会掌握的很快。

首先我们从最简单的 MVC 三层架构说起。

实际上,一般框架分层就是这种分层的,这种分层模型使用时通过一个入口文件启动框架服务,注册一些框架依赖,然后通过路由分发将请求分发到各个控制器里去,一般逻辑写在控制器层,模型层做数据处理,视图层负责展现。

随着项目变大,协作人数变多,这种分层会不太能适应需求,那么我们可以通过增加分层来解决问题。

我们在模型层和控制器层中增加服务层,通过依赖注入的方式将控制反转,能解决扩展和重用的问题,但随着项目继续扩大,我们又要增加一层。

我们再分一层,将数据修改获取逻辑放到储藏库层,模型只负责模型定义,这样多个程序员就可以工作在不同的层上。

理论上我们可以无限分层,不断的拆分将业务分层拆的更细。但是有的场景中我们需要做一些操作其实不能很好的分层,因为有的业务可能用到,有的业务可能不会用到,同时由于分层我们制造了许多组件和分层之间的依赖,在这样的系统中面向对象设计和编码变的重要。

此时引进了一个新的概念 AOP ,既面向切面编程

上图的蓝色就是切面,面向切面编程,这种编程方法就是在需要的地方实现一个切面,把一些需要做但不是每个业务都要做的东西放到这里去做,如中间件、过滤器、拦截器、事件通知、观察者都算是这种切面的实现之一。

总结

金字塔分层模型是阻塞 IO 编程的常用处理方式。

分层会带来业务低耦合及增强程序复用性,但同时也会带来业务逻辑代码变得复杂。

面向对象编程时为了解决大型项目的复杂性问题而产生的编程方法,有些人说这个不重要或者没有用很有可能是做的项目还不够大还不够复杂,或者是根本不涉及到协作开发的原因,亦或者是真的是要使用底层语言做高性能的开发,而语言本身不支持。

金字塔式架构开发,业务平行展开难度较大,这种架构在人员分组上 5-7 人一般会达到极限,此时即使增加人手也不会增加开发速度和效率。解决这个问题的就是微服务或者是扁平化的基于消息传递的面向消息编程。

世界上不止阻塞 IO 编程,还有多线程、协程,也有非阻塞 IO 异步编程语言,它们使用的编程模型和金字塔分层模型是有区别的,但在理解和使用上难度更高些。