企业服务总线的实施策略与总线集成(二)

日期: 2008-08-27 来源:TechTarget中国 英文

  SIBus中的配置


  1)首先需要在SIBus中定义外部总线,需要注意的是必须将”路由定义类型”选为”直接,MQ链接”,这说明了外部总线的类型。当需要在Websphere中互联SIBus时就需要定义外部总线。这里我们虽然不是SIBus之间的互联,但是为了和Websphere之外的MQ连接,也需要定义外部总线。在外部总线上我们可以定义属于其的外部目标,而这个外部目标将扮演MQ中的队列在SIBus中的代理。下面我们在配置消息传递引擎上的MQ链接时,需要使用这个外部总线名。


  2)定义消息传递引擎,把服务器作为总线成员添加后,总线上就会有对应的消息传递引擎。消息传递引擎会实际负责与MQ通信的处理。我们需要在消息传递引擎中创建”Websphere MQ链接”来设置其与MQ互联的参数。


  选择”LOCALBUS”的”其他属性”=>”消息传递引擎”。单击引擎名,选择”其他属性”=>”Websphere MQ链接”,一共有四个步骤需要完成。分别详细说明如下。


  步骤1、链接名称设置为”BusToMQ”,外部总线选择”FOREIGN_BUS”,队列管理器名称”QM_TheBus”,单击”下一步”。


  链接名称是一个可选的参数,可以自由命名。但是外部总线名称必须选择在此之前创建的外部总线,例中为”FOREIGN_BUS”。队列管理器的名称也很重要,前面说过,消息传递引擎在MQ看来就类似一个远程的MQ,而MQ与SIBus的通信方式与普通的远程主机上的MQ的通信的配置并没有什么不同。既然消息传递引擎模拟MQ,那么我们就需要定义队列管理器的名称。例中为QM_TheBus,这个名称在后面MQ的配置仍然会发挥作用。它必须与MQ中定义的发送方通道的传输队列的名称一致。它也是在MQ中定义一个远程队列时所映射到的SIBus上的本地队列的队列管理器的名称。



  图 3:设置一般Websphere MQ链接属性


  步骤2:发送方通道 WebSphere MQ 链接属性。发送方通道和接收方通道成对地起作用。该通道将成为用于将消息从总线发送到 WebSphere MQ 的连接。它需要与我们的MQ的队列管理器所使用的名称、主机名和端口相匹配,以接收来自总线的消息。缺省情况下,队列管理器使用端口 1414 接收传入的消息。由于我们的样例中MQ与SIBus存在于同一台主机上,因此主机名为localhost。这也是Message Broker所部署的消息流所在的主机名。


  需要注意的是这里定义的发送方MQ通道名必须与后面MQ配置中定义的接受方通道名一致。在没有启用安全性的情况下,传输链选择如图所示的OutboundBasicMQLink



  图4:设置发送方通道Websphere MQ链接属性


  步骤3:接受方通道的名称必须与MQ中定义的发送方通道的名称设置一致,输入”MQToBus”。


  步骤4:其他所有的选项都使用缺省选项,保存之。


  MQ中的配置


  MQ中的配置主要是两个通道,一个是用来接受SIBus的消息传递引擎发送过来的接受方通道,其名称必须与SIBus中消息传递引擎的发送方通道名称一致。另外一个是用来向消息传递引擎发送消息的发送方通道,需要首先定义一个传输队列,并且设置远程主机的地址和端口。


  1) 创建传输队列


  在Websphere MQ资源管理器的队列中新建一个本地队列,名称设置为”QM_TheBus”,使用类型选择为”传输”。


  2) 定义MQ发送方通道


  在Websphere MQ资源管理器中选择高级=>通道,选择新建发送方通道。


  Channel Name:MQToBus(该名称必须是在定义 MQ 链接上的接收方队列时所使用的名称)
  Transmission Protocol:TCP/IP
  Connection Name:运行 SIBus(端口)的计算机的主机名。对于缺省的独立的 WebSphere Application Server 安装,该值为 localhost(5558)。样例中为5559,可以在Websphere的端口中查到该SIB_MQ_ENDPOINT_ADDRESS 端口的值。
  Transmission Queue:QM_TheBus。



  图 5:设置MQ发送方通道


  3)定义接受方通道


  同样在高级=>通道中新建一个通道,这次选择接受方通道。将通道名称设置成SIBus中定义的发送方通道的名称”busToMQ”,传输协议选择”TCP/IP”。


  从SIBus向MQ发送消息


  现在SIBus与MQ互联必需的两者之间的配置已经完成了。为了使订单请求能够从SIBus上到达MQ,我们需要在SIBus上定义一个远程目标(Foreign Destination)。这个远程目标是Message Broker的MQ入队列在SIBus上的代理。发送到SIBus上的这个远程目标的消息将会通过SIBus上的消息传递引擎和MQ的接受方通道最终达到MQ的队列管理器上的队列中。订单消息到达这个队列后,因为是Message Broker部署的消息流的入队列,Message Broker会取走这个消息,随后做处理,处理后的消息会存放在Message Broker定义的出队列中。例中MQ的队列管理器为WBRK_QM.。


  1) 在总线的”其他属性”=>”目标”,点击进入,选择新建,目标类型选择”外部”。


  2) 设置属性


  ·标识:ForeignQueue@WBRK_QM(必须是WBRK_QM队列管理器上真实存在的队列ForeignQueue,若不存在需要首先创建这个队列)
  ·总线:FOREIGN_BUS(外部总线,该外部总线通过消息传递引擎链接到MQ上的WBRK_QM队列管理器)



  图6:在SIBus中定义映射到MQ中队列的外部目标
 
  从MQ向SIBus发送消息


  Message Broker处理结束的订单状态的消息到达MQ出队列后,我们需要将它发送到SIBus上。为了完成这个任务,需要分别在SIBus上定义队列目标和在MQ上定义远程队列。SIBus上的队列目标的创建与外部目标的创建过程类似,只是目标类型必须选择”队列”而不是”外部”。SIBus上的队列(例中为LocalQueue)创建成功后,我们就可以在MQ的队列管理器(例中为WBRK_QM)定义一个远程队列映射到SIBus上的队列目标LocalQueue。为了与Message Broker消息流的处理集成起来,这里在MQ中定义的远程队列也必须同时是在Message Broker中的消息流的出队列。


  1)在WebSphere MQ队列管理器中选择 WBRK_QM队列管理器,扩展Queue,右键选择New=>Remote Queue Definition


  2)输入或设置以下值


  ·Queue Name: ForeignQueue
  ·Remote Queue Name: LocalQueue(必须是SIBus上的同名的本地队列)
  ·Remote Queue Manager Name: QM_TheBus(必须是创建MQ链接时设置的队列管理器的名称)
  ·Transmission Queue Name: QM_TheBus(传输队列的名称)



  图7:在MQ中定义映射到SIBus中的队列目标的远程队列
 
  Message Broker中的消息转换


  前面讲述的是如何在两个不同的策略实现的ESB上做寻址,但是当消息到达Message Broker实现的总线时,为了能够调用Message Broker的消息流中集成的制造厂的订单请求Web服务接口,我们需要对消息的格式进行转换。


  Message Broker中对于消息的处理有很好的语言支持,也就是ESQL,通过它我们可以很方便的根据MQ的消息体中的内容,构造新的SOAP消息。在Web服务返回后,我们需要根据返回的SOAP消息体构建新的MQ消息。


  消息的转换的处理流程如下图所示。上方的消息流程是完成路由到甲或乙制造厂的功能。最下方的消息流是订单请求路由到乙制造厂的处理流程。BJMQ2Http计算节点完成MQ的消息到HttpRequest1集成的乙制造厂的Web服务的SOAP请求消息的转换,而BJhttp2mq则完成的是对SOAP返回消息到MQ消息的转换。



  图8:MB中的订单总线完整的消息流


  在开发从MQ消息请求制造厂的订单请求Web服务时,需要注意的几个问题是


  1) MQ的消息头


  为了能将Web服务的返回的SOAP消息重新构造成MQ的消息,我们需要在MQ的消息转换成SOAP消息保留MQ的头消息。在ESQL中通过将MQ的头消息保存到环境中可以达到这个目的。


  SET Environment.MySavedMQMD = InputRoot.MQMD;


  2) Message Broker中如何集成Web服务的调用


  在Message Broker中提供了一组内嵌的节点可以集成Web服务的调用,HttpRequest节点就是一个用来配置集成Web服务请求的节点。在HttpRequest节点的属性中可以设置甲或乙制造厂的订单请求的Web服务的URL,如下图所示:



  图9:设置HttpRequest节点的Web服务地址


  3) 在ESQL中使用XMLNS域处理消息格式的转换


  在我们的场景中为了实现自解析而不需要定义消息集的目的,我们设定了HttpRequest和消息流中的MQ的域是XMLNS。XMLNS域对带命名空间的XML格式消息可以实现自解析。这里的转换工作我们使用ESQL语言完成,构建消息的过程必须参照特定的Web服务的SOAP的请求的描述。使用ESQL语言处理XMLNS域的消息与普通的XML域的不同,主要在命名空间的处理上。自解析的XML消息在Message Broker中会解析成一颗消息树,但是在SOAP的请求消息中会有很多的命名空间,这是我们需要处理的额外内容。这些命名空间通常包括 “http://schemas.xmlsoap.org/soap/envelope/”等,以及我们的场景中的Web服务定义的命名空间”http://csdl.ibm.com”。请参阅在Message Broker Toolkit 的帮助文档中ESQL中关于XMLNS的部分。我们场景中的MQ和SOAP消息之间的转换的ESQL的代码在附带的样例下载中。


  小结


  到这里,SIBus与WBI Message Broker的集成工作已经完成。在我们的场景中,不同策略实现的ESB的互联发生在当用户查询自己生产的零件的价格并且发现零件库存为零。这时会往SIBus上的外部目标写入订单请求消息。通过互联配置,订单请求消息会到达MQ的队列中。


  Message Broker的消息流根据消息的内容路由到甲或乙两个不同的制造厂。Message Broker的消息流会将MQ的消息转换成SOAP的请求消息后,请求甲或乙两个不同制造厂的提供的订单请求接口。而订单请求的状态返回也是SOAP的返回消息,再转换成MQ的消息后,将会放到MQ的出队列中。而MQ出队列的消息通过互联的配置又路由回了SIBus中。


  回顾一下我们所做的主要工作在于如何在SIBus和MQ中配置与对方的通信,因为是相互独立的软件,所以经常遇到必须将某些名称设置为一致的情况,这是读者在实际配置时必须要注意的一点。由于篇幅的关系,随文可以下载的样例中包含了更加详细的配置说明过程。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • 总线技术究竟该不该用?

    曾几何时企业服务总线(ESB)被视为企业IT的核心。今天,不仅ESB受到了比被废弃还要糟糕的攻击,若干开发趋势似乎对更简单的消息总线也发起了质疑。

  • 架构安全模型开发方式探索

    维护一个强大的安全模型,以及相关合规和管控的需求越来越重要,特别是在如今黑客和入侵几乎每天都会发生的情况下。

  • 锐易特依托大数据升级核心产品

    锐易特的核心产品企业服务总线(RES ESB)V6.0版本的成功发布,为我们重新审视国产中间件的信息整合之路,提供了宝贵机会。公司负责人介绍了产品升级后的性能及企业发展策略。

  • 从ESB到微服务:如何演变?

    从web开发人员的角度看,大量的微服务部署到轻量级的Karaf 容器中,这就符合了ESB的定义。