构建简单的 C++ 服务组件,第 2 部分: 通过服务组件体系结构使用 Python、Ruby 和 Web 服务

来源:互联网 发布:数据库中update的用法 编辑:程序博客网 时间:2024/05/25 01:35

http://www.ibm.com/developerworks/cn/webservices/ws-soa-capisca2/index.html

 

级别: 中级

Andrew Borley (borley@uk.ibm.com), 软件工程师, IBM UK

2007 年 8 月 28 日

您可以使用现有代码创建服务组件。通过本文可了解如何通过使用 Apache Tuscany SCA for C++ 中的 Python、Ruby 和 Web 服务支持将脚本作为 SCA 组件和 Web 服务公开。创建可重用、可组合的 SCA 组件,这些组件在组合应用程序中连接在一起,可使用最适合所构建的系统的任意技术进行公开和调用。

了解 Tuscany

Apache Tuscany 是正处于孵化期的 Apache Software Foundation 项目。此项目的目标之一是获得实现以下服务组件体系结构(Service Component Architecture,SCA)规范的 C++ 运行时(有关更多信息,请参见参考资料):

  • SCA 组装模型 (SCA Assembly Model)
  • SCA C++ 客户机和实现 (SCA C++ Client and Implementation)

本文描述 Python 及 Ruby 服务组件的开发与部署工作,并说明了如何使用 Apache Tuscany C++ 运行时(基于 Milestone 2 版本)将服务组件作为 Web 服务公开。




引言

Tuscany C++ 服务组件体系结构(Service Component Architecture,SCA)运行时允许您使用标准 C++、Python 或 Ruby 代码构建 SCA 组件。可以随后将其部署到 SCA 运行时能够查找和加载的位置。可以将这些组件与使用不同语言编写的其他组件连接到一起、重用、替换,或者作为 Apache Axis Web 服务公开。

您可以使用 Python 创建简单的 SCA 组件。然后使用 Rudy 创建第二个组件,并将两个组件连接起来。之后可以将这些组件作为 Web 服务公开,并创建用于调用此服务的客户机(同样使用 SCA 组件)。

首先从 Tuscany 网站(请参见参考资料)下载 Tuscany C++ Milestone 2 版,并按照文档中的说明进行操作,使 PythonCalculator 和 RubyCalculator 示例正常工作。如果这些示例正常工作,则确保了您的 SCA、Python、Ruby 和 Axis2/C 安装有效,正确设置了 TUSCANY_SCACPP、TUSCANY_SDOCPP 和 AXIS2C_HOME 环境变量,而且启用了 Tuscany Python 和 Ruby 扩展。




从 Python 组件着手

从您可启用的简单 Python 组件着手,如 SCA 组件。下面的模块提供了一些有用的方法,用于发现 POP3 电子邮件服务器上可用邮件数量和逐个检索这些邮件的内容。


清单 1. Python 脚本 pop3access.py

                import poplib# Returns the number of messages on the POP3 serverdef getNumOfMessages():    mail = connect()    numOfMessages = mail.stat()[0]    mail.quit()    return numOfMessages# Returns a single message from the POP3 serverdef getMessageData(msgNum):    mail = connect()    data = "Message number " + str(msgNum) + "/n"    for line in mail.retr(msgNum)[1]:        data += str(line)        data += "/n"    mail.quit()    return data# Used by the 2 methods above to connect to the e-mail serverdef connect():    # Use poplib.POP3_SSL for POP3 servers that require security    mail = poplib.POP3("pop.mycompany.com")    mail.user("myusername")    mail.pass_("mypassword")    return mail      

那么,现在就有了提供一些有用功能的 Python 模块,但此模块很简单,除了编写 Python 脚本来使用其中的方法外,并不能使用其进行太多的工作。作为 SCA 组合中的 SCA 组件,它应该能够进行更多的工作。以下是将其转换为组件的步骤。

  1. 创建名为 emailsample 的目录,其中包括子目录 emailcomposite。
  2. 将 pop3access.py 脚本复制到 emailcomposite 目录中。
  3. 在 emailcomposite 目录中创建名为 email.composite 的 XML 文件,其中包含以下 XML:

    清单 2. email.composite SCA 组合文件
                            <?xml version="1.0" encoding="UTF-8"?><composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="email">    <component name="email.pop3access.component">        <implementation.python module="pop3access"/>    </component></composite>      
  4. 在 emailcomposite 目录中创建名为 pop3access.componentType 的 XML 文件,其中包含以下 XML:

    清单 3. pop3access.componentType SCA ComponentType 文件
                            <?xml version="1.0" encoding="UTF-8"?><componentType xmlns="http://www.osoa.org/xmlns/sca/1.0">    <service name="POP3AccessService">        <interface.python/>    </service></componentType>      

