用于企业服务总线的类 USB 通用端口类型: 第 2 部分:概念、流程和实现

了解用于 ESB 的通用端口的概念和实现

在第一期(本系列的第 1 部分)中,了解了当前可用的企业服务总线(ESB)的基本功能。在第 1 部分中,了解了当前可用的 ESB 在使用上的一些差异。在这一期(本系列的第 2 部分)中,将了解用于 ESB 的通用端口类型的新概念,以及如何实现通用端口。通用端口为当前的 ESB 用户遇到的许多问题提供了解决方案。通用端口的工作原理类似于计算机的 USB 端口,将各种类型的设备连接到计算机。类似地,通用端口可用于将任何应用程序连接到 ESB 并间接地连接到其他应用程序。这些应用程序可以采用不同形式的服务来公开其部分或所有功能,并仍然使用单一端口类型。在下一期(本系列的第 3 部分)中,将了解通用端口的许多收益。

Dr. Waseem Roshen, IT 架构师, 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 的企业整合:基于服务的应用程序集成分步指南》一书。



2012 年 1 月 12 日

简介

企业服务总线 (ESB) 是面向服务的架构 (SOA) 基础架构中的一个关键部分。ESB 提供了有效的途径来彼此连接应用程序。这些应用程序可能采用了不同形式的服务来公开其部分或所有功能。图 1 中显示了当前可用的 ESB 的这一特征。在此图中,要注意的最重要一点是,每个应用程序使用一种特定类型端口连接到 ESB。换句话说,每种端口类型适用于一种特定类型的应用程序,这些应用程序使用特定的通信协议和消息/数据格式类型来公开它们的功能。

应用程序使用特定端口类型连接 ESB
应用程序使用特定端口类型连接 ESB

在第一期(本系列的第 1 部分)中,了解了当前可用的 ESB 所提供的基本功能,其中包括基于内容和上下文的路由、协议转换和数据/消息格式转换。在第一期中,还了解了在目前可用的 ESB 的使用上的一些常见问题。这些问题和不便性包括一个应用程序使用多种通信协议、应用程序切换通信协议、将 ESB 的用途扩大到新通信协议、针对大量应用程序的可扩展性,以及 ESB 的一般性维护和更新。

在这一期(本系列的第 2 部分)中,将向您介绍一种新的 ESB 类型,它采用了通用端口类型。在下一节中,将了解通用端口的基本概念。实现 USB 的一般流程将在这一期的第 3 节中介绍。在第 4 节中,您将学习两种检测连接应用程序所使用的通信协议的方法。这一期的最后一节将包含一些总结性评论。

通过用端口概念

为了克服上一期(本系列的第 1 部分)中列出的目前的 ESB 的不足,这里提出了一种新的 ESB 类型。这种新 ESB 将采用单一的通用端口类型,该端口适用于大部分或所有应用程序类型,如图 2 所示。这将消除对为每种新应用程序类型开发和部署新端口类型的需要,将实现更高的代码重用率。

应用程序使用单一端口类型(通用端口)连接 ESB
应用程序使用单一端口类型(通用端口)连接 ESB

为了理解通用端口类型的概念,采用一种对计算机硬件(比如 PC)的模拟会有所帮助。在 USB 端口出现之前,为了将不同的设备(比如打印机、闪存或移动硬盘)连接到计算机,计算机需要拥有不同的端口类型。每种端口类型适用于一种特定的设备类型。因此,要将打印机连接到计算机,将必须在计算机内构建一种特定的端口类型。类似地,计算机中必须提供不同的端口类型来连接额外的硬盘驱动器。但是,最近由于 USB 端口的出现,为每种设备类型使用独立的端口类型的需要已被消除,现在几乎任何设备都可以使用单一的端口类型(成为 USB 端口)连接到计算机。

流程

图 3 中给出了具有通用端口的 ESB 的一般工作流程。该流程包含以下步骤:

  1. 该流程从应用程序通过类 USB 端口连接到 ESB 并发送消息时开始。此消息可以是任何格式,并且可以使用任何协议发送。
  2. 消息由一个协议检测器软件组件拦截,该组件可确定应用程序所使用的通信协议。
  3. 确定通信协议后,消息发送到合适的协议处理器组件。请注意,系统将为每个给定协议提供一个协议处理器组件。因此,我们将为 HTTP、SMTP、IIOP 等协议提供独立的协议处理器。这些协议处理器的用途是提取消息正文,消息正文应该独立于应用程序使用的协议。
  4. 然后,将提取的消息发送到另一个称为格式检测器的软件组件。此软件组件负责确定消息格式。消息格式示例包括 SOAP、(原始)XML、copybook 等。
  5. 确定消息格式后,格式检测器组件将消息转发给合适的组件,以转换为一种公认(通用)的格式。
  6. 接下来,这种公认格式由转换软件组件转换为目标格式。这种目标格式取决于目标应用程序的应用程序类型。
  7. 然后,转换软件组件会将消息发送到目标协议生成器组件。收到消息后,目标协议生成器组件使用具有目标格式的消息生成目标协议。
  8. 最后,目标协议生成器组件将消息发送到目标应用程序。
实现具有通用端口类型的 ESB 的流程
实现具有通用端口类型的 ESB 的流程

点击查看大图

实现具有通用端口类型的 ESB 的流程

实现具有通用端口类型的 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 中使用通用端口的许多优势。

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


这是您第一次登陆到 developerWorks,已经自动为您创建了您的概要文件。 选择您概要文件中可以公开的信息的信息(如姓名、国家/地区,以及公司),这些信息同时也会与您所发布的内容相关联。 您可以随时更新您的 IBM 账号。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and web services
ArticleID=785226
ArticleTitle=用于企业服务总线的类 USB 通用端口类型: 第 2 部分:概念、流程和实现
publish-date=01122012