在当今复杂多变的软件开发领域,分层架构作为一种经典且广泛应用的设计模式,为众多系统提供了清晰的结构和高效的运作方式。它按照不同产品和不同的核心能力将系统分为多层,每一层都承担着特定的职责,相互协作,共同推动整个系统的运行。
1、什么是分层架构
分层架构是一种将系统按照不同功能和职责划分为多个层次的架构模式。其中,比较核心的两层是业务产品层和核心能力层。业务产品层按照不同业务垂直切分系统,它直接面向具体的业务需求,负责根据不同的业务场景组装各种能力,以支持各种业务流程。核心能力层则按照不同能力水平切分系统,它提供了一系列可复用的基础能力,这些能力相对稳定且通用,为业务产品层提供支撑。
这种架构的核心思想是将不变和变化的分开。不变的核心能力向下沉淀,形成稳定的基础支撑;变化的业务需求则向上组装,通过灵活组合核心能力来满足不同的业务场景。简单来说,业务产品层就像是一个“组装车间”,使用核心能力层提供的“零部件”来构建出满足各种业务需求的“产品”。当业务相对简单时,这种架构能够很好地支撑业务发展,通过清晰的分层和职责划分,提高系统的可维护性和可扩展性。
2、如何进行分层架构
分层架构是一种将系统按照一定的规则分类并组装成多层架构的设计方法,通过明确各层的职责和相互关系,实现系统的清晰结构和高效运作。以下是对分层架构的详细阐述,包括每一层的功能、职责以及它们之间的协同关系。
2.1、 分层架构的层次划分
分层架构就是把系统按照一定的规则分类并组装出多层架构。比如分为渠道层、业务产品层、核心能力层、基础能力层和运营支撑层。
渠道层:按照流量垂直切分系统,包括负责TO C 流量的无线渠道系统、负责TO B 流量的对外开放系统、TO P 流程的批处理任务系统。
业务产品层:按照业务垂直切分系统,可以按照不同的业务切分,如信用贷业务、担保业务、提前收款业务等。也可以按照业务的全流程切分,如贷前产品系统和贷中产品系统等。
核心能力层:按照核心能力水平切分系统,如放款和还款等。
基础能力层:按照基础能力水平切分系统,如数据采集和特征计算等。
运营支撑层:提供给内部员工使用的后台系统,包括技术运营系统和增长运营系统。技术运营系统用于技术研发提效,比如自动回归、自动联调等。增长运营系统用于业务方提效率和提效果,如活动运营工具、辅助圈人和自动复盘等。
2.2、分层架构的设计原则
在进行分层架构设计时,需要遵循以下原则,以确保系统的可维护性、可扩展性和高效性。
高内聚、低耦合:每一层都应该具有高内聚性,即层内的功能和逻辑紧密相关,形成一个有机的整体。同时,各层之间应该保持低耦合性,即层与层之间的依赖关系尽量减少,通过明确的接口进行交互。这样可以提高系统的可维护性和可扩展性,降低修改和扩展的成本。
明确的职责划分:每一层都应该有明确的职责,避免职责重叠和模糊。通过明确的职责划分,可以提高系统的可理解性和可维护性,同时也便于团队协作和分工。比如能力层能承接的尽量能力层承接,领域实体是谁管理的就是谁的系统承接。
适当的抽象层次:每一层的抽象层次应该适当,既不能过于抽象,也不能过于具体。过于抽象的层可能会导致实现难度增加,性能下降;过于具体的层可能会导致灵活性不足,难以适应变化。通过适当的抽象层次,可以平衡系统的灵活性和性能,提高系统的可扩展性和可维护性。系统不应该拆分过多,能合并的尽量合并,否则一个业务需求串联的系统太多会有性能问题,因为中间会经过N次RPC调用。
2.3、分层架构的优势
分层架构之所以被广泛应用,是因为它具有诸多显著的优势。
首先,它提高了系统的可维护性。由于系统被划分为多个层次,每一层都有明确的职责,当需要对系统进行修改或维护时,开发者可以专注于特定的层次,而无需深入到整个系统的复杂逻辑中。这种分层的方式使得系统的结构更加清晰,降低了维护成本。
其次,分层架构增强了系统的可扩展性。随着业务的发展和需求的变化,新的业务功能可以通过在业务产品层添加新的组装逻辑来实现,而无需对核心能力层进行大规模的修改。这种灵活的扩展方式使得系统能够快速适应变化,满足不断增长的业务需求。
此外,分层架构还有助于提高系统的复用性。核心能力层提供的通用能力可以在多个业务产品中复用,减少了重复开发的工作量,提高了开发效率。同时,这种复用性也使得系统的质量更加稳定,因为经过多次复用和验证的核心能力通常更加可靠。
3、分层架构的挑战和优化
随着业务多元化的发展业务越来越复杂时,分层架构也逐渐暴露出一些问题,这些问题在一定程度上限制了分层架构的进一步应用和发展。这个架构面临以下几个问题
3.1、分层架构的挑战
问题一:产品层开发强依赖于专家经验。业务越复杂产品层组装成本越高,而且强依赖于专家经验,开发新人很难组装出新产品。这个问题我用乐高来举个例子,如果核心能力比作是乐高积木块,那么产品就是用乐高积木块拼凑出来的成品,复杂的乐高成品如果没有组装说明书(等同我们的系分方案)的情况下,我们是很难用基础块拼凑出来的,这个要有很强的专家经验,而且基础块越多对专家经验要求越高。在实际的软件开发中,这意味着产品层的开发效率可能会受到限制,新成员难以快速融入团队并贡献价值。
问题二:核心能力过于原子不易于使用。继续用乐高举例子,乐高的积木块就是过于原子,所以每个人拼装成品的成本都很高,乐高最新出版的对角巷有几千个积木块,拼装成功需要几天时间,像房子里的凳子、桌子和屋顶等是不是可以出厂就做成组件,不需要每个人重复拼装,当然乐高的乐趣就是在于组装的过程,但是如果从组装效率角度考虑,封装成基础组件组装效率更高。在软件开发中,这意味着核心能力层需要在原子能力和组件化之间找到平衡,以便更好地支持业务产品层的开发。
问题三:上下游协同复杂度高。因为业务的多变性,一个业务需求可能贯穿产品层和核心层,产品层和核心能力层之间的协同工作复杂度较高。双方经常为了一段逻辑是放在产品层还是能力层而讨论很久。如果能力层提供的能力过于原子化,产品层就需要进行大量的组合工作,这使得产品层开发希望将通用逻辑沉淀到能力层。然而,如果提供的能力过于粗放,就会与具体场景相关,不能适用于所有场景。而能力层开发则希望先将这种逻辑放在产品层进行“孵化”,但如果所有逻辑都放在产品层,会导致产品层变得过于沉重,大部分逻辑都集中在产品层,违背了分层架构的初衷。
3.2、分层架构的优化策略
针对分层架构面临的这些问题,我们可以采取一些策略来优化和改进。
避免过度分层:分层架构虽然可以提高系统的可维护性和可扩展性,但过度分层会导致系统复杂度增加,开发和维护成本上升。因此,在进行分层架构设计时,应该根据实际需求合理划分层次,避免过度分层。
核心能力的组件化封装:核心能力层可以通过组件化封装来提高使用效率。将一些常见的、可复用的逻辑封装成组件,提供更高级别的抽象,这样可以减少产品层的组合工作量。同时,组件化封装也有助于提高系统的稳定性和可靠性,因为经过封装的组件通常经过了更严格的测试和验证。在设计组件时,需要充分考虑通用性和灵活性,以满足不同业务场景的需求。
建立有效的协同机制:为了降低产品层和核心能力层之间的协同复杂度,可以建立有效的协同机制。首先,明确双方的职责和接口,制定清晰的规范和标准,避免因职责不清而导致的冲突和误解。其次,加强沟通和协作,定期召开跨层会议,及时解决双方在开发过程中遇到的问题。此外,可以采用敏捷开发方法,通过快速迭代和持续集成,及时反馈和调整,确保双方的工作能够紧密配合。
4、总结
分层架构作为一种经典的架构模式,在软件开发中具有重要的地位。它通过将系统划分为多个层次,实现了职责的清晰划分和系统的高效运作。
然而,随着业务的复杂化,分层架构也面临了一些挑战,如产品层开发依赖专家经验、核心能力过于原子化以及上下游协同复杂度高等问题。
通过核心能力的组件化封装以及建立有效的协同机制等策略,可以有效地解决这些问题,进一步优化分层架构,使其更好地适应复杂多变的业务需求,为软件系统的开发和维护提供更加坚实的基础。