Keynote 原件地址

本书详细地介绍了模块化在Java应用架构设计中的重要性,以及如何通过不同的设计模式来实现模块化,以解决物理设计方面的挑战。

模块的定义

书中定义模块是可部署的、可管理的、可测试的、原生可重用的、可组合的、无状态的软件单元,它为用户提供了简洁的接口。在Java平台中,最适合的模块化单元是Jar文件。

但是这个定义更像是对组件的定义。模块一般更偏向于实现,是「代码组织的一种方式,侧重于封装和逻辑上的分组」。

模块和组件之间的差异:

  • 模块
    • 偏向实现:当我们谈到模块的时候,更多指的是实现层面。例如:代码模块
    • 层级有限:所以层级相对有限,仅有模块和子模块之分
    • 强调封装性:强调对外暴露什么、不暴露什么。例如:OSGi、Jigasw等模块化功能,需要明确标识需要导入、导出哪些内容
  • 组件
    • 偏向设计:是对功能的规划,仅关注能提供哪些能力,并不关心如何实现
    • 层级无限:组件虽然也只是分为复合组件和原子组件。但是,上到系统、子系统,下到代码实现,都可以通过此概念来描述。例如:一个大系统是由一个个的系统组件组成的,每个系统组件是由一个个的子系统组件组成,子系统组件下有一个个的功能组件,功能组件下有子功能组件直到原子组件
    • 强调可替换性:组件虽然也定义了暴露的接口,但是强调的是可替换性。例如:缓存组件定义了缓存的设值和取值接口,最终实现时,可以是代码实现、也可以使用的redis等中间件

模块的作用

通过填补高层架构组件以及底层代码之间的空白,减少变化带来的影响和成本。模块化有助于理解脱节,通过组件、服务、模块、包、类和代码的设计,逐步消除高层技术与底层实现之间的偏差。

OGSi是Java生态下模块化的实现框架,概念不复杂,但实际应用难度较大。特别是没有编译期的依赖校验,依赖问题需要延迟到构建期、运行期才能暴露,极大的影响了开发效率。

模块的设计

平衡重用和可用性,通过实践与模式来实现可用性与重用性的平衡。

模块化设计模式

提供指导,帮助我们平衡模块的重量级和粒度,使系统更易理解、维护和扩展。包括基本模式、依赖模式、可用性模式、扩展性模式和通用模式。

  • 基本模式:包括管理关系、模块重用和模块内聚。
  • 依赖模式:包括非循环关系、物理分层、容器独立和独立部署。
  • 可用性模式:包括发布接口、默认实现、外部配置和模块门面。
  • 扩展性模式:包括抽象化模块、实现工厂、分离抽象和测试模块。
  • 通用模式:包括就近异常和等级化构建。