前言 软件行业面临的四大历史问题——质量问题、效率问题、互操作问题和灵活应变的问题,今天依然困扰着软件行业。中间件技术就是在克服这些软件行业及应用的共性问题中不断发展和壮大起来的。中间件与操作系统、数据库并称三大核心基础软件,是构建应用软件的基础。中间件也被形象地比喻为“软件胶水”,它使软件开发人员更容易实现通信和输入输出,可为网络分布式计算环境提供通信服务、交换服务、语义互操作服务等系统之间的协同集成服务,解决系统之间的互连互通问题。从本质上来说,中间件通过复用、松耦合、互操作和标准化等机制来提高软件质量,加快软件研发速度,提高效率,使研发出来的产品能够相互集成并灵活适应变化。因此,中间件平台凝聚着当前逐渐发展起来的大部分软件技术和成果,涵盖更好的程序设计语言、更好的软件架构、更好的平台和软件开发技术,如面向对象、组件开发、面向切面、面向服务的架构和微服务等。 凯文·凯利在其著作《失控》中提到: “最深刻的技术是那些看不见的技术,它们走下精英阶层,不断放低身段,将自己编织进日常生活的肌理之中,直到成为生活的一部分,从我们的视线中淡出。”在当今的计算机和软件产业中,相比大数据、人工智能、物联网这些炙手可热的概念和技术,中间件似乎消失在当前的热门技术谱系中。同时,这个淡出的过程也是中间件从高科技领域走向大众,进而编织进整个软件工业,成为当前分布式计算和互联网软件运行的底层支撑平台的过程。 笔者从2009年博士毕业就开始从事软件工程和计算机专业的教学工作。第一次教授的课程恰好是“中间件技术”,边教边学,边学边教。十几年来,一方面惊喜于软件技术的日新月异,感叹于各种中间件技术及其框架的精妙; 另一方面也深感软件技术在快速变革和迭代。大学生和当今的软件从业者应具有举一反三、灵活变通地分析和解决问题的能力。除了“中间件技术”课程,近年来由于工作需要,笔者也教授了“C++程序设计语言”“C#程序设计语言”“数据库管理系统”“软件工程导论”“算法设计与分析”“大数据分析”“人机交互”“面向对象分析与设计”等诸多课程。通过梳理这些软件工程类和计算机类的专业课程,笔者发现中间件技术的发展与编程语言、软件工程的发展是一脉相通的。通过中间件技术的学习,学生们可以把计算机和软件开发的工程化的思想、原理很好地结合在一起。通过学习中间件技术的发展历史,熟悉中间件技术的框架,学生们可以更好地理解软件的底层技术和软件工业的演变史,融会贯通,进而利用这些理论和方法解决实际问题。 中间件技术有趣且重要。但近年来中间件技术不再是技术热点,早年编撰的教材过于理论,所涉及的技术也早已不再适用,目前市面上找不到一本适合本科教学的中间件技术教材,不失为一种遗憾。由此,笔者萌生了自己编写讲义和教程的想法。经过多年的酝酿和努力,终成此书。 本书内容涉及中间件原理与定义、发展历史、远程过程调用(RPC)、CORBA框架、组件对象模型、Web容器、消息中间件、数据访问、事务处理中间件、池化和负载均衡、Web服务、微服务等,屏蔽系统异构性,将凝练共性和复用功能等驱动软件发展的思想作为主线贯穿全书。为了符合当前主流的开发技术,并与其他专业类课程相协调,本书尽量以Java技术栈为基础介绍相应的框架和技术,提供相应的编程案例,以帮助读者巩固对中间件技术的理解,进行中间件编程实践。 本书第1~3章介绍中间件技术的背景知识、基本理论和早期的经典框架,第4~11章按功能和支撑技术分类介绍了当前典型的中间件技术。各章的内容自成体系,读者可根据需要学习和查阅。具体的章节安排如下。 第1章介绍了分布式系统的基础概念,包括计算机从单机系统一直到分布式系统的发展历程; 分析了分布式系统在某些应用场景下的优势和技术难点; 介绍了分布式系统的常用框架、分布式系统和大数据之间的联系,以及分布式的大数据计算平台。熟悉分布式计算的读者可直接跳过本章,进入第2章的学习。 第2章介绍了中间件的概念和中间件产生的发展历程,包括中间件产生的原因和驱动力; 介绍了中间件的特征、功能和中间件的分类,以及一些常用的中间件技术和产品; 最后从全球和国内两个角度介绍了中间件的产业和市场。 第3章介绍了国际标准化组织(ISO)提出的RMODP标准。从面向对象的角度阐述其标准组成与功能组成; 介绍了由OMG提出的OMA体系结构与CORBA规范,同时分析了CORBA相比传统开发模式的优势; 最后介绍了微软公司提出的COM组件对象模型和.NET组件,并阐述了两者之间的区别。 第4章介绍了远程过程调用(RPC)的概念,远程过程调用的原理和调用流程; 介绍了基于Java的远程方法调用RMI的概念、原理,并通过实例来讲解RMI机制; 最后总结了RPC与RMI的区别并介绍了RMI的主要优点。 第5章介绍了Web服务器的概念并阐述其工作原理; 介绍了Web容器及Web容器所用到的技术和思想——解耦合、控制反转、面向切面编程; 介绍了Java EE和Spring框架的主要技术组成; 最后通过编程案例,帮助读者学习Web容器编程和AOP编程的原理。 第6章介绍了消息中间件的概念、发展历史、中间件的产品和使用场景,详细说明了消息中间件的架构、要素,以及常用的协议; 介绍了在Java平台上的消息中间件规范JMS,包括JMS架构和程序接口的介绍,以及实际编程的例子; 介绍了消息驱动的Bean组件,包括消息的异步处理和消息选择器。 第7章介绍了数据访问应用程序接口,包括ODBC、OLE DB、ADO,以及以Java API形式提供服务的JDBC; 介绍了对象关系映射的概念和Hibernate框架,并用案例演示对象关系映射的编程; 介绍JPA持久化框架的概念和持久化对象的过程,并阐述了具体框架与JPA之间的关系,以及其他的持久化框架。 第8章介绍了事务的基本概念,介绍了分布式事务处理,包括事务处理中间件的概念和两阶段提交协议; 介绍了EJB事务体系结构,包括容器管理的事务处理和Bean管理的事务处理; 最后介绍了JTA事务处理的机制,通过实际编程例子来帮助读者学习理解JTA的工作原理。 第9章介绍了资源池化技术的概念,介绍了对象池、数据库连接池、线程池等技术,包括Commons Pool的概念和编程,通过实际例子帮助读者学习理解池化技术; 介绍了负载均衡的概念和典型技术方案,包括LVS负载均衡、DNS负载均衡和基于Nginx反向代理的负载均衡技术等。 第10章介绍了Web服务的基本概念、发展历史和Web服务中的关键技术,包括XML、SOAP、WSDL和UDDI等; 介绍了Web服务中两种主流的实现方式——基于SOAP和REST的Web服务,并给出了实际编程案例; 最后介绍了面向服务的体系结构(SOA),并说明了Web服务与SOA之间的联系。 第11章介绍了软件服务架构的发展,微服务的概念、架构体系、设计模式和常用的微服务架构方案; 介绍了经典的微服务开发框架Spring Cloud,包括Eureka、Ribbon、Hystrix、Zuul、Config 5大核心组件,并给出了实际编程案例; 最后介绍了微服务的开发模式,包括服务拆分的准则等。 本书由笔者讲授厦门大学软件工程专业“中间件技术”课程的讲义整理而得,面向高等院校软件工程、计算机和信息管理等专业的学生,可作为中间件技术和软件组件技术等课程的教材。本书对应一个学期16~18周的课时量。其中,第1~3章每章安排2学时,第4、6、7、8、9、11章每章安排3学时,第5、10章每章安排4学时。本书也为读者和大学教研人员提供了翔实的课后参考资料,包括PPT课件、学习和实验指导、课后思考题及参考答案等。读者可以从清华大学出版社的官方微信公众号“书圈”(见封底)下载。 本书主要由赖永炫教授构思执笔,厦门大学移动计算与数据分析实验室(MOCOM)的硕士生杨诗鹏、江丽英、廖林波、曹辉彬、张乐、袁鹏轩、孟戈等做了大量的辅助性工作。厦门大学多届学习“中间件技术”课程的同学为本书提供了第一手的反馈和修订意见,在此衷心感谢这些同学的辛勤工作。也感谢笔者的女儿赖书妍,她给笔者的生活带来色彩,让本书的撰写更加顺利。 笔者在本书撰写过程中参考了大量的国内外教材和专著,以及一些网络上的技术博客,对涉及中间件技术的知识进行了梳理、归纳和总结,将一些重要的知识和案例纳入了本书,特别向这些文献的作者表示感谢。本书也是笔者十多年来在软件工程方面教学和科研工作的总结。读者在阅读本书及使用配套资源的过程中如有任何问题和建议,请联系404905510@qq.com,望不吝赐教。 赖永炫 于厦门大学海韵园 2024年1月