内容


通过缓存 Web 服务来提高 WebSphere Process Server 中业务解决方案的性能

Comments

先决条件

在本文中,您将使用 WebSphere Integration Developer 7.0 来构建样例 SCA 应用程序,我们假设您有 SCA、Java 编程、Web 服务、WSDL 接口和 SOAP/HTTP 请求方面的经验。我们也假设您具备基本的 WebSphere Process Server 管理技能。

简介

Web 服务是各类客户广泛使用的接口,用于调用 SCA 应用程序。但是 Web 服务 SOAP 调用具有很高的代价,服务器的负载加重,响应时间也增加了许多。如何提高 SOA 业务解决方案的性能?我们的答案是缓存 Web 服务调用结果,这样就可以减少您的 SCA 应用程序中实际处理的工作量。

Process Server 提供缓存功能的一个方法是通过一个调用动态缓存的服务。动态缓存或通常所称的 dynacache 能够缓存您的应用程序中不同对象的输出。

在本文中,您将了解如何缓存现有 Web 服务而不使用任何额外代码。您可以通过缓存配置文件管理您的 Web 服务缓存行为。本文将介绍使用缓存配置文件缓存 Web 服务调用的结果时需要了解的一些基本原理,以及如何定义缓存配置文件,如何将它用于您的应用程序模块。此外,您也将学习如何验证和监控缓存结果。

以下图片展示了 SOAP 请求使用动态缓存调用缓存 Web 服务的基本原理:

图 1. 调用缓存 Web 服务的基本原理
调用缓存 Web 服务的基本原理
调用缓存 Web 服务的基本原理

准备样例 SCA 应用程序

本小节我们将使用 WSDL 端口类型接口和 Java 实现来描述我们的样例 SCA。我们的样例是使用 WebSphere Integration Developer v7.0 开发和测试然后导入样例项目的:

  1. CacheWebServiceSample.zip(可在文章结尾处找到)下载到临时目录。
  2. 在 Integration Developer 中,选择菜单 File > Import 来打开 Import 向导,在 Select 对话框中,展开 Other 并选择 Project Exchange,然后单击 Next
  3. 出现导入项目页面。单击 Browse 来选择 zip 文件。
  4. 浏览到临时目录,并选择您在第 1 步下载的 zip 文件。(图 2)
图 2. 导入 Project Interchange Contents Wizard
导入 Project Interchange Contents Wizard
导入 Project Interchange Contents Wizard
  1. 单击 Select All
  2. 单击 Finish

审查业务对象和服务接口

有两个简单的业务对象,ProductProducts,如图 3 所示。

图 3. 业务对象
业务对象
业务对象

有一个名为 ProjectService 的服务接口,围绕两个业务对象有 3 个服务操作,如图 4 所示:

图 4. 服务接口
服务接口
服务接口

上述服务的 3 个操作的含义是:

  1. addProduct:供用户添加新产品
  2. getProductsByCategory:寻找指定类名的所有产品
  3. getAllProducts:寻找所有现有产品

审查服务实现

在样例服务实现中,我们要确保,每个函数所需的执行时间最少是一秒,而且在执行的同时打印出一些消息。

清单 1 显示了 getProductsByCategory 的样例实现,它首先打印一条消息来指出函数已被执行,然后在 productDAO 的模拟实现中,找出该类别的产品然后等待 1 秒钟返回结果。

清单 1. getProductsByCategory 的样例实现
/**
 * Method generated to support implementation of operation 
 * "getProductsByCategory" defined for WSDL port type
 * named "ProductService".
 *
 * The presence of commonj.sdo.DataObject as the return type and/or as a parameter
 * type conveys that it is a complex type. Please refer to the 
 * WSDL Definition for more information
 * on the type of input, output and fault(s).
 */