Python 脚本现在已作为 SCA 组件启用。email.composite 文件定义组件(稍后会看到,还包括引用和服务)及其实现。在此示例中,该组件采用 Python 实现,SCA 运行时可使用模块属性找到此实现。pop3access.componentType 文件告知 SCA 运行时该实现脚本提供哪些服务(稍后会看到,还包括引用和属性)。在此示例中,实现提供了名为 POP3AccessService 的服务。




测试新组件

现在让我们使用一个简单的 SCA 客户机(也是用 Python 编写的)来测试此组件。

首先,在 SCA 运行时中使用另一个组合文件启用您的组合。定义根组合文件,该文件指定在整个 SCA 系统中使用哪些组件,通常包含作为组合本身实现的组件。通过这样,可以将实际功能划分为能组装成完整系统的离散部件。在此示例中,我们将在 emailsample 目录中创建 email.solution.composite 文件,其中包含以下 XML:


清单 4. email.solution.composite SCA 组合文件

                <?xml version="1.0" encoding="UTF-8"?><composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="email.solution">    <component name="EmailComponent">        <implementation.composite name="email"/>    </component></composite>      

此文件将新创建的组合(其中包含 Python 组件)转换为客户机能够访问的组件。现在可以编写客户机来查找和调用 Python 组件的功能。在 email 目录中创建新的子目录 client,并在其中创建 Python 脚本 client.py。可以使用以下代码:


Listing 5. Python 脚本 client.py

                import sca# Locate the email serviceemailService = sca.locateservice("email.pop3access.component")print "You have", emailService.getNumOfMessages(), "messages available"print "First message:"print emailService.getMessageData(1)      

除了 locateservice 调用外,整个看起来像在直接使用 pop3access 模块一样。为了运行此客户机,现在请设置一些 Tuscany 环境变量,并随后运行脚本。对于 Windows®,打开命令提示符,并使用以下命令:


清单 6. 在 Windows 上运行客户机

                set TUSCANY_SCACPP_SYSTEM_ROOT=C:/path/to/emailsample/set TUSCANY_SCACPP_DEFAULT_COMPONENT=EmailComponentset PATH=%TUSCANY_SCACPP%/bin;%PATH%set PATH=%TUSCANY_SDOCPP%/bin;%PATH%set PATH=%TUSCANY_SCACPP%/extensions/python/bin;%PATH%set PYTHONPATH=%TUSCANY_SCACPP%/extensions/python/bincd C:/path/to/emailsample/clientpython client.py      

对于 Linux®,请使用以下命令:


清单 7. 在 Linux 上运行客户机

                export TUSCANY_SCACPP_SYSTEM_ROOT=/path/to/emailsampleexport TUSCANY_SCACPP_DEFAULT_COMPONENT=EmailComponentexport LD_LIBRARY_PATH=$TUSCANY_SCACPP/bin:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/python/bin:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=$TUSCANY_SDOCPP/bin:$LD_LIBRARY_PATHexport PYTHONPATH=$TUSCANY_SCACPP/extensions/python/bincd /path/to/emailsample/clientpython client.py      

这些环境变量设置 Tuscany 用于加载所有组合文件的根路径、设置缺省组件(在 email.solution.composite 文件中创建的链接到 Python 组合的组件)并确保路径是正确的。所得到的结果应该与以下所示类似:


