企业服务总线 (ESB) 是面向服务的架构 (SOA) 基础架构中的一个关键部分。ESB 提供了有效的途径来彼此连接应用程序。这些应用程序可能采用了不同形式的服务来公开其部分或所有功能。图 1 中显示了当前可用的 ESB 的这一特征。在此图中,要注意的最重要一点是,每个应用程序使用一种特定类型端口连接到 ESB。换句话说,每种端口类型适用于一种特定类型的应用程序,这些应用程序使用特定的通信协议和消息/数据格式类型来公开它们的功能。
应用程序使用特定端口类型连接 ESB
在第一期(本系列的第 1 部分)中,了解了当前可用的 ESB 所提供的基本功能,其中包括基于内容和上下文的路由、协议转换和数据/消息格式转换。在第一期中,还了解了在目前可用的 ESB 的使用上的一些常见问题。这些问题和不便性包括一个应用程序使用多种通信协议、应用程序切换通信协议、将 ESB 的用途扩大到新通信协议、针对大量应用程序的可扩展性,以及 ESB 的一般性维护和更新。
在这一期(本系列的第 2 部分)中,将向您介绍一种新的 ESB 类型,它采用了通用端口类型。在下一节中,将了解通用端口的基本概念。实现 USB 的一般流程将在这一期的第 3 节中介绍。在第 4 节中,您将学习两种检测连接应用程序所使用的通信协议的方法。这一期的最后一节将包含一些总结性评论。
为了克服上一期(本系列的第 1 部分)中列出的目前的 ESB 的不足,这里提出了一种新的 ESB 类型。这种新 ESB 将采用单一的通用端口类型,该端口适用于大部分或所有应用程序类型,如图 2 所示。这将消除对为每种新应用程序类型开发和部署新端口类型的需要,将实现更高的代码重用率。
应用程序使用单一端口类型(通用端口)连接 ESB
为了理解通用端口类型的概念,采用一种对计算机硬件(比如 PC)的模拟会有所帮助。在 USB 端口出现之前,为了将不同的设备(比如打印机、闪存或移动硬盘)连接到计算机,计算机需要拥有不同的端口类型。每种端口类型适用于一种特定的设备类型。因此,要将打印机连接到计算机,将必须在计算机内构建一种特定的端口类型。类似地,计算机中必须提供不同的端口类型来连接额外的硬盘驱动器。但是,最近由于 USB 端口的出现,为每种设备类型使用独立的端口类型的需要已被消除,现在几乎任何设备都可以使用单一的端口类型(成为 USB 端口)连接到计算机。
图 3 中给出了具有通用端口的 ESB 的一般工作流程。该流程包含以下步骤:
- 该流程从应用程序通过类 USB 端口连接到 ESB 并发送消息时开始。此消息可以是任何格式,并且可以使用任何协议发送。
- 消息由一个协议检测器软件组件拦截,该组件可确定应用程序所使用的通信协议。
- 确定通信协议后,消息发送到合适的协议处理器组件。请注意,系统将为每个给定协议提供一个协议处理器组件。因此,我们将为 HTTP、SMTP、IIOP 等协议提供独立的协议处理器。这些协议处理器的用途是提取消息正文,消息正文应该独立于应用程序使用的协议。
- 然后,将提取的消息发送到另一个称为格式检测器的软件组件。此软件组件负责确定消息格式。消息格式示例包括 SOAP、(原始)XML、copybook 等。
- 确定消息格式后,格式检测器组件将消息转发给合适的组件,以转换为一种公认(通用)的格式。
- 接下来,这种公认格式由转换软件组件转换为目标格式。这种目标格式取决于目标应用程序的应用程序类型。
- 然后,转换软件组件会将消息发送到目标协议生成器组件。收到消息后,目标协议生成器组件使用具有目标格式的消息生成目标协议。
- 最后,目标协议生成器组件将消息发送到目标应用程序。
实现具有通用端口类型的 ESB 的流程
请注意,大部分步骤(3-8)都可以在端口组件外的 ESB 的主体内执行。将第 3-8 步转移到主体内将实现更高的代码重用率。惟一留给通用端口的任务是确定连接的应用程序使用的通信协议,如图 4 所示。因此,通用端口是一个非常轻量型的组件。下一节将介绍两种确定通信协议的方法。
作为轻量型组件的通用端口,大部分处理工作都在 ESB 主体内进行
我们现在介绍两种支持将通用端口实现为轻量型软件组件的新方法。
第一种方法引入一种超级协议或元协议,可以将该协议用作每个高级协议的信封。超级协议的信封将包含一个头部,这个头部将包含应用程序使用的高级协议的类型信息(比如 HTTP、IIOP、JRMP 或 JMS/MQ),这个头部将由连接应用程序包含在消息中,作为消息的第一行。消息的剩余部分将包含更高级的协议头部和实际的消息内容。如果使用这个超级协议,那么通用端口只需分析所收到消息的第一行,即可确定连接应用程序使用了哪种高级协议。确定高级协议之后,构成通用端口的软件组件将消息转发给 ESB 主体中合适的协议监听器,以供处理。因此,通用端口将是一个非常轻量型的软件组件,它只需分析消息的第一行。此外,高级协议监听器代码将得到很好地重用,因为每个高级协议监听器将是 ESB 主体的一部分,可供任意数量的通用端口组件使用。此方法的一个细微的不足之处是,应用程序代码将需要稍作修改,才能使用这种超级协议。
下面给出了使用超级协议作为一种高级协议 (HTTP) 的信封的示例:
清单 1. 使用超级协议作为 HTTP 等高级协议的信封的示例
Protocol: HTTP Format: SOAP GET /intro.html HTTP/1.1 User-Agent: Mozilla/5.0 (Windows;en-GB;... Accept: text/*,image/jpeg, */* Accept-Language: en-gb ... ... |
因为第一行包含了所需的信息,所以通用端口中的代码只需要分析第一行,即可确定使用了哪种高级协议。完成此检测后,通用端口代码简单地调用 ESB 主体中合适的协议处理器,如图 4 所示。
第二种处理第一节中所提及问题的方法需要认识到,所有高级协议(比如 HTTP、IIOP、JRMP、JMS/MQ 等)都构建于 TCP/IP 至少。换句话说,所有这些协议都在后台采用 TCP/IP 套接字来实现应用程序和 ESB 之间的通信。而且,所有这些协议都包含头部,这些头部中的信息可用于检测连接应用程序使用了哪种高级协议。这些头部只有在传入的消息在套接字级别上可读时才能看到/读取。因此,这种检测协议的方法将依赖于在套接字级别上监听传入的消息。这将使通用端口成为一个非常轻量型的组件,因为它只需读取消息的第一个头部/行,然后将消息转发给 ESB 主体中合适的协议监听器。与第一种方法一样,这也将导致代码重用率发生更改,因为每种协议监听器都是 ESB 主体的一部分,同一个协议监听器可供任意数量的通用端口共同使用。
为了演示这种方法的使用,我们现在提供了一个使用此方法的示例。对于此示例,我们考虑使用一个 HTTP 传入请求。如果您在套接字级别读取请求,传入的 HTTP 请求的头部将与以下清单类似。
清单 2. 套接字级检测
GET /intro.html HTTP/1.1 User-Agent: Mozilla/5.0 (Windows;en-GB;... Accept: text/*,image/jpeg, */* Accept-Language: en-gb ... ... |
在这些头部中,要注意的最重要内容是第 1 行上的第一个头部。这个头部对于此协议是强制性的。在此头部中,必须包含字符串 HTTP。因此,只需查看第一行,就可以确定此协议为 HTTP。此外,这个特定的协议从一个简短的、具体的词汇列表中的一个此开始。这个列表包含一些特定的词汇,比如 GET、PUT、DELETE 等。因此也可以查看传入请求的第一行的第一个词,如果这个词与这个简短列表中的任何词匹配,则可以得出传入的消息正在使用 HTTP 协议的结论。
可以使用大部分常用编程语言(比如 Java 和 C++)在套接字级别轻松读取该消息。作为示例代码,我们提供了一段用于我们的用途的 Java 代码。
清单 3. 在套接字级别读取消息的代码
import java.io.*;
import java.net.*;
public class testServer {
//declare a socket server and a socket //client
SocketServer myServer = null;
ClientServer myClient = null;
//declare an input stream and an output //stream
DataInputStream in;
PrintStream out;
//declare a variable to hold the first //line of the incoming message
String firstLine = null;
//open a socket for listening at the port //number 8080
myServer = new ServerSocket (8080);
//accept connection
myClient = myServer.accept();
//get the incoming message
in = new DataInputStream ( myClient.getInputStream());
//store the first line of the message in a //local variable
firstLine = in.getLine();
...
...
}
|
请注意,上面代码中的变量 firstLine 包含头部信息,这是我们确定连接应用程序所使用的高级协议所需要的。使用这段简短的代码,通用端口会变为轻量型端口,然后它会调用 ESB 主体中的适当协议监听器/处理器,如图 4 所示。这也会导致较高的代码重用水平,因为每种协议监听器/处理器都可供许多不同的通用端口共同使用。
在这一期中,我们介绍了用于 ESB 的通用端口的概念。通用端口可用于将几乎任何应用程序连接到 ESB,进而间接连接到与 ESB 相连的任何其他应用程序。应用程序可以使用任何通信协议或消息格式类型,同时仍然使用单一类型的通用端口。
在这一期中,您还了解了实现通用端口的流程。您一定要提醒自己,在此流程中,通用端口是一个轻量型的组件,它的惟一功能是检测连接应用程序所使用的通信协议。此外,在这一期中,还了解了两种检测给定应用程序所使用通信协议的不同方法。
在下一期中,您将了解在 ESB 中使用通用端口的许多优势。
学习
- 最近的一本图书:“基于 SOA 的企业整合” 是一种循序渐进的 SOA 和 Web 服务方法的不错来源。
- 在
developerWorks 上的 SOA 和 Web 服务专区,您将找到关于 Web 服务和 SOA 的文章、教程、标准和其他技术资源。
- ESB 基本知识的一个非常不错的来源是这本书的第 8 章:“基于 SOA 的企业整合”。
- ESB 基本知识的另一个不错来源是一篇 developerworks 文章:“基于服务的企业集成模式轻松入门,第 4 部分:企业服务总线”。
- 有关 IBM 的高级 ESB 产品 WebSphere Message Broker (WMB) 的信息,请访问 Message Broker 信息站点。
- 有关来自 IBM 的低成本 ESB 产品的信息,请访问 WebSphere Enterprise Service Bus。
- 有关基于硬件的 ESB 产品的信息,请访问 WebSphere DataPower SOA Appliances。
- 要了解 HTTP 等通信协议的更多信息,请访问:HTTP。
- SOAP 消息格式信息的一个不错来源是 SOAP Wikipedia。
- 体验 IBM SOA 沙箱,通过 IBM SOA 入口点的实用的动手经验提升您的 SOA 技能。
- IBM SOA 网站 概述了和 SOA 和 IBM 如何帮助您实现 SOA。
讨论
- 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
- 加入 IBM 软件下载与技术交流群组,参与在线交流。
Waseem Roshen 博士拥有美国俄亥俄州州立大学哥伦布分校的博士学位,并在信息技术(IT)领域有超过 18 年的实践经验。现在 Roshen 博士是 IBM 公司 Enterprise Architecture and Technology Center of Excellence 部门的一名 IT 构架师。他在分布式计算方面有丰富的经验,包括面向服务架构(SOA)。此外,他还有定制开发、集成架构和 J2EE(现在称为 JEE)方面的专门知识。他目前感兴趣的领域包括 SOA 和 web 服务、量子计算机和云计算。Roshen 博士发表了超过 60 篇文章,拥有 37 项专利,同时还是 IEEE and the IEEE Computer Society(IEEE 和 IEEE 计算机协会)的成员。他还独立编著了《基于 SOA 的企业整合:基于服务的应用程序集成分步指南》一书。