Java应用架构设计:模块化模式与 OSGi(1)

 由  张卫滨 发布

第一部分

模块化的理由

市面上从来不缺乏软件设计方面的图书。有很多的书会教导你面向对象设计的基本和高级 理念。你还会发现几乎有同等数量的书来教导你 面向服务架构的基本和高级概念。但是,这里缺失了一部分:模块化。将系统的最高层架构和内部代码结合起来的深刻讨论,你应该很少见到。

在本书第一部分中,我们首先在模块这个词上达成共识。然后马上会讨论模块化的两个方 面:运行时模型和开发模型。从这里开始,将会考 察模块化怎样帮助我们实现“自上而下的架构”,这是通过将重要的 高层架构组件与更具体的实现结合在一起做到的。复杂性是我们要征服的怪兽,而重用是我们想得到的灵丹妙药,模块化在这两个方面都会给我们提供帮助,我们会讨论它在这个过程中所扮演的重要角色。最后,在进入模块化模式之前,会通过一个样例练习介绍模块化的收益。在整个过程中,我们为使用模块化找到了充分的理由。

第 1 章 模 块 定 义

首先,需要回答一个简单的问题:

在 Java 平台中,软件模块是什么?

1.1 定义模块

简单来说,模块就是“一个软件块”(chunk of software)。不过,这不能很简洁地区别模块与其他软件块,如类、包、组件、服务甚至应用。所以,我们需要关注这个定义:

软件模块是可部署的、可管理的、原生可重用的、可组合的、无状态的软件 单元,它为用户提供了简洁的接口。

这是大而全的一个定义,第 1 章就贸然介绍它也很不好。但是,在一些解释后,你就能领会模块是什么了。图 1.1 展示了这个定义。接下来,将探讨模块的各个元素。

【图片1.1 定义模块】

1.1.1 可部署

模块是一个部署单元。不 像其他软件实体,如类和包,模 块是一个独立的部署单元,它能够与其他软件模块共处。从这个意义上讲,模块所表达的意义更多是物理层面上的,它比那 些无形 的软件 实体 如类或 包的粒 度更粗 。可 部署软件单元的例子包括EAR、WAR 以及 JAR 文件。

1.1.2 可管理

模块是一个可管理的单元。在运行时模块系统中,模块可以进行安装、卸载以及更新。在开发过程中,将系统拆分成模块有助于简化很多其他的复杂活动。这包括提高构建的效率、允许开发人员独立地开发自主的模块并按照模块的边界规划开发工作。符合这部分定义的软件实体样例包括 EAR、WAR 以及 JAR 文件。

1.1.3 可测试

模块是一个可测试的单元。如同类可以使用测试驱动开发进行独立测试一样,模块也可以进行独立测试(参见 12.3 节)。符合这部分定义的软件实体样例包括类、包以及JAR 文件。

1.1.4 原生可重用

模块是进程内(intraprocess)可重用的单元。尽管面向服务的架构(Service-Oriented Architecture,SOA)原则可以用来设计软件模块,但模块并不像应用或服务那样,它不是分布式计算技术。相反,以模块化组织部署单元的方式使得它们可以跨应用重用(关于重用,参见第 5 章),但是模块总是原生调用的。也就是说,模块暴露的操作是通过直 接调用方法触发的。

重用模块的方式与重用服务也是不同的。一般来讲,服务只须部署一次并被多个使用者调用。因为模块是在进程内使用的,所以模块会与那些想重用其功能的进程一起部署。符合这部分定义的软件实体样例包括类、包以及 JAR 文件。

1.1.5 可组合

模块是可组合的单元。模块可以由其他模块组成。一般这指的是粗粒度的模块是由细粒度的模块组成的。(关于粒度,参见 5.2.1 节。)

1.1.6 无状态

模块是无状态的。特定版本的模块只会存在一个实例。我们不会实例化软件模块,尽管我们需要实例化软件模块中的类,这些类会保持状态,但是模块本身不会这样做。符合这部分定义的软件实体样例包括 WAR、EAR 以及 JAR 文件。

1.2 软件模块的简洁定义

进一步学习之前 ,我们先给出软件模块更简洁的定 义。基于每部分的定义,可以更清楚地说:

Java 平台中最适合的模块化单元就是 JAR 文件。

1.3 结论

在Java平台中,为了区分软件模块与其他“软件块”的概念,对模块的定义有一个简洁的共识很重要。在本书接下来的全部内容中,当提到模块时,指的就是的 JAR 文件,它具备本章讨论的所有属性。


张卫滨 2013-10-10 16:23

回复北海飞舞: 作者在最后一章提出了这样的一种愿景,不过要实现的话,恐怕还要有一段路要走

顶(0) 踩(0) 回复

a_alter 2013-10-10 16:14

我想起了阿里云 对于 不可能云介入用户 的客户端版本兼容性解决需求

顶(0) 踩(0) 回复

北海飞舞 2013-10-10 14:41

感觉好像模块化跟搭积木一样,可以实现软件产业的工业化生产吧,程序员实现一个应用的时候可以在现存的模块中查找自己所需要的各种功能和服务,选择相应的模块,这些服务都是现存的,程序员只需要写少量的粘合剂就可完成相应的应用,并且能够自动拥有可重用,可扩展,热插拔等特性,实在是太棒了。说不定到最后连应用的生产都可以全自动了。。。

顶(2) 踩(0) 回复
查看评论