cc2530绑定通信
本文改编自《 Apache Tuscany in Action》一书中的一章。 它研究了如何使用绑定为组件的服务连接配置有线协议。
SCA的最重要功能之一是它对各种通信协议的支持。 如果您的服务需要使用Web服务,JMS,CORBA,RMI或REST,则可以使用SCA和Tuscany进行操作。 如果他们需要使用某些专用或专有协议来满足特定的应用程序需求,那也很好。 更好的是,您的业务代码无需知道其使用的协议。 协议的选择取决于组件的配置(您猜对了)。 多么酷啊? 使所有这些成为可能的SCA魔术被称为绑定。
在本文中,我们将看到如何在服务和引用上使用绑定,以及在未配置绑定的情况下的含义。 最后,我们将研究SCA域,并了解绑定如何与SCA域内外的通信相关。
配置服务和引用的绑定
您可以在服务或引用上使用绑定。 将绑定放在服务上意味着可以使用绑定指定的通信协议来调用服务。 服务实现代码无需执行任何特殊操作即可实现此目标; 您要做的就是将绑定添加到服务的配置中。
例如,要使Bookings服务作为Web服务可用,组件定义可能如下所示:
<component name="TripBooking">
<implementation.java class="com.tuscanyscatours.TripBooking" />
<service name="Bookings">
<binding.ws uri="http://tuscanyscatours.com:8085/Bookings" />
</service>
</component>
通过添加<binding.ws>元素,我们已经告知SCA运行时,我们希望在uri属性中指定的端点上使用SOAP / HTTP将Bookings服务公开为Web服务。 这就是我们创建Web服务所需要做的。 无需学习JAX-WS或对Bookings服务的实现进行任何更改。
一个服务可以有多个绑定。 如果我们想通过JMS以及Web服务调用Bookings服务,我们只需要添加另一个绑定即可。 这是显示此示例的示例组件定义:
<component name="TripBooking">
<implementation.java class="com.tuscanyscatours.TripBooking" />
<service name="Bookings">
<binding.ws uri="http://tuscanyscatours.com:8085/Bookings" />
<binding.jms />
</service>
</component>
这使得使用默认配置设置也可以通过JMS使用Bookings服务。 同样,没有必要学习JMS API或更改任何实现代码。
绑定提供了SCA与托斯卡纳以及广阔世界之间的联系! Bookings服务是用SCA编写的,并在托斯卡纳运行。 由于此服务是使用绑定配置的,因此可以由未使用SCA编写或未在Tuscany中运行的客户端代码调用。 对于对Bookings的Web服务调用,客户端代码可以用任何语言编写,并且可以使用任何符合WS-I的Web Services运行时。 对于JMS调用,可以使用与为Tuscany的JMS绑定配置的JMS提供程序兼容的任何JMS提供程序将客户端代码直接写入JMS API。
我们已经看到了如何在SCA服务上使用绑定,以使它们可以使用标准通信协议来使用。 以相同的方式,可以在SCA参考上使用绑定来使用标准通信协议来呼叫服务。 在这种情况下,角色是相反的。 客户端是使用SCA实现的,而服务则使用一些标准的通信协议。 例如,服务可以是支持SOAP / HTTP的Web服务端点,也可以是通过RMI-IIOP进行通信的EJB会话Bean。 为了与Web服务对话,该引用将使用<binding.ws>; 为了调用EJB,我们需要<binding.ejb>。
图1显示了在服务上配置绑定和组件引用的示意图。
图1:为Bookings服务配置了Web服务和JMS绑定,为“ cars”引用配置了Web Services绑定,为“ flights”引用配置了EJB绑定。
清单1中显示了使用图1中所示的绑定配置TripBooking组件的示例组件定义。
清单1使用电线配置组件服务以及引用和服务
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
targetNamespace="http://tuscanyscatours.com/"
name="bookings">
<component name="TripBooking">
<implementation.java class="com.tuscanyscatours.TripBooking" />
<service name="Bookings">
<binding.ws uri="http://tuscanyscatours.com:8085/Bookings" />
<binding.jms />
</service>
<reference name="cars">
<binding.ws uri="http://tuscanycars.com:8081/Cars" />
</reference>
<reference name="flights">
<binding.ejb uri="corbaname:rir:#flight/FlightProviderHome" />
</reference>
<reference name="hotels" target="HotelProvider" />
</component>
</composite>
您会注意到,清单1中使用绑定配置的引用没有target属性。 这是因为 元素提供参考的目的地信息,并指定要使用的通信协议。
我们已经研究了如何将绑定应用于服务和引用。 在下一节中,我们将研究未在配置中指定绑定的服务和引用所发生的情况。
默认绑定
在清单1中,我们没有为酒店参考指定绑定。 这意味着它具有binding.sca的隐式绑定类型(通常称为default binding )。 默认绑定用于将SCA引用连接到SCA服务,将通信技术的选择留给将引用和服务部署到的分布式SCA运行时。 其他绑定(例如binding.ws和binding.jms)选择可以与非SCA代码互操作的特定通信协议或API。 因此,除默认绑定之外的其他绑定通常称为互操作绑定。
Tuscany使用SOAP / HTTP上的Web服务通过默认绑定进行远程调用。 其他SCA运行时可能使用其他标准协议(例如RMI-IIOP),或者可能使用专有协议。 将来,Tuscany可能会切换到其他默认绑定,因此Tuscany应用程序不应假定使用默认绑定意味着他们正在获取Web服务。 想要使用Web服务在组件之间进行通信的应用程序应指定<binding.ws>以确保发生这种情况。
默认绑定只能用于将引用连接到同一SCA 域内的服务 。 跨越域边界的连接必须指定一个可互操作的绑定。 域是SCA中的一个重要概念,我们将在第4章中对其进行详细描述。在下一节中,我们将简要概述什么是SCA域以及它与绑定和连线的关系。
域,绑定和连线
SCA域是SCA组件的部署和管理边界。 例如,域可以是单个应用程序服务器,服务器群集或一组服务器或群集。 整个域通常运行单个供应商的SCA实现。
每个SCA组件都是SCA域的一部分。 可以使用电线连接同一域中的引用和服务。 同一域内引用和服务之间的连接可以使用默认绑定,因为SCA保证该绑定的实现在域内是一致的。 对于域外的通信,引用和服务不能使用连线,而可以使用可互操作的绑定与其他服务进行交互。
我们将在第2章中基于TuscanySCATours公司的场景中说明如何使用域。该公司已经成长,并且已经创建了一个单独的部门来提供专门的酒店预订服务。 该酒店预订服务由TuscanySCATours的旅行预订服务使用,也仅对只想预订酒店的客户开放。 公司的两个部门使用单独的SCA域来部署和管理它们提供的服务:原始旅行预订服务的TuscanySCATours域,以及新旅馆预订服务的TuscanySCAHotels域。 图2说明了这种情况。
图2包含组件的两个SCA域,显示了组件的连接方式,每个域内的连接均使用导线(以实线表示),跨域边界的连接使用绑定(以虚线显示)。
在图2中,连接SCA组件的实线表示SCA导线,带箭头的虚线表示使用互操作绑定而不是导线的连接。 我们将首先查看TuscanySCATours域中TripBooking组件的引用的连接。 首先,航班参考连接到进行航班预订的Web服务。 这不是SCA服务,因此航班参考配置了可互操作的绑定<binding.ws>和航班预订服务的端点URI。
其次,酒店引用连接到TuscanySCAHotels域中HotelProvider SCA组件的酒店服务。 由于SCA导线无法跨越域,因此通过使用<binding.ws>和服务的端点URI对其进行配置来连接参考和服务。 最后,将TripBooking的汽车参考连接到TuscanySCATours域中CarProvider组件的Cars服务。 由于引用和服务位于同一域中,因此我们可以使用SCA导线和默认绑定将它们连接起来。 Cars服务不会在TuscanySCATours域之外公开,并且不会与非SCA代码互操作,因此不需要它具有任何可互操作的绑定。
现在,让我们看一下TuscanySCAHotels域中与HotelProvider组件的Hotels服务的连接。 除了来自TripBooking组件的酒店引用的连接之外,还有来自TusBookySCAHotels域中HotelBooker(不使用SCA的酒店预订客户端应用程序)和SCA组件HotelOffers的酒店引用的连接。 由于Hotels服务是使用可互操作的绑定<binding.ws>配置的,因此HotelBooker软件可以使用任何Web服务客户端软件来调用Hotels服务。 HotelOffers和HotelProvider之间的连接使用SCA导线,因为这些组件位于同一SCA域中。 该连接可以使用服务提供的默认绑定或可互操作的binding binding.ws。 在此示例中,我们选择使用binding.ws来说明SCA域内的导线不一定总是需要使用默认绑定。
看看如何在组件定义中配置图2中的连接非常有用。 清单2显示了TuscanySCATours域中组件的定义。
清单2 TuscanySCATours域的组件定义
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
targetNamespace="http://tuscanyscatours.com/"
name="toursdomain">
<component name="TripBooking">
<implementation.java class="com.tuscanyscatours.TripBooking" />
<reference name="flights">
<binding.ws uri="http://flightbookingservice.com:8084/Flights" />
</reference>
<reference name="hotels">
<binding.ws uri="http://tuscanyscahotels.com:8083/Hotels" />
</reference>
<reference name="cars" target="CarProvider/Cars" />
</component>
<component name="CarProvider">
<implementation.java class="com.tuscanyscatours.CarProvider" />
</component>
</composite>
清单3显示了TuscanySCAHotels域的组件定义:
清单3 TuscanySCAHotels域的组件定义
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
targetNamespace="http://tuscanyscahotels.com/"
name="hotelsdomain">
<component name="HotelProvider">
<implementation.java
class="com.tuscanyscahotels.Hotels" />
<service name="Hotels">
<binding.ws uri="http://tuscanyscahotels.com:8083/Hotels" />
</service>
</component>
<component name="HotelOffers">
<implementation.java class="com.tuscanyscahotels.HotelOffers" />
<reference name="hotels"
target="HotelProvider/Hotels" >
<binding.ws/> 1
</reference>
</component>
</composite>1 the reference is configured to use binding.ws
重要的是要指定 在HotelOffers的酒店参考中。 如果没有此选项,则默认情况下会将引用配置为使用binding.sca,这将失败,因为目标服务的配置中没有可用的binding.sca。
图2中的示例显示了SCA引用和服务的大多数连接方式。 也可以使用匹配的绑定对将SCA引用连接到同一SCA域中的SCA服务,以替代接线。 许多托斯卡纳示例执行此操作(例如,“ helloworld”系列),因为这是显示如何为连接的客户端和服务端配置匹配绑定的简便方法。
我们已经描述了有关如何连接SCA引用和服务的多种选择,值得简要总结一下。 要在同一SCA域中连接参考和服务,您可以:
- 使用具有默认绑定的电线
- 使用具有可互操作绑定的电线
- 使用匹配的绑定配置引用和服务
要连接不在同一域中的SCA参考和SCA服务,您可以:
- 使用匹配的可互操作绑定配置引用和服务
要将SCA参考或服务连接到非SCA代码,您可以:
- 使用可互操作的绑定配置参考或服务
互操作绑定使SCA代码可以与非SCA代码互操作,并允许来自不同供应商的SCA代码跨域边界互操作。 默认绑定允许供应商在不需要互操作性的地方提供优化的通信。
有关源代码,示例章节,作者论坛和其他资源,请访问http://www.manning.com/laws 。
本文改编自《 Apache Tuscany in Action》一书中的一章。 它研究了如何使用绑定为组件的服务连接配置有线协议。
通过manning.com进行订购时,InfoQ读者将获得25%的折扣 。 使用折扣代码“ infoq25”。
cc2530绑定通信