一般来说,采用ESB路由模式集成的服务提供者具备类似的功能,只是接口形式不同。比如,各个库存管理系统都支持查询库存数量的服务,其中有些库房管理系统支持Web Service格式的查询接口,有些只支持基于RMI-IIOP协议的接口。
对于服务申请者而言,只关心一个抽象的服务,并不关心支撑这个抽象服务的具体的服务提供者。比如,查询库存数量的用户,只关心是否能够查询到准确的库存数量,不关心这个数量具体是从哪个库存管理系统中查询出来的。
因此,可以将多个服务提供者整合到SIBus的一个出站服务(Outbound Service)之中,其中的服务目标(Service Destination)对应抽象服务,而每个端口目标(Port Destination)对应一个服务提供者。SIBus中的入站服务(Inbound Service)和出站服务(Outbound Service)以服务目标(Service Destination)作为联系枢纽,服务申请首先到达服务目标,从服务目标再经端口目标到达最终的服务提供者。
这种实现方式的概念清晰,结构简单,只需要一个服务目标。不过,还需要为出站服务手工整合各个服务提供者的WSDL文件,存在一定的实施难度;而且,在整合出站服务WSDL文件时,如果各个服务提供者WSDL文件存在Operation重名现象,就会造成整合后的WSDL文件中出现函数重载,在实际生产环境中,函数重载是要尽量避免的。
未经服务整合,在队列目标(Queue Destination)实现路由选择
图 3:未经服务整合,在队列目标实现路由选择

在相应的SIBus上,创建一个新的队列目标(Queue Destination),在该队列目标上接收入站服务(Inbound Service)的服务申请。同时,为多个服务提供者各自创建出站服务(Outbound Service),每个出站服务包含一个服务目标(Service Destination)和一个端口目标(Port Destination)。
入站服务和出站服务的目标(Destination)之间,可以互通消息。在队列目标上实现路由选择,直接将消息转发给相应的端口目标,不再经过服务目标。
采取这种实现方式无需手工整合各个服务提供者的WSDL文件,配置相对比较简单,只是增加了SIBus上需要管理的出站服务和服务目标的数量。不过,另一方面,由于SIBus只能允许通过JAX-RPC直接访问服务目标,不允许直接访问队列目标和端口目标,因此,这种实现方式下,服务申请者不能直接快速的访问SIBus,只能通过入站服务访问SIBus,从某种意义上降低了性能。
未经服务整合,在服务目标(Service Destination)实现路由选择
图 4:未经服务整合,在服务目标实现路由选择

| 第1页: 第1页 |