清单 8. 客户机运行结果

                You have 8 messages availableFirst message:Message number 1X-Gmail-Received: 12345678905be7fdffc1ba5c3cea07Delivered-To: username@mycompany.comReceived: by 169.78.50.5 with SMTP id x5cs2436hux;        Fri, 5 May 2006 12:38:06 -0700 (PDT)Received: by 169.35.66.12 with SMTP id 1234asd;        Fri, 05 May 2006 12:38:05 -0700 (PDT)Return-Path: <myproject-dev-return-2512-username=mycompany.com@ws.mycompany.com>Received: from mail.mycompany.com (mail.mycompany.com [192.237.227.199])        by mx.mycompany.com with SMTP id f19si2206285pyf.2006.05.05.12.38.05;        Fri, 05 May 2006 12:38:05 -0700 (PDT)Received-SPF: pass (mycompany.com: domain of         myproject-dev-return-2512-username=mycompany.com@ws.mycompany.com designates         192.237.227.199 as permitted sender)Received: (qmail 51644 invoked by uid 500); 5 May 2006 19:38:04 -0000Mailing-List: contact myproject-dev-help@ws.mycompany.com; run by ezmlmPrecedence: bulkList-Help: <mailto:myproject-dev-help@ws.mycompany.com>List-Unsubscribe: <mailto:myproject-dev-unsubscribe@ws.mycompany.com>List-Post: <mailto:myproject-dev@ws.mycompany.com>List-Id: <myproject-dev.ws.mycompany.com>Reply-To: myproject-dev@ws.mycompany.comDelivered-To: mailing list myproject-dev@ws.mycompany.comReceived: (qmail 51634 invoked by uid 99); 5 May 2006 19:38:04 -0000Received: from dev.mycompany.com (HELO dev.mycompany.com) (1192.211.166.49)    by mycompany.com (qpsmtpd/0.29) with ESMTP; Fri, 05 May 2006 12:38:04 -0700X-ASF-Spam-Status: No, hits=0.0 required=10.0        tests=X-Spam-Check-By: mycompany.comReceived: from [192.237.227.198] (HELO mailserver.mycompany.com)     by mycompany.com (qpsmtpd/0.29) with ESMTP; Fri, 05 May 2006 12:38:03 -0700Received: from mailserver (localhost [127.0.0.1])        by mailserver.mycompany.com (Postfix) with ESMTP id C70F87142BB        for <myproject-dev@ws.mycompany.com>; Fri,  5 May 2006 19:37:27 +0000 (GMT)Message-ID: <123456789@mailserver>Date: Fri, 5 May 2006 19:37:27 +0000 (GMT+00:00)From: "Andy" <andy@ws.mycompany.com>To: myproject-dev@ws.mycompany.comSubject: Apache TuscanyIn-Reply-To: <1234.56789@mailserver>MIME-Version: 1.0Content-Type: text/plain; charset=utf-8Content-Transfer-Encoding: 7bitX-Virus-Checked: Checked by ClamAV on mycompany.comThe Apache Tuscany project could help in myproject - check it outat http://incubator.apache.org/tuscanyCheers!Andy      

对于一封简单的电子邮件而言,提供的信息太多了。很可能您对其中的大部分内容都不感兴趣。您可能只需看到“日期”、“主题”、“发件人”、“收件人”字段以及邮件内容就行了。那么,请继续阅读下面的内容。




连接 Ruby 组件

通过一个 Ruby 代码段可对一些数据应用简单的正则表达式,并返回结果。可以将此功能使用 Python 重新编码并将其添加到脚本中,但有了 Tuscany 我们就不需要这样做。

将此 Ruby 脚本(名为 emailregex.rb)放入 emailcomposite 目录中。


清单 9. Ruby 脚本 emailregex.rb

                # Gets the value of a named field from an e-maildef getEmailField(fieldName, data)    # Construct a regular expression to find the field    pattern = '^'+fieldName+': (.*?)$'    re = Regexp.new(pattern)    re =~ data    # If no data, return an empty string    if $1 == nil        return ''    end    return $1end# Gets the message data from an e-maildef getEmailMessage(data)    # Get the message via a regular expression    re = Regexp.new('$^$^(.*)', Regexp::MULTILINE)    re =~ data    # If no data, return an empty string    if $1 == nil        return ''    end    return $1end      

将 Ruby 脚本转换为 SCA 组件比处理 Python 代码简单得多。只需要在组合文件中定义 component 元素即可。Ruby 并不需要 componentType 文件。会基于 Rudy 脚本和组合文件自动检测组件提供的服务、引用和属性。(在下一个 Tuscany 版本中,Python 也将不需要 componentType 文件了。)

编辑 email.composite 文件,以包括新 Ruby 组件。另外,在 Python 组件定义中添加一个 reference 元素,以将其连接到新组件。然后将 Python 中硬编码的 POP3 服务器用户名和密码变量替换为此处定义的 SCA 属性。以下是更新后的 XML:


