incloud开发文档 5.1.0 Help

模块化设计

模块化设计

本章节我们先讲一讲在软件设计中,模块化的一些设计和复用原则,这里引用Goframe框架作者郭强的模块化设计理念一章; 虽然这里java跟go在语言层面不同,但软件设计理念是相同的;

什么是模块

模块也称作组件,是软件系统中可复用的功能逻辑封装单位。在不同的软件架构层次,模块的概念会有些不太一样。 在开发框架层面,模块是某一类功能逻辑的最小封装单位。在Java代码层面中,我们也可以将package称作模块。

模块化的目标

软件进行模块化设计的目的,是为了使得软件功能逻辑尽可能的解耦和复用,终极目标也是为了保证软件开发维护的效率和质量。

模块复用原则

REP 复用/发布等同原则

复用/发布等同原则(Reuse/Release Equivalency Principle):软件复用的最小粒度应等同于其发布的最小粒度。 直白地说,就是要复用一段代码就把它抽成模块。

CCP 共同闭包原则

共同闭包原则(Common Closure Principle):为了相同目的而同时修改的类,应该放在同一个模块中。 对大部分应用程序而言,可维护性的重要性远远大于可复用性,由同一个原因引起的代码修改,最好在同一个模块中,如果分散在多个模块中,那么开发、提交、部署的成本都会上升。

CRP 共同复用原则

共同复用原则(Common Reuse Principle):不要强迫一个模块依赖它不需要的东西。 相信你一定有这种经历,集成了模块A,但模块A依赖了模块B、C。即使模块B、C 你完全用不到,也不得不集成进来。这是因为你只用到了模块A的部分能力,模块A中额外的能力带来了额外的依赖。如果遵循共同复用原则,你需要把A拆分,只保留你要用的部分。

复用原则竞争关系

REP、CCP、CRP 三个原则之间存在彼此竞争的关系。REP 和 CCP 是黏合性原则,它们会让模块变得更大,而 CRP 原则是排除性原则,它会让模块变小。遵守REP、CCP 而忽略 CRP ,就会依赖了太多没有用到的模块和类,而这些模块或类的变动会导致你自己的模块进行太多不必要的发布;遵守 REP 、CRP 而忽略 CCP,因为模块拆分的太细了,一个需求变更可能要改n个模块,带来的成本也是巨大的。

Rep

微服务

微服务是现代软件开发中的一种架构风格,它鼓励将应用程序拆分为一系列小型、独立且松耦合的服务。而Spring Cloud是在微服务原则的基础上,为开发者提供了工具和框架来实现这些原则。以下我们将讨论微服务和模块化设计的基本原则,并以Spring Cloud为例来说明这些原则的应用。

微服务设计原则

  • 单一职责原则: 每个微服务应专注于单一功能或业务能力,确保服务的职责清晰和维护简单。

  • 松耦合: 微服务之间的依赖应该最小化,这样可以独立地部署和扩展服务,而不会影响其他服务。

  • 自治: 每个微服务应该是自治的,具有自己的数据库、API和独立的运行环境。

  • 无状态设计: 微服务应尽量避免保存状态,这样可以更容易地进行水平扩展。

  • 持续交付和部署: 微服务应支持持续集成、交付和部署,以加速开发和部署周期。

  • 中央化服务配置: 服务的配置应从服务代码中分离出来,并集中管理,以便于运维和动态调整。

  • 故障隔离: 单个微服务的失败不应影响其他服务的正常运行。

  • 服务发现和注册: 微服务应能够自动注册到服务注册中心,并通过服务发现来找到其他服务。

  • API网关: 为所有微服务提供统一的入口,实现请求路由、负载均衡和API聚合等功能。

模块化设计原则

  • 高内聚: 模块内部的元素应该紧密相关,支持特定的功能或业务逻辑。

  • 低耦合: 模块之间的依赖和交互应最小化,以确保模块的独立性和可替换性。

  • 模块接口清晰: 每个模块都应该有一个清晰、稳定且文档齐全的接口,方便其他模块调用。

  • 模块独立性: 模块应该是独立的,可以独立地开发、测试和部署。

  • 模块复用性: 通过清晰的设计和接口定义,模块应具有高度的复用性。

总结及最佳实践

  • 能模块化设计的,不要堆在一个服务里面。

  • 能做成依赖的,不要做成服务。

  • 能不暴露的接口就私有化,逻辑写在内部,提供统一对外接口。

  • 复用的模块化逻辑减少到最小化依赖,做到别人依赖你时,不用考虑太多引入非必要组件

Last modified: 20 一月 2025