public DataObject getProductsByCategory(String categoryName) {
    System.out.println("Enter into the body of getProductsByCategory, by category name 
                                            ["+categoryName+"]");
    return productDAO.getProductsByCategoryName(categoryName);
}

/**
 * Gets the products by the category name
 * @param name, the categroy name
 * @return the products data object
 */
public DataObject getProductsByCategoryName(String name){
        List<DataObject> resultProducts = new ArrayList<DataObject>(2);
        for(DataObject p : this.allProducts){
                String categroyName = p.getString("category");
                if(name.equalsIgnoreCase(categroyName)){
                        resultProducts.add(p);
                }
        }
        DataObject result = this.newProducts();
        result.setList("product", resultProducts);
        waitOneMinute();
        return result;
}
</DataObject>

使用 Integration Test Client 测试样例应用程序

要测试样例应用程序:

  1. 在 Integration Developer 的 Business Integration 视图中,右键单击项目,从弹出菜单中选择 Test > Test Module
  2. 出现 Integration Test Client 页面。在右边面板展开 Details Properties;选择您想要测试的组件、服务接口和相应的操作。这里,我们选择了 ProductComponentProductServicegetProductByCategory 作为一个示例进行测试。(图 5)
  3. 如果操作需要一些输入消息,您需要在面板右下角的 Initial request parameters 中输入这些信息。(图 5)
图 5. 样例应用程序的 Integration Test Client
样例应用程序的 Integration Test Client
样例应用程序的 Integration Test Client
  1. 当服务配置和参数都准备好时,单击工具栏左边的 Invoke 图标,开始运行。(图 5)
  2. 出现 Deployment Location 对话框,选择 Process Server 运行时,然后单击 Finish
  3. Process Server 启动,模块将被部署。
  4. 几分钟后,您就可以在第 2 步中打开的 Integration Test Client 中查看结果了。(图 6)
图 6. 查看测试结果
查看测试结果
查看测试结果

在流程服务器中启用动态缓存服务

要启用 Web 服务的动态缓存服务,您应该在服务器启动时启用 servlet 缓存:

  1. 在您的浏览器中打开 Process Server 的管理控制台。
  2. 导航到 Servers > WebSphere application servers > server_name > Web Container Settings > Web container,您将看到类似图 7 的配置页面:
图 7. Servlet 缓存配置页面
Servlet 缓存配置页面
Servlet 缓存配置页面
  1. 确保 Enable servlet caching 选项被选中。
  2. 单击 Ok
  3. 保存更改并重启服务器。

Process Server 为用户提供一个名为 Dynamic Cache Monitor 的应用程序来查看和管理缓存条目:默认情况下,没有安装此应用程序,可根据以下步骤安装和使用它。

  1. 在管理控制台,导航到 Applications > New Application,单击 New Enterprise Application
  2. 单击 Browse 来在服务器的可安装应用程序路径(<WPS_HOME>/ installableApps/ CacheMonitor.ear)下找到应用程序的 ear 文件。
  3. 按照向导进行正确安装。
  4. 安装完成后,您可以通过导航到 Applications < WebSphere enterprise applications(您可以从这启动它)来查看应用程序。
  5. 要为每个人授予应用程序访问权限,导航到 Applications > WebSphere enterprise applications > Dynamic Cache Monitor > Security role to user/group mapping;在该页,选择角色管理员复选框,然后从 Map Special Subjects 菜单选择 Everyone。(图 8)
图 8. 映射到用户/组的安全角色
映射到用户/组的安全角色
映射到用户/组的安全角色
  1. 单击 Ok
  2. 启动 Dynamic Cache Monitor 应用程序。(图 9)
图 9. 启动动态缓存监控器应用程序
启动动态缓存监控器应用程序
启动动态缓存监控器应用程序
  1. 在您的浏览器中,您可以打开图 10 所示的动态缓存监控器的 web 页面:
图 10. 动态缓存监控器的 web 页面
动态缓存监控器的 web 页面
动态缓存监控器的 web 页面

启用动态缓存服务并安装动态缓存监控器应用程序之后,即可使用您的应用程序了。

使用缓存配置文件的两种方法

缓存规范和无效策略通过 cachespec.xml 文件提供。这个文件是非常强大的,它可以为某些类型的动态内容定义缓存,比如 servlet/JSP 片段、Web 服务等等。在本文中,我们将演示如何使用它缓存 Web 服务。该类型的缓存将保存 Web 服务 SOAP 调用的结果。

您可以在应用程序服务器的属性目录中保存一个全局 cachespec.xml,或者使用部署模块放置缓存配置文件。

清单 2. Web 服务调用的样例全局 cachespec.xml 文件
<?xml version="1.0" ?>
<cache>
  <cache-entry>
      <class>webservice</class>
      <name>/CacheWebServiceSampleWeb/sca/ProductServiceExport2</name>
      <sharing-policy>not-shared</sharing-policy>
      <cache-id>
    		<component id="21" type="serviceOperation">
    	<value>http://CacheWebServiceSample/ProductService:getProductsByCategory</value>
    		</component>
    		<component id="Hash" type="SOAPEnvelope"/>
    	    <timeout>180</timeout>
    	    <priority>1</priority>
      </cache-id>   	    	    				        
      <cache-id>
            <component id="23" type="serviceOperation">
                 <value>http://CacheWebServiceSample/
                        ProductService:getAllProducts</value>
            </component>
            <component id="Hash" type="SOAPEnvelope"/>
            <timeout>180</timeout>
            <priority>1</priority>
      </cache-id>
  </cache-entry>  
</cache>

清单 2 显示一个样例全局 cachespec.xml 文件以及 Web 服务调用的一个缓存条目。class 元素指出条目的类型是 Web 服务调用;name 元素的值是 Web 服务的 URI 路径;元素 cache-id 定义了缓存条目的标识符,在这里,id 的值是服务操作和 SOAP 信封的一个散列值的组合;timeout 元素显示缓存条目将保存 180 秒。

您可以从 Web 服务绑定文件中找到 name 元素的值,如图 11 所示:

图 11. Web 服务的 URI 路径
Web 服务的 URI 路径
Web 服务的 URI 路径

服务操作组件的值是服务接口名称空间和操作名的一个组合,如图 12 所示:

图 12. 服务操作
服务操作
服务操作
清单 3. Web 服务调用的样例全局 cachespec.xml 文件
<?xml version="1.0" ?<
<cache>
  <cache-entry>
      <class>webservice</class>
      <name>/sca/ProductServiceExport2</name>
      <sharing-policy>not-shared</sharing-policy>
      <cache-id>
    		<component id="21" type="serviceOperation">
    	<value>http://CacheWebServiceSample/ProductService:getProductsByCategory</value>
    		</component>
    		<component id="Hash" type="SOAPEnvelope"/>
    	    <timeout>180</timeout>
    	    <priority>1</priority>
      </cache-id>   	    	    				        
      <cache-id>
            <component id="23" type="serviceOperation">
                 <value>http://CacheWebServiceSample/ProductService:getAllProducts</value>
            </component>
            <component id="Hash" type="SOAPEnvelope"/>
            <timeout>180</timeout>
            <priority>1</priority>
      </cache-id>
  </cache-entry>
</cache>

清单 3 展示了一个样例模块级 cachespec.xml 文件以及 Web 服务调用的一个缓存条目,同前面清单 2 中的样例配置文件相比较,二者的惟一区别是 name 元素的值:如果配置文件使用模块予以部署,Web 服务的 URI 路径应该是相对路径而不是完整路径。

例如,产品服务的完整路径是 “/CacheWebServiceSampleWeb/sca/ProductServiceExport2”,相对路径是 “/sca/ProductServiceExport2”

要使用全局方法来启用 Web 服务调用的缓存配置文件:

  1. 导航到您的 Process Servers properties 文件夹,通常像这样:<WPS_ROOT>/profiles/<profile_name>/properties/
  2. 复制样例全局缓存配置文件(清单 2),确保文件名是 cachespec.xml
  3. 重启 Process Server。

要将 cachespec.xml 文件和应用程序模块一起部署:

  1. 在 Integration Developer 中,切换到 Business Integration 视图,选择菜单 Project > Business Integration Projects > Update Deploy Code
  2. 切换到 Java EE 视图,Integration Developer 将自动为业务集成应用程序生成一个 web 模块,web 模块名称将附加 “Web”,在这里是 CacheWebServiceSampleWeb。(图 13)
图 13. 业务集成应用程序的 Web 模块
业务集成应用程序的 Web 模块
业务集成应用程序的 Web 模块
  1. 将样例模块级缓存配置文件(清单 3)复制到文件夹 <Web_module>/WebContent/WEB-INF。(图 13)
  2. 将业务集成应用程序 CacheWebServiceSample 重新部署到 Process Server。

您可以通过上述方法其中一种来为您的业务集成应用程序启用缓存策略。推荐方法是为每个应用程序模块定义缓存规范,然后您可以重新部署带有最新 cachespec.xml 文件的应用程序,无需重启 Process Server 即可实现。

使用 SoapUI 测试缓存 Web 服务

假设您已经将 cachespec.xml 文件和样例应用程序部署到 Process Server 了。在本小节,您将证实 Web 服务缓存行为实现了预期功能效果。

SoapUI 是一个易于操作的工具,用于测试 Web 服务;您可以从 SoapUI website 下载并使用它。

要测试样例缓存 Web 服务,请遵循下列步骤:

  1. 按照 SoapUI 网站 上的说明下载并安装 SoapUI 工具。
  2. 启动 SoapUI,并选择菜单 File > New soapUI Project,向导启动,输入 CacheSample 作为项目名,然后单击 Browse 定位 WSDL,在本文中,文件是: CacheWebServiceSample/CacheWebServiceSample_ProductServiceExport2.wsdl(图 14)。
图 14. 新 soapUI 项目
新 soapUI 项目
新 soapUI 项目
  1. 单击 OK,工具为每个服务操作创建样例请求。
  2. 在左面板展开 getProductsByCategory,双击 Request 1,您将看到可以作为一个测试发送的预构建 SOAP 请求。(图 15)
  3. 在请求信封的 <categoryName> 节点输入文本 book
  4. 在工具栏中单击绿箭头按钮,正好在 SOAP 请求文本的上方,将请求发送到服务并在右边面板显示得到的 SOAP 响应。(图 15)
图 15. 第一次调用 — 来自服务器的响应
第一次调用 — 来自服务器的响应
第一次调用 — 来自服务器的响应
  1. 在面板底部,您可以看到响应时间大约是 2368 毫秒。在 Integration Developer 的 Console 视图中,您可以看到服务执行打印出一条消息。(图 16)
图 16. 首次服务调用后的服务器日志
首次服务调用后的服务器日志
首次服务调用后的服务器日志
  1. 重复第 6 步再一次调用服务,您可以发现响应时间减少了很多(仅仅 16 毫秒),在 Integration Developer 的 Console 视图中看不到打印出任何消息。这意味着这次 SOAP 请求的结果是来自缓存。(图 17)
图 17. 第二次调用 – 来自缓存的响应
第二次调用 – 来自缓存的响应
第二次调用 – 来自缓存的响应

在请求信封的 <categoryName> 节点输入文本 pen,第 3 次发送请求,但是使用不同的类名。在 Integration Developer 的 Console 视图中,打印出另一个消息指出服务被执行,如图 18 所示,图 19 显示的是这次 SOAP 调用后的 SoapUI 请求结果。

图 18. 第 3 次服务调用后的服务器日志
第 3 次服务调用后的服务器日志
第 3 次服务调用后的服务器日志
图 19. 第 3 次调用 – 来自服务的响应
第 3 次调用 – 来自服务的响应
第 3 次调用 – 来自服务的响应

这一节描述了如何使用 SoapUI 工具测试缓存 Web 服务;类似地,您可以测试所有服务操作来验证它。

监控 Web 服务结果缓存

在前面的 “在流程服务器中启用动态缓存服务” 部分中,您在安装 Process Server 时附带安装了 Dynamic Cache Monitor 应用程序。

要使用它,执行以下步骤:

  1. 从您的浏览器中打开监控器页面,URL 类似于 http://locahost:9080/cachemonitor/,默认显示 Cache Statistics 页面(图 20),在顶部有一个 Clear Cache 按钮,可以用来手动清理缓存。
图 20. 缓存统计页面
缓存统计页面
缓存统计页面
  1. 要检查是否有缓存策略文件,在左边导航栏单击 Cache Policies 链接,您将看到,这里有一个带 Web 服务类型的策略模板(图 21)
图 21. 缓存策略页面
缓存策略页面
缓存策略页面
  1. 要查看缓存的内容,从此页面左边导航栏单击 Cache Contents 链接,您将看到目前有两个缓存项,为每个缓存项缓存它(图 22)
图 22. 缓存内容页面
缓存内容页面
缓存内容页面

结束语

Web 服务在 SOA 业务解决方案中得到广泛使用,但是 Web 服务 SOA 调用可能代价很高。本文从一个含有 Web 服务输出的样例 SCA 应用程序开始,讨论如何定义一组缓存策略以及如何在 Web 服务应用程序中使用它。根据我们使用 SoapUI 的测试结果,很显然,Web 服务调用的性能有了极大的提高。此外,本文也介绍了如何监控缓存条目。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and web services
ArticleID=646278
ArticleTitle=通过缓存 Web 服务来提高 WebSphere Process Server 中业务解决方案的性能
publish-date=04112011