清单 10. 更新后的 email.composite SCA 组合文件

                <?xml version="1.0" encoding="UTF-8"?><composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="email">    <component name="email.pop3access.component">        <implementation.python module="pop3access"/>        <reference name="regexService">email.regex.component</reference>        <property name="servername">pop.mycompany.com</property>        <property name="username">myusername</property>        <property name="password">mypassword</property>    </component>    <component name="email.regex.component">        <implementation.ruby script="emailregex.rb"/>    </component></composite>      

要让 Python 脚本调用 Ruby 组件并使用这些属性,请向 pop3access.py 脚本和 pop3access.componentType 文件添加一些代码。以下是更新后的脚本:


清单 11. 更新后的 pop3access.py Python 脚本

                import poplib# Returns the number of messages on the POP3 serverdef getNumOfMessages():    mail = connect()    numOfMessages = mail.stat()[0]    mail.quit()    return numOfMessages# Returns a single message from the POP3 serverdef getMessageData(msgNum):    mail = connect()    data = "Message number " + str(msgNum) + "/n"    for line in mail.retr(msgNum)[1]:        data += str(line)        data += "/n"    mail.quit()    # Use the regexService reference    toResult = regexService.getEmailField("To", data)    fromResult = regexService.getEmailField("From", data)    dateResult = regexService.getEmailField("Date", data)    subjectResult = regexService.getEmailField("Subject", data)    messageData = regexService.getEmailMessage(data)    # Construct the result    result =  "Date:    " + str(dateResult) +"/n"    result += "To:      " + str(toResult) +"/n"    result += "From:    " + str(fromResult) +"/n"    result += "Subject: " + str(subjectResult) +"/n"    result += str(messageData)    return result# Used by the 2 methods above to connect to the e-mail serverdef connect():    # Use the servername, username and password SCA properties    mail = poplib.POP3(servername)    mail.user(username)    mail.pass_(password)    return mail      

以下是更新后的 componentType 文件:


清单 12. 更新后的 pop3access.componentType SCA ComponentType 文件

                <?xml version="1.0" encoding="UTF-8"?><componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"              xmlns:xsd="http://www.w3.org/2001/XMLSchema">    <service name="POP3AccessService">        <interface.python/>    </service>    <reference name="regexService">        <interface.python/>    </reference>    <property name="servername" type="xsd:string"/>    <property name="username" type="xsd:string"/>    <property name="password" type="xsd:string"/></componentType>      

只需要进行一些相当简单的更改,就可以让 Python 脚本调用 Ruby 脚本,而且看起来与调用另一个 Python 模块的普通调用没有什么区别。regexService 引用和 servername、username 及 password 属性似乎是没有实例化的变量,将会导致脚本无法成功执行,但请不要担心:将不会出现这样的问题。Tuscany 运行时将在组合中对其实例化并赋值。

使用上面给出的相同命令再次运行客户机(不进行任何更改)。唯一需要进行的更改是将 Tuscany Ruby 扩展添加到路径上:


清单 13. 在 Windows 上运行客户机

                ...set PATH=%TUSCANY_SCACPP%/extensions/ruby/bin;%PATH%...python client.py      

现在应该看到与以下所示类似的输出:


清单 14. 客户机运行结果

                You have 8 messages availableFirst message:Date:    Fri, 5 May 2006 19:37:27 +0000 (GMT+00:00)To:      myproject-dev@ws.mycompany.comFrom:    "Andy" <andy@ws.mycompany.com>Subject: Apache TuscanyThe Apache Tuscany project could help in myproject - check it outat http://incubator.apache.org/tuscanyCheers!Andy      

这样好多了!




将组合作为 Web 服务公开

现在我们已经有了一些提供有用服务的 SCA 组件。接下来,我们要通过将该服务作为 Web 服务公开,从而向本地计算机之外的位置提供。Tuscany 使用 Apache Axis2/C(请参见参考资料)提供其 Web 服务功能。在此示例中,我们将使用 Axis 简易 HTTP 服务器承载服务。

如果运行了 PythonCalculator 和 RubyCalculator 示例(如前所述),应该已经看到了这两个示例在 Axis2C 下作为 Web 服务公开和调用的情况。这意味着已经设置了 AXIS2C_HOME 环境变量,并通过将 Tuscany Web 服务扩展部署到 Axis 启用了 Axis2C 来运行 Tuscany SCA 服务。

您需要对示例 SCA 组合进行一点小小的改动:只需要对 email.composite SCA 组合文件进行一处更新,如清单 15 中所示。


