02 | 架构分层:我们为什么一定要这么做?
该思维导图由 AI 生成,仅供参考
什么是分层架构
分层有什么好处
如何来做系统分层
分层架构的不足
课程小结
一课一思
- 深入了解
- 翻译
- 解释
- 总结
软件架构分层是一种常见的设计方式,通过将系统拆分成不同层次,每个层次有独立的职责,协同提供完整的功能。分层设计可以简化系统设计,让不同的人专注于某一层次的事情,提高复用性和横向扩展能力。常见的分层方式包括MVC架构和表现层、逻辑层、数据访问层的设计。分层架构的优势在于简化系统设计、提高复用性和扩展能力,适用于复杂业务和高并发系统设计。文章还介绍了如何进行系统分层设计,强调了理清每个层次的边界以及层次之间的相互依赖。此外,文章还提到了分层架构的不足之处,包括增加代码复杂度和可能的性能损耗。然而,尽管分层架构存在缺陷,但其优势仍然是可以接受的,因此分层架构仍然是一种值得选择的架构设计方式。文章最后总结了分层架构的设计思想,强调了分层架构与一些软件设计原则的契合,以及掌握这些设计思想对于做出更好的设计方案的重要性。文章以提出问题的方式引导读者思考,鼓励读者在留言区与作者交流。
2019-09-2055人觉得很赞给文章提建议
《高并发系统设计 40 问》,新⼈⾸单¥59
全部留言(94)
- 最新
- 精选
- 饭团明白了一些东西,老师比如我做一个接口,这个实现可以放在server层! 之后公司内部调用逻辑可以放在web层!而哪一天公司要开放这个接口,那我最好是新抽象一层出来(一个新的服务)就是开放平台层!这样做的好处是,可以讲自家使用和第三方使用做隔离!比如在提供服务时,为了保证自家接口性能,对开放平台层做限流处理!
作者回复: 👍
2019-09-21250 - fish希望每篇都结合一点点实例程序架构
作者回复: 好的👌
2019-09-20224 - 那一夜老师你好,我之前也看过很多次阿里的代码分层规范,一直对service层和manager层有点混淆不清,所以想请教一下老师我下面理解的分层是不是合理的 1. controller层接收客户端的请求 2. service层调用manager层和dao层处理业务 3. manager主要对service层通用的代码的沉淀,例如对多个dao调用的组合(逻辑意义上的连接查询),以及缓存等中间件的调用,并且在manager层处理事务 4. dao层主要放mybatis逆向工程生成的代码以及自己写的查询方法 不知道自己这样理解正不正确,还有就是事务处理应该放在哪一层,是在manager层还是应该在service层?
作者回复: 在我来看业务逻辑放在manager,service来编排manager的原子服务
2019-09-24523 - can参数校验,放在哪
作者回复: 业务类的校验放在service层,一般性的参数校验可以放在web层,可以通用化
2019-09-21522 - AaronMgetuser之后创建user的案例,如果不加manager层,在service的getuser方法中做以下逻辑判断呢 if(未获取到用户){ this.createuser(); } 这样做有什么不妥吗~~望指教
作者回复: controller层的逻辑有区别,一种是需要创建用户,一种是不需要,需要提供两个service方法,每个方法编排不同的manager层的原子方法。当然也可以提供一个service方法,使用不同的参数来区分。但这是一个简单的例子,引申来看,同一个服务接口,针对不同的场景可能会有一些差异,这种差异要在service层屏蔽,不应该蔓延到controller层
2019-09-2612 - xu晓晨架构不分语言。我司主力语言php 架构至上而下是这样controller+module(service)+class(manager)+dao。第三方的调用服务也都封成基础类来调用了。基本上跟您讲的思路一样呢
作者回复: 是的呢
2019-09-20410 - aaaaaaaaaaaas老师,可以这样理解吗。manager放的都是单一功能的接口,service层去组装manager的接口,这样service层只需要注入manager层的接口就可以了,但是service层接口也会有复用的情况,相当于service还是要互相注入的
作者回复: 是的
2019-11-2828 - Jxin感觉图有点问题。补下个人理解,共同探讨。 1.通用层改名领域层,个人习惯。 2.数据层同领域层也有交互。领域层交互数据层主要做业务;service层交互数据层主要开放接口,提供外部支撑。这块还涉及crud,读与命令分离。 3.第三方和外部接口,进入系统加入一层防腐层,千万别用第三方的实体bean去写自己项目的业务,千万别,千万别。这种依赖外部bean写业务的操作,接手的人深感绝望。 4.防腐层和第三方层也可以直接与service层交互。这里涉及胖领域和瘦领域的权衡了。个人偏向业务重就直接胖领域,没啥业务或跟本没有业务,瘦领域我也不要了,直接service层走你。这里的选择主要看当下业务情况和个人对将来的预期。 5.简单一定优雅,优雅不一定简单。k8s的容器编排很复杂,麻烦,但它的开放思想和架构抽象,真心让人惊叹。
作者回复: 我理解你说的防腐层就是manager层,而我说的manager层也封装了数据访问层,提供原子的服务接口,而service层是对这些原子接口的编排,所以说尽量不要数据层打交道。 当然每个团队可能有更合适的分层方式
2019-09-2338 - 何磊这里有个误导?我们所谓的独立部署并不是按照层次来部署。而是服务。因为不可能一个项目只部署controller,一个服务只部署dao层的。更多的是每一个服务按照这种层次来写。
作者回复: 可以的呀 数据访问层也是可以独立部署的,controller也是独立部署的web服务
2019-09-20167 - W老师,我看阿里分层图中,service层是可以直接调用dao层的,manager层也是可以直接调用dao层的,这两种调用分别是针对什么情况的呢
作者回复: 我理解简单的业务可以不抽取manager,直接调用dao
2019-10-116