跳转到主要内容

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

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

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

  • 关闭 [x]

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

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

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

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

  • 关闭 [x]

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

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

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 的企业整合:基于服务的应用程序集成分步指南》一书。

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

查看本系列更多内容

发布日期: 2012 年 1 月 12 日
级别: 中级 原创语言: 英文
访问情况 : 1956 次浏览
评论: 


简介

企业服务总线 (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 的流程

请注意,大部分步骤(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 中使用通用端口的许多优势。


参考资料

学习

讨论

关于作者

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 的企业整合:基于服务的应用程序集成分步指南》一书。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


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


忘记密码?
更改您的密码

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

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 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

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。