1. Overview
1.1. 分布式对象中间件
允许使用OO模型开发分布式系统,隐藏分布式底层复杂性。
通信实体被表示成对象,通信主要使用RMI,好处有:
- OO的封装适合分布式编程
- 数据抽象的特性使对象规约与实现分离
- 解决方案可以更加动态和可扩展
1.2. 基于组件的中间件
克服分布式对象中间件的限制,包括
- 隐式依赖:对象接口不能描述这个对象的实现依赖什么
- 编程复杂性:编写分布式对象中间件程序需要了解中间件实现的细节
- 缺少关注点分离支持:需要关注安全性、故障处理、并发等细节
- 无部署支持
其是基于分布式OO的自然演化,继承了分布式OO的前期工作
2. 分布式对象
2.1. 不同点:对象与分布式对象
对象 | 分布式对象 | 分布式对象描述 |
---|---|---|
对象引用 | 远程对象引用 | 远程对象引用在分布式系统全局唯一,可作为参数/返回值 |
接口 | 远程接口 | 提供远程对象可调用方法的规约,该规约由IDL指定 |
动作 | 分布式动作 | 由方法调用初始化,可能会有调用链,使用RMI进行远程调用 |
异常 | 分布式异常 | 必然产生额外异常,如消息丢失、进程故障 |
GC | 分布式GC | 在本地GC上扩展(如引用计数),保证对象在至少有一个本地或远程引用时存活,否则就该回收 |
类 | 类/工厂/模板 | 类可以认为是:一组对象的行为描述(模板)和用给定行为实例化对象的地方(工厂)。因此分布式对象中更适合用“工厂”和“模板”来表述(即一个工厂通过给定模板实例化一个对象) |
继承(实现继承) | 接口继承 | 分布式继承只是一种接口的关系,只继承接口方法的签名,但难以继承接口方法的实现(即实现继承) |
2.2. 新增的复杂性
- 对象间通信:分布式对象中间件框架必须提供对象在分布式环境中一个或多个通信机制(常由RMI提供)
- 对象生命周期:创建、迁移、删除,都要处理底层的分布式特征
- 激活与钝化:分布式环境中对象不能假设都是活动的,框架需要提供激活对象的功能(使分布式对象能处理调用),以及钝化对象的功能(使对象暂时不能处理调用以节省资源消耗)
- 持久化:激活和钝化功能,以及处理系统故障时,需要对象持久化的支持,以及持久化的管理
- 其它服务:如命名服务、安全服务、事务支持等
3. 从对象到组件
由1.2.节所述,分布式组件框架需要有:
- 不仅仅清晰指定对象提供的接口,还需要指定对象在分布式配置中依赖的其它对象
- 简化编程,将中间件框架操作代码和业务代码分离
- 对于一些非功能性的问题(如安全、事务、协作、复制等)要对程序员隐藏
- 中间件平台应该为分布式软件提供内在的部署支持,对用户隐藏部署的复杂性
3.1. 组件的本质
组件:一个句有契约化指定接口和显式上下文依赖的组合单元
这里契约化包括:
- 提供的接口:即组件提供对外的服务
- 所需的接口:即本组件对其它组件的依赖(解决第一个需求)
接口可以是RMI的接口,也可以是分布式事件(间接通信)的接口
对于一个给定的组件配置,每个所需接口必须绑定在另一个组件提供的接口上——构成由组件、接口、接口关联组成的软件体系结构
3.2. 组件与分布式系统
a) 容器
容器为一种公共模式提供支持,包括:
- 前端客户端
- 容器中包含一个或多个应用/业务组件
- 持久存储中管理相关数据的系统服务
容器的任务是为组件提供一个受控制的服务器端驻留环境,并提供必要的关注点分离(如分离出安全处理、事务处理等,解决第三个需求)。
容器保证实现非功能特性,而组件可只关注功能特性,两者分离(解决第二个需求)
支持容器模式和并支持关注点分离的中间件称为应用服务器,如:
- EJB
- Spring Framework (从EJB演变过来的,核心是管理POJO Bean以及IoC、AOP等支持)
- JBoss
- GlassFish
- Tomcat (
Servlet
容器)
b) 部署支持
基于组件的中间件提供组件配置的部署支持,还提供解释部署描述符的工具以正确部署
软件发布:将软件体系结构(组件及它们的关联)和部署描述符一起打包
部署描述符:描述了配置应如何部署到分布式环境中,需要保证
- 通过恰当的协议和相关中间件的支持,使组件被正确关联
- 配置底层平台以便为组件配置提供正确的支持级别
- 启动相关的分布式系统服务以提供合适级别的安全、事务支持等
组件是部署在容器中,因此容器解释部署描述符来建立底层中间件与分布式系统服务所需的策略
书上有关于EJB的事务传播说明,由于Spring很常用且衍生于EJB,所以这个链接说明了Spring Transaction