Author:
Anders小明以前写过一篇《基于抽象的分层结构》,这里补充一篇《基于业务模块组件的系统架构》
一些内容在《项目笔记:dao,web,模块边界以及Model分类》以及《模块的接口设计》随笔中已经提到,这里补充总结一下。
任何一个有一定规模系统,通常会把系统做一定分解降低分析设计开发的难度,模块划分是一个比较常见的方式。
而在模块的划分及其分析设计的实践中,包括了两种层次的边界。第一是交互行为层次,第二是对象层次。
首先说交互行为。
模块和模块的交互接口最为重要,通常我们认为这些接口应该通用稳定,然而如何设计每个模块对外提供的接口却是一个不易的问题。
集成的两种基本实现方式:
1. API方式。
这是常见的实践方式。即每个模块公开数量不多的接口类(但拥有较多的接口方法)以及接口参数(都是普通的VO),每个接口的设计和实现都有该模块成员维护;实践中:这些接口都独立打包,形成多(模块)对一(接口)的依赖关系,方便编译。
这样的好处是:接口边界清晰,开发编译依赖比较简单。
然而实践中极有可能出现两种状况:接口维护失控或者过严而死板(而影响开发)。接口失控是因为接口的维护太过随意,因为A模块的需要就轻易在B模块中添加一个接口(方法),导致该接口(方法)非独立性(基本上只给模块A的这个功能点使用),或者是接口的控制过严,导致或者工作效率不高,或者接口的易用性不好。
原因在于:接口是两个模块间的耦合,而发生的种种问题在于模块耦合太过紧密;同时实践中,把模块对外提供的接口,与模块需要实现的外部模块的集成混为一谈;换句话说,A模块需要集成的语义,和B模块提供接口的语义存在差距。
这样的实践优点:开发管理控制成本较低,模块编译依赖简单,模块物理边界明确。
2. Adapter方式
这种的实践可以一定程度上解决API方式面临的问题:根据指导原则——为了降低耦合只有在中间加一层;即不轻易为模块设计对外提供的接口(方法),除非是通过重构得来的;模块对外提供两种类:一个是需要外部模块实现的接口(接口设计从本模块需要出发,当然每个接口尽管是为某个功能点服务,但也要注意其在模块内通用性);另一个是其它模块要求本模块实现的接口的实现类(这块物理上独立打包,独立于模块之外)。
即:A模块拥有一些需要B模块实现的接口(A模块对B模块的要求),而B模块中也有要求A模块实现的接口,因而A有这些接口的实现类。
处于编译依赖的考虑,已有的实践是把处理接口适配的代码维护在模块外的,就是所谓的集成模块,这样编译上就形成了1(接口实现)对n(模块)的依赖关系。模块的边界在这里模糊了,当然在这之外模块的边界是很清晰的。
这种实践方式的好处在于:模块的接口就多了一层隔离降低了耦合,把接口的通用性和接口的适应性分离,又明确了模块的边界,使得接口在日后的优化和调整有了缓冲。
这样的实践和API实践的不同之处在于:接口的设计权利一分为二,需求方拥有了其应该有的权利,并且这个权利与提供方没有冲突(旧的模式不行,一旦供应方改变了接口,就立刻导致编译问题)。
两种方式的对比:
1. 采用API方式集成,代价在于维护API本身,API面对众多的客户端,其面临的设计维护成本较高,同时实施成本高;
2. 采用Adapter方式集成,由于没有维护API,缺乏可复用接口,但可以做到为每个客户端自由定制,其设计维护成本较低,实施上成本较高;
集成的演进方式:
1. 采用事件模式。
这也是完成交互处理的模式。通常事件模式在业务行为上也可以完成和接口相互的功能,不过由于其在接口签名上无法明确提供其业务含义,建议谨慎应用。对于产品化项目,项目开始可以应用事件处理机制,在成熟时提取为更具体的接口。
事件模式中,Event的监听类也面临着模块的边界问题。已知的成熟开源项目都在事件源中暴露的模块内部对象,方便开发者使用。
可以说这种方式的是Adapter方式的演进;
2. 采用框架回调方式
工作流和页面流也负责集成不同的模块.不过因为工作流和页面流框架都维护独立的数据对象共享池,因而在这个层面上,模块间直接的交互并不存在。这种集成上的优势,演化成通过ESB等集成框架完成.
这种方式是API方式的演进,但是把调用点以及调用方独立出来,成为框架的一部分。
现在说说对象一级的边界集成。
在保险中,benefit对象会关联一个product对象,不过product对象是是属于产品模块而非保单模块,对于保单模块只关心id而并不使用对象,但在RMS或者FMS或者UIC这样的集成环境却是需要product对象的。我们要采用代码生成的方式,在benefit对象上加一个annotation,比如Integration的annotation标识,使用AspectJ在编译上enhancement生成的class,使得benefit对象在集成环境上可以拿到product对象,这算是一个集成方面。
组件化管理
组件化管理包含两个含义:
1. 组件访问控制,依赖管理以及服务注册;
现有的访问控制的办法,只能通过代码提交时或者编译发布时检查,但我们更期望支持运行时的能力,避免外部组件访问组件未申明公开的内部结构和程序;同时维护方式应该简单方便,成本低。
目前的组件依赖管理几乎没有,尤其是基于版本的依赖;而在实践中,依赖维护管理尤其是多版本的通常花费大量的成本。
2. 组件依赖的绑定以及失效(故障)的隔离;
我们希望能够为每个组件提供一个保护区域,当其依赖的一个组件因为种种原因(软件错误的或者软件升级)失效时,系统至少应该提供一种fail-fast机制,包括如下能力:
A.故障即停(Halt on failure)——当一个组件出错时,应当立即停止下来,而不是继续执行可能不正确的操作;
B.故障曝光性质(Failure status property)——当一个组件发生故障时,系统中的其他组件应该得到通知,故障的原因必须交代清楚;
同时,我们希望该组件,如果可能它应该可以继续运行。完成这样的目标需要很多的工作,但首先依赖于系统fail-fast能力,同时在故障消除服务恢复后,系统能够提供相应的通知,并控制恢复的顺序。
已知的支撑框架:SCA和OSGi
1. SCA考虑的是异构异步环境,OSGi考虑同构同步环境;
2. OSGi规定了容器如何管理组件,组件依赖(版本)管理,组件边界保护以及组件服务依赖运行时绑定策略和权限控制;SCA对此没有涉及;
3. SCA考虑的如何暴露服务,设计时客户端如何使用服务;OSGi考虑的更加完善;
分享到:
相关推荐
- **内部结构模型**:采用OSGi的模块化架构,将各个业务组件封装为独立的服务模块,每个模块都可以独立部署和更新。 - **服务注册与发现**:通过企业服务总线(ESB)或其他服务发现机制,实现服务的自动注册和发现,...
这个方法首先定义了不同层级的实体模型,包括业务层、操作系统分区层、模块层、子系统层和系统层,以反映陆战平台信息控制系统的复杂结构。每个层级都具有特定的属性和约束,这些属性和约束有助于理解和评估系统的...
SOA架构的模块化和标准接口模式使得信息系统能够更加灵活地应对快速变化的业务需求,同时保持系统的稳定性。另外,SOA技术的集中式数据和应用集成,便于部署和管理,可以提高业务响应速度。成熟的中间件能够实现架构...
总的来说,基于考勤系统的业务模块二次开发是一个复杂而精细的过程,涵盖了系统基础架构、网络设计、组件配置、数据库管理和业务逻辑编程等多个方面。企业根据自身需求进行定制,可以极大提升考勤管理的效率和精确度...
服务组件架构(Service Component Architecture,SCA)是支持SOA的编程模型和技术规范,由主要的中间件提供商如BEA、IBM和Oracle共同制定。SCA定义了三个层次:域(Domain)、组合构件(Composite)和构件...
### 面向服务体系架构和业务组件的思考 #### 一、引言 随着信息技术的飞速发展,软件系统的复杂性日益增加,企业对于高效、灵活的IT解决方案的需求也越来越迫切。面向服务体系架构(Service-Oriented Architecture...
在传统的iOS应用架构中,通常按照功能层级进行模块划分,例如系统框架、基础功能库、网络库、UI库以及各业务模块。然而,这种架构往往导致业务模块间的高度耦合,不利于快速迭代和维护。组件化的目标就是将业务模块...
文章题目所指的知识点涵盖了SOA(面向服务的体系结构)、网络管理、分布式系统和组件管理模块。在当今信息技术快速发展的背景下,网络规模的扩大、网络设备类型的增多以及网络环境的日益复杂化,对网络管理系统提出了...
- `index.js`或`velForm.js`:可能是一个导出`EleForm`组件的模块文件,供其他部分引用。 - `example`目录:包含使用`EleForm`组件的示例代码,帮助开发者了解如何使用和配置。 - `README.md`:组件的使用文档,介绍...
本文主要探讨的是基于业务架构的企业网络办公系统,该系统旨在解决企业在信息技术应用中的问题,以提高效率和适应性。业务架构是一种以用户业务为导向,技术无关的软件架构平台,旨在整合、扩展和管理企业的信息系统...
**基于UML的信息系统架构** UML(统一建模语言)是软件开发中广泛使用的建模工具,尤其在设计和规划复杂信息系统时。它提供了一种标准化的方式来描述系统的静态和动态方面,包括系统组件、对象关系、交互以及系统的...
基于业务模型的架构平台是一种先进的系统设计方法,它强调将业务流程、功能需求与技术实现紧密结合,以优化设备装置的运行效率和服务质量。 在IT行业中,架构平台通常是软件开发的基础,它定义了系统组件的组织方式...
总结来说,基于场景的软件体系结构评估方法强调将具体业务场景与体系结构设计相结合,以确保软件满足预期的需求和性能标准。这种方法对于复杂系统尤其适用,因为它能够全面地考虑各种可能的交互情况,从而提高软件的...
【基于layui自定义表单组件】是针对C#开发者设计的一种高效前端开发工具,它结合了layui框架的优势,为创建动态、交互性强的Web表单提供了便利。layui是一款优秀的前端轻量级框架,以其简洁的代码结构、丰富的模块...
在基于面向服务体系架构(SOA)中,“组件化”是一个很重要的概念,如何进行“组件化”开发是搭建企业级业务基础平台时需要考虑的一个重要课题,本文通过建立业务组件(BC)接口模型及内部结构模型,提供了一个在新...
业务组件(BC)是SOA中的一种关键元素,它代表一个能够独立运行的系统或模块。BC的主要目标是确保组件的独立性和可升级性,同时减少不同组件间的交互,从而提高重用性并降低维护成本。根据需求,业务组件可以分为两...
- **B/S多层Web体系结构**:该系统采用浏览器/服务器(B/S)架构,可以跨平台运行,无需安装客户端软件。多层架构通常分为表现层、业务逻辑层和数据访问层,这种分层设计有利于模块化开发,提高系统的可维护性和扩展...
系统体系结构包括监测中心、监测站和监测设备。监测中心是数据处理的核心,包含控制器、路由器、集线器/交换机等硬件设备,以及相应的监测软件。监测站包括监测服务器、数据库服务器和监测设备,负责接收和执行监测...
Magento采用的是MVC(Model-View-Controller)架构,这种设计模式在Web开发中广泛使用,它将业务逻辑、数据处理和用户界面分离,提高了代码的可维护性和复用性。此外,Magento还基于Zend Framework构建,利用其强大...