清单 15. 更新后的 email.composite SCA 组合文件

                <?xml version="1.0" encoding="UTF-8"?><composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="email">         <service name="EmailWebService">        <binding.ws/>        <reference>email.pop3access.component</reference>    </service>    <component name="email.pop3access.component">        <implementation.python module="pop3access"/>        <reference name="regexService">email.regex.component</reference>        <property name="servername">pop.mycompany.com</property>        <property name="username">myusername</property>        <property name="password">mypassword</property>    </component>    <component name="email.regex.component">        <implementation.ruby script="emailregex.rb"/>    </component></composite>      

通过将 service 元素添加到组合中,并指定其使用 Web 服务绑定 (binding.ws),可让组合通过 Web 服务接口公开服务,与在 componentType 文件中添加 service 元素来将组件向其他组件公开时类似。

现在可以在 Windows 上使用以下命令启动 Axis2C 简易 HTTP 服务器:


清单 16. 在 Windows 上启动 Axis2C 简易 HTTP 服务器

                set TUSCANY_SCACPP_SYSTEM_ROOT=C:/path/to/emailsample/set TUSCANY_SCACPP_DEFAULT_COMPONENT=EmailComponentset PATH=%TUSCANY_SCACPP%/bin;%PATH%set PATH=%TUSCANY_SDOCPP%/bin;%PATH%set PATH=%TUSCANY_SCACPP%/extensions/python/bin;%PATH%set PATH=%TUSCANY_SCACPP%/extensions/ruby/bin;%PATH%set PATH=%AXIS2C_HOME%/lib;%PATH%set PYTHONPATH=%TUSCANY_SCACPP%/extensions/python/bincd %AXIS2C_HOME%/bin./axis2_http_server.exe      

对于 Linux,请使用以下命令:


清单 17. 在 Linux 上启动 Axis2C 简易 HTTP 服务器

                export TUSCANY_SCACPP_SYSTEM_ROOT=/path/to/emailsampleexport TUSCANY_SCACPP_DEFAULT_COMPONENT=EmailComponentexport LD_LIBRARY_PATH=$TUSCANY_SCACPP/bin:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=$TUSCANY_SDOCPP/bin:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/python/bin:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/python/bin:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=$AXIS2C_HOME/lib:$LD_LIBRARY_PATHexport PYTHONPATH=$TUSCANY_SCACPP/extensions/python/bincd $AXIS2C_HOME/bin./axis2_http_server      

此处设置的环境变量与前面运行本地客户机时所需的变量几乎一样。只需要另外把 Axis2C 库添加到路径上即可。

现在已经让 Axis 将您的 SCA 组合作为 Web 服务提供了。您需要一个 Web 服务客户机来调用它。可以使用 Axis API 编写客户机(使用 Java™ 或 C),还可以使用其他 Web 服务库,如 php_soap for PHP 或 SOAPpy for Python。另外还可以直接使用 SCA 调用 Web 服务。

首先,创建能够在客户机计算机上运行的另一个 SCA 组件。通过在 emailsample 目录中创建名为 wsclient 的新子目录,并在其中创建包含以下 XML 的 wsclient.composite 文件,即可完成此任务:


清单 18. wsclient.composite SCA 组合文件

                <?xml version="1.0" encoding="UTF-8"?><composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="wsclient">     <reference name="EmailService">        <binding.ws uri="http://localhost:9090/axis2/services/EmailWebService"/>    </reference></composite>      

其中仅包含一个 reference 元素,使用指定的地址连接到作为 Axis2C Web 服务公开的服务。如果在不同的计算机或端口上运行服务,请确保对此地址进行相应的更改。

现在,编写另一个根组合 文件来允许本地客户机访问引用,并编写客户机代码本身。这次我们将编写并运行 Ruby 客户机。将以下 wsclient.solution.composite XML 放入 wsclient 目录中:


清单 19. wsclient.solution.composite SCA 组合文件

                <?xml version="1.0" encoding="UTF-8"?><composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="wsclient.solution">    <component name="WSClientComponent">        <implementation.composite name="wsclient"/>    </component></composite>      

清单 20 显示了 Ruby 客户机代码。同样,请将此文件放入您的 wsclient 目录中。


清单 20. Ruby 脚本 WSClient.rb

                require("tuscany_sca_ruby")emailService = SCA::locateService("EmailService")puts "You have " << (emailService.getNumOfMessages()).to_s << " messages available"puts "First message:"puts emailService.getMessageData(1)      

