消息驱动架构
- 格式:docx
- 大小:455.69 KB
- 文档页数:92
系统架构方案随着科技的不断发展,系统架构在现代社会中起着至关重要的作用。
无论是企业还是个人,都需要一个合理、高效的系统架构方案来支持业务的发展和信息的处理。
本文将探讨系统架构方案的重要性、设计原则以及一些经典的架构模式。
一、系统架构方案的重要性一个良好的系统架构方案可以极大地提高系统的可维护性、可扩展性和安全性。
首先,良好的系统架构可以使系统模块化,降低代码的耦合度,使得维护和升级变得更加容易。
其次,系统架构需要考虑系统的可扩展性,以应对未来业务的发展和需求的变化。
最后,安全性是系统架构中必不可少的考虑因素。
合理的系统架构可以有效地保护系统数据的安全和用户的隐私。
二、系统架构的设计原则在设计系统架构方案时,我们需要考虑以下几个原则:简单性、可重用性、可扩展性和可测试性。
简单性是系统架构设计的首要原则。
一个简单的架构方案可以降低开发和维护的成本,并提高系统的可理解性。
可重用性是指在设计系统架构时尽可能利用已有的组件、模块和库,以减少重复开发的工作量。
可扩展性是指系统架构能够很容易地增加新的功能或模块,以适应业务的发展需求。
可测试性是指对系统进行单元测试、集成测试和性能测试等,以确保系统的稳定性和可靠性。
三、经典的系统架构模式1. 分层架构分层架构是将一个系统分为若干层次,每个层次都有特定的职责和功能。
常见的分层架构包括三层架构和四层架构。
三层架构包括表示层、业务逻辑层和数据访问层,每个层次都有不同的职责。
四层架构在三层架构的基础上增加了一个应用层,用于处理系统的核心业务逻辑。
分层架构可以使各个层次的功能清晰明确,易于维护和扩展。
2. 微服务架构微服务架构是将一个大型系统拆分为多个小型的、自治的服务组件。
每个服务组件负责一个特定的业务功能,通过轻量级的通信机制进行交互。
微服务架构可以提高系统的可扩展性、灵活性和容错性。
由于服务组件之间相互独立,可以独立部署和扩展,不会影响整个系统的运行。
但是微服务架构也增加了系统的复杂性和运维成本。
j2ee考试题及答案ejb1. 什么是EJB(Enterprise JavaBeans)?EJB是一种服务器端组件架构,用于开发和部署多层结构的、分布式的、面向对象的Java应用程序。
EJB组件提供了一种结构化的方法来创建可重用的、可伸缩的和事务性的业务逻辑。
2. EJB有哪些类型?EJB主要有三种类型:会话Bean(Session Beans)、实体Bean(Entity Beans)和消息驱动Bean(Message-Driven Beans)。
3. 会话Bean(Session Beans)的作用是什么?会话Bean代表与客户端的短暂交互,它们通常用于实现应用程序的业务逻辑,但不保存数据。
会话Bean可以是无状态的(Stateless)或有状态的(Stateful)。
4. 实体Bean(Entity Beans)和会话Bean(Session Beans)有什么区别?实体Bean代表业务实体,通常与数据库中的持久数据相关联,而会话Bean代表与客户端的短暂交互,不直接与持久数据关联。
5. 消息驱动Bean(Message-Driven Beans)的主要功能是什么?消息驱动Bean是一种特殊的EJB,用于处理来自消息队列的消息。
它们是无状态的,并且可以异步处理消息,这使得它们非常适合处理大量消息。
6. EJB容器提供哪些服务?EJB容器提供多种服务,包括事务管理、安全性、持久性、生命周期管理、并发控制和资源池。
7. EJB的事务属性有哪些?EJB的事务属性包括:Required、RequiresNew、Mandatory、Never、NotSupported和Supports。
8. 如何在EJB中处理异常?在EJB中,可以通过声明异常(declarative exception handling)和编程异常(programmatic exception handling)两种方式来处理异常。
架构解耦的常见模式架构解耦是一种常见的设计模式,它可以将系统中的不同模块解耦,降低模块之间的依赖性,提高系统的灵活性和可维护性。
在本文中,我将介绍几种常见的架构解耦模式,并分析其优缺点。
1. 事件驱动架构(Event-Driven Architecture, EDA)事件驱动架构是一种通过事件的发布和订阅来实现模块解耦的设计模式。
在该架构中,模块之间通过事件进行通信,发布者发布事件,订阅者接收并处理事件。
这样,模块之间的依赖关系被解耦,使系统更加灵活和可扩展。
但是,事件驱动架构也存在一些缺点,例如事件的传递可能会引起性能问题,同时事件的处理顺序也可能影响系统的行为。
2. 服务导向架构(Service-Oriented Architecture, SOA)服务导向架构是一种将系统划分为多个可独立部署和调用的服务的设计模式。
每个服务都提供特定的功能,并通过定义的接口进行通信。
这种架构可以实现模块之间的松耦合,提高系统的可维护性和可扩展性。
然而,服务导向架构也带来了一些挑战,例如服务的管理和版本控制,以及服务之间的通信开销。
3. 消息队列(Message Queue)消息队列是一种通过将消息存储在队列中,实现模块之间解耦的架构模式。
发送者将消息放入队列,接收者从队列中获取消息并进行处理。
这种模式可以提高系统的可伸缩性和可靠性,减少模块之间的直接依赖。
但是,消息队列也会增加系统的复杂性和延迟。
4. 中间件(Middleware)中间件是一种在应用程序和操作系统之间提供接口的软件层。
它可以将系统中不同模块之间的通信进行解耦,提供统一的接口和协议。
中间件可以将模块之间的通信复杂性隐藏起来,提高系统的可维护性和可扩展性。
但是,中间件也可能引入额外的开销和复杂性。
5. 依赖注入(Dependency Injection, DI)依赖注入是一种通过将依赖关系从代码中解耦的设计模式。
通过将依赖关系注入到对象中,而不是在对象内部创建依赖关系,可以提高代码的可测试性和可维护性。
第20期2020年7月No.20July ,2020消息驱动的分布式方案推演引擎设计田朝晖,陈清,石畅(中国电子科技集团公司第二十八研究所,江苏南京210007)摘要:推演引擎是推演系统的核心部件,它为推演系统提供了组件集成、模拟、状态更新等基本功能。
在消息系统里将导致系统状态变化的信息抽象为驱动消息,采用科学的消息调度与处理方法有效地解决了系统实时性需求以及组件式开发与集成的问题。
采用分布式设计使得软件系统具备模块间低耦合、可伸缩、高性能等特点。
文章提出一种消息驱动的分布式方案推演引擎设计。
关键词:推演引擎;分布式;消息驱动中图分类号:TP311文献标志码:A江苏科技信息Jiangsu Science &Technology Information作者简介:田朝晖(1989—),男,安徽宿州人,助理工程师,硕士;研究方向:指挥信息系统。
引言目前很多大型软件系统采用引擎式设计,例如搜索系统的搜索引擎[1]、游戏系统的游戏引擎[2]、杀毒软件的杀毒引擎等,它们都是将核心基础功能抽离出来形成一个被称为引擎的通用部件,实现组件式开发与集成、控制系统的运转。
基于引擎,研发人员可以较为容易地制作相应的软件产品,而不必把资源浪费在重复的基础功能实现上。
在推演软件研究方面,一些较为合理的系统[3]、框架[4]设计方案被提出,文章以满足指挥信息系统的需求[5]为目标,分布式设计参考数据-业务-协作架构[6]。
1模型描述推演模型中的车辆、飞行器、坦克等作战单元模型都可视为对现实物体的模拟称实体,记为o 。
实体模型在推演中的某一时刻有具有它的状态,使用实体属性进行描述,将属性值表示为时间函数记为p (t ),其中t 为推演时间,将实体状态记为S o (t ),因此:{}p i (t )|i ∈N →S o (t )将模拟世界本身也视作一个实体并包含属性值,将整个推演模拟世界记为W ,世界状态由世界本身属性与所属组成实体属性组成,有:S w (t )={}p wi (t )|i ∈N ⋃{}p oi (t )|i ∈N S w (t )是时间连续映射,世界状态的第t n 时刻取值S w (t n )确定了该时刻的世界静态信息,S w (t n )的所包含的信息可唯一确定一个用于计算机屏幕显示的静态图像。
异步消息驱动架构设计实现松耦合高可扩展性的系统异步消息驱动架构(AMDA)是一种设计和实现松耦合高可扩展性系统的方法。
它通过引入消息队列来解耦系统中的各个模块,并允许它们异步地处理和传递消息。
本文将探讨AMD的原理、设计和实现。
I. 异步消息驱动架构概述异步消息驱动架构是指系统的各个组件通过消息队列进行通信,而不是直接调用彼此的接口。
这样做的好处是可以将组件解耦,并提高系统的可扩展性和可维护性。
在AMD中,消息的生产者将消息发送到队列,而消息的消费者从队列中获取消息并进行处理。
II. 异步消息驱动架构的优势1. 松耦合:组件之间的依赖性减少,修改一个组件不会影响到其他组件。
2. 高可扩展性:通过增加消费者和队列的数量,可以轻松地扩展系统的处理能力。
3. 异步处理:消息的生产者不需要等待消息被处理完毕,可以继续执行其他任务。
4. 容错性:如果某个组件发生故障,其他组件不会受到影响,消息会被保存在队列中直到组件恢复正常。
III. 异步消息驱动架构的设计原则在设计异步消息驱动架构时,需要考虑以下原则:1. 定义清晰的消息格式:确保消息的结构清晰明确,包含必要的信息,以便消费者能够准确理解和处理消息。
2. 选择合适的消息队列:根据系统的需求和特点选择适合的消息队列,如Apache Kafka、RabbitMQ等。
3. 考虑消息的顺序性:某些场景下,消息的顺序性很重要,需要保证消息按照产生的顺序进行处理。
4. 设计合理的消息处理逻辑:消费者需要根据消息的内容进行相应的处理,可以使用策略模式或者命令模式等设计模式来实现。
5. 考虑消息的持久化:为了防止消息丢失,可以将消息保存在持久化的存储中,如数据库或者文件系统。
IV. 异步消息驱动架构的实现步骤1. 定义消息格式:根据系统的需求,定义清晰的消息格式,包括消息的类型、内容、时间戳等信息。
2. 选择消息队列:根据系统的需求选择合适的消息队列,并进行相应的配置和部署。
解耦的方法解耦是一种常见的软件设计方法,它可以将系统中的不同部分分离开来,使得它们可以独立地进行开发和维护。
解耦的方法有很多种,下面将介绍一些常见的解耦方法。
1. 接口隔离原则接口隔离原则是指将一个大接口拆分成多个小接口,以便不同的模块可以只依赖于自己需要的接口,而不是依赖于整个大接口。
这样可以避免模块之间的耦合度过高,从而提高系统的可维护性和可扩展性。
2. 依赖倒置原则依赖倒置原则是指高层模块不应该依赖于低层模块,而是应该依赖于抽象接口。
这样可以避免模块之间的直接依赖,从而降低耦合度。
3. 单一职责原则单一职责原则是指一个模块应该只有一个职责,即只负责一种功能。
这样可以避免模块之间的功能重叠,从而降低耦合度。
4. 事件驱动架构事件驱动架构是一种基于事件的软件设计方法,它将系统中的各个模块看作是事件的生产者和消费者,通过事件的传递和处理来实现模块之间的解耦。
这样可以避免模块之间的直接依赖,从而提高系统的可扩展性和可维护性。
5. 消息队列消息队列是一种基于异步消息传递的软件设计方法,它将系统中的各个模块看作是消息的生产者和消费者,通过消息的传递和处理来实现模块之间的解耦。
这样可以避免模块之间的直接依赖,从而提高系统的可扩展性和可维护性。
6. 微服务架构微服务架构是一种基于服务的软件设计方法,它将系统中的各个模块看作是独立的服务,通过服务之间的调用和协作来实现模块之间的解耦。
这样可以避免模块之间的直接依赖,从而提高系统的可扩展性和可维护性。
总之,解耦是一种非常重要的软件设计方法,它可以提高系统的可维护性和可扩展性,降低系统的复杂度和耦合度。
在实际的软件开发中,我们应该根据具体的需求和场景选择合适的解耦方法,以便实现高效、稳定、可靠的软件系统。
了解事件驱动架构的优势与应用场景事件驱动架构是一种常用的软件架构模式,它通过将应用程序设计为一系列互相独立的组件,以事件的触发和响应来驱动整个系统的运行。
与传统的请求-响应模式相比,事件驱动架构具有一些独特的优势,并且适用于多种应用场景。
一、优势1. 松耦合性:事件驱动架构通过解耦各个组件之间的依赖关系,使得系统中的组件可以独立开发、部署和扩展。
当一个组件发生变化时,不会影响到其他组件的正常运行,从而提高了系统的可维护性和可扩展性。
2. 高度可伸缩性:由于事件驱动架构中各个组件是独立运行的,因此可以根据系统的负载情况对各个组件进行动态伸缩。
当系统的负载增加时,可以通过增加事件处理器的数量来提高系统的并发处理能力,从而保证系统的稳定性和性能。
3. 事件驱动性:在事件驱动架构中,组件之间通过发布-订阅模式进行通信。
当一个事件发生时,相应的组件会接收到事件通知并进行相应的处理。
这种事件驱动的方式可以更好地体现系统的实时性和灵活性,能够及时地响应和处理各种业务场景下的事件。
4. 容错性和可恢复性:由于事件驱动架构中的组件是相互独立的,因此当某个组件发生故障或异常时,不会影响整个系统的正常运行。
同时,通过合理设计和使用适当的消息队列等机制,可以实现事件的持久化和重放,从而提高系统的容错性和可恢复性。
5. 可扩展性和灵活性:事件驱动架构可以很方便地对系统进行功能扩展和定制。
当需要新增一种业务场景或变更一个组件时,只需编写相应的事件处理器即可,不需要修改已有的代码和组件。
这种灵活性使得系统更加适应变化和快速迭代的需求。
二、应用场景1. 实时数据处理:事件驱动架构非常适用于实时数据处理领域,例如物联网、实时监控、实时日志分析等。
通过事件驱动的方式,可以及时地响应和处理大量的实时事件,并根据需要进行相应的数据分析和处理。
2. 分布式系统:事件驱动架构可以很好地支持分布式系统的设计和实现。
通过消息队列等机制,可以在分布式系统中进行异步的事件通信和协作,从而提高系统的可伸缩性和容错性。
SpringCloudStream的特点和应用场景Spring Cloud Stream的特点和应用场景Spring Cloud Stream是一个用于构建消息驱动的微服务架构的框架。
它提供了一种简单而强大的方式来连接外部消息代理和应用程序,使得开发人员可以专注于业务逻辑而不必关心底层的消息传递细节。
本文将介绍Spring Cloud Stream的特点以及其适用的应用场景。
一、Spring Cloud Stream的特点1. 简化的编程模型:Spring Cloud Stream采用了基于Spring Boot的编程模型,开发人员可以通过使用简单的注解和配置来定义消息绑定和事件处理逻辑,而无需关注底层的消息传递细节。
2. 多种消息中间件的支持:Spring Cloud Stream支持多种消息中间件,包括Apache Kafka、RabbitMQ和RocketMQ等。
开发人员可以根据自己的需求选择合适的消息中间件进行集成。
3. 强大的消息处理能力:Spring Cloud Stream提供了丰富而灵活的消息处理功能,开发人员可以使用Spring Integration提供的各种消息转换器、过滤器和路由器等来实现复杂的消息处理逻辑。
4. 可扩展的架构:Spring Cloud Stream的架构是可扩展的,开发人员可以通过自定义Binder来支持其他消息中间件或者使用自定义的消息传递机制。
5. 提供了丰富的监控和管理功能:Spring Cloud Stream提供了一套完整的监控和管理功能,包括消息的追踪、消息的分析和告警等。
开发人员可以方便地监控和管理整个消息系统。
二、Spring Cloud Stream的应用场景1. 异步处理:Spring Cloud Stream适用于需要进行异步处理的场景。
例如,当用户提交订单后,可以将订单信息发送到消息队列中,而不是直接进行订单处理。
这样可以提高系统的吞吐量和可伸缩性。
eda事件驱动架构的实例
1. 银行交易系统:一个银行交易系统可以使用EDA架构来处理各种交易事件,例如账户开户、转账、存款、取款等。
每个事件都被作为一个消息发送到事件总线,然后基于订阅者模式,感兴趣的服务可以订阅并处理这些事件。
2. 电子商务平台:一个电子商务平台可以使用EDA架构来处理订单的各种事件,如下单、支付、发货、退货等。
每个事件都被发送到事件总线,不同的服务可以根据订阅的事件类型来处理相应的逻辑,例如支付服务可以订阅支付事件,发货服务可以订阅发货事件。
3. 物流管理系统:一个物流管理系统可以利用EDA架构来处理物流相关的事件,如包裹入库、分拣、配送、签收等。
通过将这些事件发送到事件总线,不同的服务可以根据自身需求订阅这些事件并执行相应的业务逻辑,例如配送服务订阅配送事件以实时更新配送进度。
4. 基于微服务的应用程序:微服务架构常常与EDA架构结合使用。
每个微服务都可以通过事件总线发布和订阅事件,这样不同的微服务之间可以通过事件进行解耦和通信。
例如,订单服务可以发布订单创建事件,库存服务可以订阅该事件并更新库存。
5. 智能家居系统:智能家居系统可以使用EDA架构来处理家庭设备的各种事件,如温度变化、灯光开关、安防等。
通过将这些事件发送到事件总线,不同的设备
可以订阅并执行相应的操作,例如温度感应器可以订阅温度变化事件以自动调节空调。
RabbitMQ(消息中间件)在⼯作中的应⽤场景1、跨系统的异步通信,所有需要异步交互的地⽅都可以使⽤消息队列。
就像我们除了打电话(同步)以外,还需要发短信,发电⼦邮件(异步)的通讯⽅式。
2、多个应⽤之间的耦合,由于消息是平台⽆关和语⾔⽆关的,⽽且语义上也不再是函数调⽤,因此更适合作为多个应⽤之间的松耦合的接⼝。
基于消息队列的耦合,不需要发送⽅和接收⽅同时在线。
在企业应⽤集成(EAI)中,⽂件传输,共享数据库,消息队列,远程过程调⽤都可以作为集成的⽅法。
3、应⽤内的同步变异步,⽐如订单处理,就可以由前端应⽤将订单信息放到队列,后端应⽤从队列⾥依次获得消息处理,⾼峰时的⼤量订单可以积压在队列⾥慢慢处理掉。
由于同步通常意味着阻塞,⽽⼤量线程的阻塞会降低计算机的性能。
4、消息驱动的架构(EDA),系统分解为消息队列,和消息制造者和消息消费者,⼀个处理流程可以根据需要拆成多个阶段(Stage),阶段之间⽤队列连接起来,前⼀个阶段处理的结果放⼊队列,后⼀个阶段从队列中获取消息继续处理。
5、应⽤需要更灵活的耦合⽅式,如发布订阅,⽐如可以指定路由规则。
6、跨局域⽹,甚⾄跨城市的通讯(CDN⾏业),⽐如北京机房与⼴州机房的应⽤程序的通信。
这⾥还有⼀种情况,同时有⼤量⽤户注册你的软件,再⾼并发情况下注册请求开始出现⼀些问题,例如邮件接⼝承受不住,或是分析信息时的⼤量计算使cpu满载,这将会出现虽然⽤户数据记录很快的添加到数据库中了,但是却卡在发邮件或分析信息时的情况,导致请求的响应时间⼤幅增长,甚⾄出现超时,这就有点不划算了。
⾯对这种情况⼀般也是将这些操作放⼊消息队列(⽣产者消费者模型),消息队列慢慢的进⾏处理,同时可以很快的完成注册请求,不会影响⽤户使⽤其他功能。
第1章C/S应用框架介绍内容简介:基于框架来开发具体的应用系统已然是软件开发的主流模式,比如基于CORBA/ORB、J2EE/EJB、DCOM等来开发工业级和企业级分布式应用软件系统,基于ACE来开发复杂的应用服务器软件,基于MFC框架来开发Windows 窗口类应用软件,等等。
通用框架以及某类应用系统的应用框架,对应用系统软件的设计和开发的影响无疑是巨大的,好的影响当然是可以减少工作量、提高开发效率和缩短开发周期,以及构建的系统更加健壮和可扩展;不好的影响则是开发人员必须强迫自己接受这些框架倡导的一些思想、抽象概念、方法以及工具,并且通常需要经历较长时间的学习和实践过程,即使有专门的培训也不见得短期内就能够掌握,所以要想熟练运用就需要开发人员付出额外的努力。
本章将首先简单地阐述一下应用框架的概念及其优点,然后具体介绍C/S(客户机/服务器)类型的应用系统常用的且比较著名的几个应用框架和技术,包括CORBA、DCOM和ACE,最后阐述它们各自的特点和优缺点。
本章将作为第二章“基于消息驱动的通用C/S应用框架设计和实现”的背景和铺垫。
1.1 什么是应用框架1.2 C/S模型的演变1.3 CORBA分布式面向对象体系结构1.4 COM/DCOM1.5 ACE架构1.1 什么是应用框架为什么要开发和使用应用框架呢?这是因为某些类型的应用软件都具有一些基本的需求、特性以及方法,如需要人机交互界面、文件读写、网络通信、事件处理、打印输出等等;再如某些领域(比如金融、电信、保险、医疗卫生、石油化工等)的应用软件系统也有各自共同的需求,除了人机界面、网络通信等基本需求外,还需要通信安全性、跨平台可移植、事务服务、并发服务以及构件可分布性和动态迁移性,等等。
如果将这些共性提取出来并加以整合,然后实现为某类应用软件的通用框架,就可以在此类应用系统的开发中重用这些框架,这将极大地简化日后此类应用软件的开发工作、减少工作量和加快开发速度,同时可提供统一的和标准化的软件解决方案。
额外的好处当然是编写出来的软件具有统一的架构、统一的风格和模式,可维护性和可扩展性将更好,而且由于框架必然要经过千锤百炼,所以基于这样的框架编写出来的程序将更加健壮(即使出现Bug也多是从你自己编写的代码中冒出来的J)。
一般类型的应用程序虽然没有具体应用领域的软件那么多高级而复杂的需求,但也可以针对基本需求提炼出通用的框架,例如多媒体应用程序、经典的客户机/服务器(C/S)应用等。
面向对象语言的出现(如Smalltalk、C++、Java 等),使得应用框架的设计和实现成为可能,并且很快就出现和发展了大量的应用框架,比如针对网络服务类应用程序开发的架构有CORBA、J2EE和ACE等,针对一般窗口类应用程序开发的框架有MFC、OWL、OpenClass等,针对多媒体应用软件的框架有Microsoft的DirectX系列,等等。
我们很多人即使没有使用过这些技术和应用框架,但也可能听说过。
那么到底什么是应用框架呢?它和类库有什么区别呢?什么样的类库才能称得上是应用框架呢?从原理上说,一个应用框架致力于为一类应用程序提供统一的解决方案,它提供应用程序的基本结构、基本流程和骨架,但是需要用户按照一定的规则和模式来补充具体应用的细节。
应用框架指定了面向对象架构中软件组件之间的关系、工作模式和接口。
应用框架在最抽象一级上为某类应用建立通用模型,所以应用框架为用户提供的是一套架构、模式和规则。
当然,应用框架几乎肯定是建立在一套类库的基础之上的,所以也可能会提供一些预定义好的通用组件,用户可以直接使用这些组件,或者也可以扩展它们。
此外,应用框架还会解决一类应用程序的基本性和通用性的问题并提供相应的基础设施。
具体地讲,应用框架就是一组内聚性和逻辑性强、组织良好的类和类库,但是它并不包含实际的对象。
框架中的类彼此关联或包含,并且彼此交互和合作,所以它们都不能单独使用,而必须共同重用。
此外,用户不能修改框架中的任何类,而只能从框架中的基类派生出自己的具体应用类,当程序运行起来后由框架按需要自动创建这些类的对象并调用它们,或者由用户手工创建并调用它们,这符合共同封闭原则。
比如MFC,它不仅仅是个类库,它提供了对基于窗口的人机交互界面的Windows API的封装和面向对象的模型,提供了消息映射、分发和传递以及处理的框架,提供了对运行时对象类型识别(RTTI)和动态创建对象的支持,提供了数据持久化机制,提供了Document/View框架来支持数据处理和展示,以及对COM开发的支持等等,MFC提供了几组设计巧妙的宏来支持这些机制。
此外,MFC还提供了基本控件封装、绘图支持、数据库访问支持以及Internet服务支持和一些基本的集合类等。
MFC配合集成开发环境(IDE)中提供的向导工具就可以不费吹灰之力地制作出一个应用程序的初始框架代码。
随着技术的不断发展,MFC还会加入更多的应用支持,并不断演变为更加完善和强大的工具。
再如CORBA,它致力于解决网络环境中异构平台上的不同应用程序之间的互操作性问题,它将这种互操作性抽象为CORBA对象的接口调用。
它不仅规定了IDL接口标准以实现这种抽象的客户机和服务器之间的调用协议,还制定了GIOP协议来完成用各种语言实现的CORBA对象之间的消息传递,各种平台上的ORB实现更是屏蔽了底层硬件体系结构和操作系统以及网络协议的细节,确保应用层的代码具有最大的可移植性;而且它提供了很多公共服务如命名服务、安全通信服务、事务服务、事件通知、持久化服务等基础设施以及它们的访问接口。
而普通的类库中的类之间显然没有那么强的耦合性,大多数类可能彼此独立,无任何关系,只有少数的类之间存在一些简单或松散的耦合关系。
比如C++ STL库中,容器和通用算法可以通过迭代器而在一起合作,但是具体一个容器类、一个算法和一个迭代器类之间却没有必然的关系;各种容器类之间也不存在任何关系;函数对象可用于通用算法,但是具体某个函数对象却和任何通用算法之间不存在耦合;等等。
STL库中的各类组件之间是通过模板和标准接口适配在一起的,而不是耦合在一起的,所以它们可以独立发展。
另外一些类库主要是解决某一类技术问题,而不是针对某一类应用软件开发的,比如数学类库、图形类库、XML文档解析类库等等。
最后,应用框架把程序员从一些通用的和公共的但却很繁琐的工作中解放出来,从而可以让他们把主要精力集中在应用层业务逻辑的设计和实现上,显著地提高生产率。
近年比较著名的ACE就是这样的框架。
1.2 C/S模型的演变经典的基于网络消息的客户机/服务器模型如下图所示:图1-1 基于消息的C/S模型在这个模型中,服务器首先启动并开始侦听客户机的远程连接请求,当客户机发起连接请求并被服务器接受后,就可以向服务器依次发送预定义好的请求消息。
服务器在收到客户机的请求消息后就可以解析这些消息,然后执行所请求的操作,最后构造并向客户机发送应答消息,客户机通过解析应答消息就可以知道请求是否执行成功以及执行的结果。
这些消息可能是二进制结构的字节流,也可能是文本格式的字节流,如XML文档消息,等等。
在一个C/S系统中,通常服务器要能同时为多个客户机服务,小到几个、几十个,大到几千、几万个。
任何一个时刻,在服务器和各个客户机之间都可能同时有消息进行传递,如下图所示:图1-2 客户机/服务器系统如果让用户自己编写代码来实现客户机和服务器之间往来业务消息的封装、发送以及接收、解析、分发和处理等所有任务,将是一个很艰巨、很繁琐和很耗时的工作,而且很容易出错。
特别是二进制结构的消息,除了消息本身结构不清晰和不易读外,还需要在发送前将多字节数据从本地机器的字节序转换为网络序,以及在接收后进行相反的转换。
特别是服务器程序,还要能够同时处理多个客户机的连接请求和服务请求,编写服务器程序底层的通信连接管理和消息收发服务又是一个很大的挑战。
特别地,如果用户每开发一个C/S应用系统,都要将这些工作重来一次的话,不仅费时费力费钱,而且没有必要;即使用户这样做了,也会存在很多问题。
首先,消息格式是自定义的非标准格式,可能不会考虑可扩展性等问题;其次,用户可能仅仅针对当前使用的平台进行开发,不会考虑跨平台可移植性,所以与操作系统API和网络通信协议绑定得很死,不能适应将来的移植和扩展要求;最后,如果没有很好的规划和隔离,如果没有设计好软件的架构,客户机和服务器之间通信的代码、消息解析和分发的代码就会和上层业务处理的代码纠缠在一起,每当新增业务功能及新增消息时,都将导致大面积的代码修改。
随着面向对象思想和编程技术的出现及发展,又出现了面向对象的C/S模型。
从面向对象的角度看,一个对象A 调用另一个对象B的某个操作,对象A就可以被看作一个客户对象,而对象B也可以被看作一个服务对象。
同理,对于跨进程、跨网络的客户机和服务器来说,也可以用对象访问的方式进行建模,如下图所示:图1-3 面向对象的C/S模型面向对象的模型特别适合于创建分布式C/S应用。
特别是大规模的复杂应用系统,往往需要网络中的多台主机和多个应用程序协同工作以均衡负载,而这些主机之间并没有明确的客户机和服务器角色分工(客户机/服务器的角色被淡化了)。
使用面向对象的架构,就可以让设计和开发人员直接从用户的需求出发来考虑问题,并将这些需求直接映射为客户机和服务器之间的面向对象接口(例如C++抽象类或Java的Interface),使开发人员直接面向远程对象的服务接口进行开发,完全屏蔽了底层系统之间消息传递和消息处理的细节,CPU硬件结构、操作系统I/O以及网络协议的差异都可以用中间件来适配,甚至不需要去关心客户机和服务器在网络中的位置、它们之间如何建立连接以及如何进行通信等问题。
目前这样的分布式面向对象系统有很多,比如CORBA、COM/DCOM、ACE-TAO、J2EE-RMI等。
COM/DCOM 是面向组件的C/S模型,它们是面向对象C/S模型的更高级形式。
下面简单介绍一下CORBA、COM/DCOM和ACE,其他分布式面向对象中间件所遵循的原理和技术是类似的。
1.3 CORBA分布式面向对象体系结构公共对象请求代理结构(CORBA)是一个被软件工业界广泛认同和采纳的、用来开发分布式面向对象应用软件的体系结构,同时也是由OMG(国际对象管理组)制订的软件互操作国际标准,其目的就是提供一个分布式应用程序开发的公共框架,使得在分布于计算机网络中的各种异构平台上(硬件或操作系统都不尽相同)实现的软件都可以互连、互通和互操作。
1.3.1 CORBA运行时架构CORBA以ORB(对象请求代理)作为软件之间在底层交换信息的通道,不同的厂家都可以开发特定平台下的ORB 产品和CORBA公共服务,只要都遵循CORBA标准,就可以相互传递软件信息。