架构设计是一种艺术,它涉及对系统进行合理分解与有效整合的过程。首先,通过’分离关注点’的策略,将复杂的系统拆解为多个相对独立的部分,这有助于我们更清晰地理解和管理各个组成部分。接着,在明确的原则和规则的指导下,对这些分离出来的组件进行精心设计和构建,以实现高内聚性。高内聚性意味着每个组件都紧密围绕其核心功能进行设计,减少了不必要的功能冗余。 然后,根据系统的实际需求,将这些高内聚的构件通过低耦合的方式相互连接起来。低耦合性确保了组件之间的依赖性降到最低,从而提高了系统的灵活性和可维护性。最终目标是构建一个既具有高内聚性又保持低耦合性的软件系统,这样的系统不仅易于理解和开发,而且在面对需求变更时,也能快速适应和扩展。 图片 在软件开发过程中,应对软件复杂性是一项重要任务。软件复杂性可以通过功能性需求和非功能性需求两个维度进行分类,并针对性地采取不同的策略来解决。以下是对软件复杂性及其应对策略的详细分析:

软件系统复杂性概述

软件需求通常分为两大类:

  • 功能性需求:指产品需要实现的具体业务功能,例如用户登录、数据查询、订单添加等。- 非功能性需求:指在实现功能的同时,系统必须达到的技术指标,如性能、可靠性、安全性、可维护性和易用性等。 这两类需求分别对应软件系统的两种复杂性:
  • 业务复杂性:由业务逻辑和规则的复杂程度决定,与业务规模、结构和变化性密切相关。- 技术复杂性:由使用的技术复杂度决定,包括数据库、网络协议、中间件和应用框架等。

应对策略

1.1 业务复杂性应对

业务复杂性主要来源于业务领域本身,以下是几种应对策略:

  • 模块化设计:将系统分解为多个模块,每个模块负责特定的业务逻辑。- 业务流程管理:明确业务流程,使用流程图等工具进行可视化管理。- 规则引擎:使用规则引擎来管理和应用复杂的业务规则。

1.2 技术复杂性应对

技术复杂性主要与软件架构和所使用的技术有关,以下是一些解决技术复杂性的方法:

  • 选择合适的技术栈:根据项目需求,选择最适合的技术栈。- 架构设计:采用合适的架构模式,如微服务、事件驱动等,以降低系统的耦合度。- 性能优化:对系统进行性能评估和优化,确保满足性能要求。 通过上述策略,可以有效地管理和降低软件系统的复杂性,提高开发效率和系统质量。 图片 在软件开发过程中,业务需求的实现往往需要考虑系统的复用性和扩展性。以下是对这两个概念以及业务代码变化原因和应对策略的详细阐述:

系统复用性和扩展性

复用性:指的是组件或模块能够在不同场景下重复使用的能力。高复用性设计可以显著降低开发和维护成本,提高开发效率。组件粒度越小,复用性越高,功能结构越清晰,逻辑调整越便利。相反,代码重复率是系统腐化的重要标志。 扩展性:指在不改变现有系统结构的前提下,方便地添加新功能或修改现有功能的能力。高扩展性系统能够适应未来需求变化,降低维护成本。

业务代码变化的原因

  1. 线上bug:虽然线上bug较少,但对业务系统的影响巨大。快速修复问题时,往往采用非最佳方案,导致代码中出现“补丁”,成为潜在的定时炸弹。
  2. 新功能需求:新功能需求是代码膨胀的主要推动力。开发人员将需求转化为代码,不断添加到代码库中,导致代码库快速膨胀。
  3. 创新性业务:虽然看似可以摆脱历史包袱,但新建系统、仓库和服务会使整个系统变得复杂,甚至难以明确服务间的调用关系。

应对业务复杂性的策略

  1. DDD(领域驱动设计):基于领域模型,使用面向对象的特性实现逻辑封装和复用,结合业务概念和实现组件,降低沟通成本。
  2. 重构:随着业务变化,对原有代码结构进行优化,以扩展的方式添加新功能,不断调优代码结构。
  3. TDD(测试驱动开发):在优化代码结构的同时,确保不破坏原有业务逻辑。