您可能注意到,此代码几乎与前面编写的 Python 客户机完全一样。的确如此:实际上您可以使用前面的那个客户机(需要将 sca.locateservice 方法中的名称从 email.pop3access.component 修改为 EmailService)。不过我们也可以调用 Ruby 客户机。同样,在运行此脚本前需要设置一些环境变量。以下是 Windows 上相应的命令:


清单 21. 在 Windows 上运行 Web 服务客户机

                set TUSCANY_SCACPP_SYSTEM_ROOT=C:/path/to/emailsample/wsclientset TUSCANY_SCACPP_DEFAULT_COMPONENT=WSClientComponentset PATH=%TUSCANY_SCACPP%/bin;%PATH%set PATH=%TUSCANY_SDOCPP%/bin;%PATH%set PATH=%AXIS2C_HOME%/lib;%PATH%cd C:/path/to/emailsample/wsclientruby -I%TUSCANY_SCACPP%/extensions/ruby/bin WSClient.rb      

以下是 Linux 相应的命令:


清单 22. 在 Linux 上运行 Web 服务客户机

                export TUSCANY_SCACPP_SYSTEM_ROOT=/path/to/emailsample/wsclientexport TUSCANY_SCACPP_DEFAULT_COMPONENT=WSClientComponentexport LD_LIBRARY_PATH=$TUSCANY_SCACPP/bin:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=$TUSCANY_SDOCPP/bin:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=$AXIS2C_HOME/lib:$LD_LIBRARY_PATHcd /path/to/emailsample/wsclientruby -I$TUSCANY_SCACPP/extensions/ruby/bin WSClient.rb      

此处设置的环境变量告知 Tuscany 运行时使用 wsclient.solution.composite 和所链接的 wsclient.composite。运行此客户机将调用在 Axis2C 服务器上运行的 Web 服务。将看到返回与以下所示类似的结果:


清单 23. Web 服务客户机运行结果

                You have 8 messages availableFirst message:Date:    Fri, 5 May 2006 19:37:27 +0000 (GMT+00:00)To:      myproject-dev@ws.mycompany.comFrom:    "Andy" <andy@ws.mycompany.com>Subject: Apache TuscanyThe Apache Tuscany project could help in myproject - check it outat http://incubator.apache.org/tuscanyCheers!Andy      




结束语

在本文中,我们将一些现有 Python 代码转换为 SCA 组件,并随后将其连接到第二个提供有用功能的组件(此组件使用 Ruby 实现)。然后,我们将此系统作为 Web 服务公开,并使用第二个 SCA 组合调用该服务。

本文让您初步感受了一下服务组件体系结构及 Apache Tuscany 实现的强大功能,该实现支持您使用自己的技能和现有代码来创建库重用、可组合的组件,这些组件在组合中连接在一起,可使用最适合所构建的系统的任意技术进行公开和调用。.

  

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文
  • 本系列教程的 RSS feed:获取有关本系列中即将推出的文章的通知。(查找有关 developerWorks 内容的 RSS feed 的更多信息)。
  • 请访问 Apache Axis2/C,以了解 Tuscany 的 Web 服务功能。
  • 访问 Tuscany 网站,向 Apache Tuscany 项目提供反馈、建议或帮助。
  • 请参阅 SCA 组装模型的相关信息。
  • 有关更多信息,请参见 SCA C++ Client and Implementation
  • 了解关于 developerWorks 技术事件和网络广播的最新消息。
  • IBM SOA 网站提供了 SOA 的概述,并说明 IBM 可以如何帮助您实现此目标。
  • 有关 SOA 的更多信息,请访问 developerWorks SOA and Web services 专区


获得产品和技术

  • Tuscany 网站下载 Tuscany C++ Milestone 2 版。


讨论

  • 访问 developerWorks Blog,从而加入到 developerWorks 社区中来。
  • SOA and Web services 讨论论坛中的架构师和开发人员社区协作。

 

关于作者

Andrew Borley photo

Andrew Borley 是英国 IBM Hursley 的一位 IT 专家。他曾担任过各种职务,包括开发人员、团队负责人和项目经理,在 IBM 就职的 7 年中,他曾接触过各种技术。从 2001 年起,他就开始与客户协作进行 Web 服务和网格项目,他目前负责开发 Apache Tuscany 开放源代码 SOA 项目中的 SCA for C++ 实现。