技术复杂性

技术复杂性是软件开发中的另一个重要方面,它涉及到系统架构、技术选型、性能优化等多个层面。技术复杂性的管理同样需要细致的规划和策略。 在面对业务和技术的双重复杂性时,开发者需要采取合适的设计原则和开发实践,以确保系统的可维护性和可扩展性。 图片 在构建软件系统时,非功能性需求的实现同样重要,它关乎到系统的稳定性和效率。本文档将深入探讨如何通过技术手段提升系统的高性能和高可用性,以及如何应对技术复杂性的增加,并最终介绍六边形架构如何帮助实现业务与技术的分离。

高性能与高可用性

高性能高性能意味着在相同的资源条件下,系统能够运行得更快或处理更多的任务。这通常涉及到优化算法、减少延迟和提高数据处理能力。

高可用性高可用性则是指系统能够持续不断地提供服务,减少因服务中断而造成的损失。

技术复杂性增加的原因

用户和并发量随着用户数量和并发请求的增加,系统所承受的压力也随之增大,任何性能瓶颈都可能导致严重的后果。

系统数据量数据量的增长,特别是当单表数据量达到亿级时,对系统的访问速度和异常恢复能力都提出了更高的要求。

机器规模随着机器规模的扩大,硬件故障的频率也会增加,这可能成为实现高可用性的障碍。

解决策略

引入新技术面对数据库性能瓶颈,可以采用分库分表或TiDB等技术来提升性能。

采用新方案面对数据库读压力,可以通过读写分离、增加缓存等方案来缓解压力。

业务与技术的分离

为了减少业务和技术之间的相互影响,需要一种架构来实现它们的分离,使得技术调整不会影响业务模型,业务调整也不依赖于技术。

六边形架构

六边形架构,源自《实现领域驱动设计》一书,与洋葱架构相似,都能有效实现业务与技术的分离。在命令侧(Command Side)采用领域驱动设计(DDD)作为解决方案,而六边形架构则作为顶层架构。

六边形架构的特点六边形架构的特点在于其能够灵活地应对外部变化,同时保持内部业务逻辑的稳定。

图片

六边形架构概述

六边形架构是一种软件架构模式,它通过将业务逻辑与技术实现分离,来应对业务和技术的复杂性。这种架构由两个六边形组成:内六边形代表业务域,外六边形代表技术域。

1. 内六边形:业务域

1.1 DDD(领域驱动设计)DDD 是一种设计方法,它通过构建领域模型来解决业务复杂性。战术模型包括:

  • 实体(Entity)- 值对象(Value Object)- 聚合根(Aggregate Root)- 工厂(Factory)- 存储库(Repository)- 领域服务(Service)- 领域事件(Event)

1.2 TDD(测试驱动开发)TDD 是一种开发实践,它通过先编写测试来驱动代码的编写。它的好处包括:

  • 提高测试速度- 提高测试可靠性- 更好的测试隔离- 有利于重构

1.3 两顶帽子两顶帽子是一种开发模式,分为两个阶段:

  • 优化结构阶段:重构代码,提高扩展性- 添加功能阶段:在优化后的基础上增加新功能

2. 外六边形:技术域

2.1 输入适配器输入适配器负责将外部请求转换为内部指令,包括:

  • Web 请求- RPC 调用- 消息队列- 定时任务

2.2 输出适配器输出适配器负责将内部响应转换为外部系统可理解的格式,包括:

  • 数据库- 缓存- 搜索- 消息队列- RPC 调用- 文件系统

3. 小结

业务系统需要同时应对业务需求和技术需求。六边形架构通过内六边形解决业务需求,外六边形解决技术需求,从而实现业务与技术的解耦。

  • 内六边形:使用 DDD、TDD 和重构来应对业务复杂性。- 外六边形:使用输入适配器和输出适配器来应对技术复杂性。 这种架构模式有助于提高系统的灵活性和扩展性,同时降低业务和技术变化带来的影响。