APP下载

基于CXF的SOA应用设计与实现

2017-10-21张同杨

价值工程 2017年32期
关键词:系统集成

张同杨

摘要:本文针对异构系统集成中数据共享问题,通过剖析Apache CXF开源框架体系结构及其组件构成,分析CXF框架及SOA同类框架在不同条件下的性能对比,结合集团级业务信息系统整合特点,给出基于CXF框架构建SOA的方法。理论分析与系统测试都表明Apache CXF在集团级异构信息系统集成方面具有明显优势。

Abstract: Aiming at the problem of data sharing between heterogeneous systems, by analyzing the open source framework architecture of Apache CXF and its components, this paper analyzes the performance comparison between the CXF framework and the other SOA framework under different conditions. Combined with the practice of group business information system integration, this paper gives the method of building SOA application based on CXF framework. Both theoretical analysis and system test show that Apache CXF has the obvious advantages in the integration of heterogeneous information systems.

关键词:面向服务架构;CXF;系统集成;SOA

Key words: service-oriented architecture;CXF;system integration;SOA

中图分类号:TP399 文献标识码:A 文章编号:1006-4311(2017)32-0083-05

1 SOA

集团级业务系统数据一般涉及总部、区域公司、二级单位、基层单位业务数据,以及诸如身份认证系统、人力资源系统、邮件系统、设备信息系统等其他集团级业务数据,业务数据范围广泛、种类繁多。集团级业务系统持续集成所属单位业务系统、其他集团级业务系统的实时数据,丰富和完善集团级业务系统数据、提高数据质量、降低数据导入导出复杂度、减少人工介入整理数据的工作量,在业务运营实践中具有重要的现实意义。

然而,基于功能或过程的企业架构一般是不同平台、不同开发工具、不同管理规范、不同需求、不同时期研发的多阶段交错复杂业务系统,体系结构、平台技术类型差异较大。这种差异和复杂严重影响了企业业务系统的敏捷性和稳定性,从而影响到企业领导者的业务决策和企业核心能力的发挥。面对瞬息万变的市场需求,企业需要具有快速反应、敏捷生存的能力,从而要求企业管理业务系统必须具有敏捷服务、快速重构、资源重用及自由扩充等特点。

1.1 SOA设计理念

SOA设计理念以“支持异质、分散和容错”保持系统灵活性,以编排松散耦合软件服务发布业务逻辑。在企业应用集成领域中,SOA理念复用企业现有应用,保护企业既有信息投资,对企业中的业务流程进行灵活重构与优化,以服务方式构建业务流程和服务对象,增强业务的适应性和敏捷性。

1.2 SOA设计原则

SOA设计保持灵活性和松散耦合,设计原则主要是一致性原则,SOA架构应采用所有参与者都一致理解的方式整合内容,统一管理,以减少开发、集成及维护工作;服务粒度封装适中原则,即应有利于可用性、可维护性、可操作性、可拓展性及易用性,统筹适度封装操作数量;自治原则,所有服务自我管理,独立部署、版本控制及管理,单一更改不影响整个系统;高内聚原则,一个服务基于一个主题进行合并和组装;松耦合原则,服务之间透明访问,一服务改变不影响其他服务;服务调用原则,平台技术中立,支持多种可传输协议和数据格式。

1.3 SOA协议栈

SOA架构通过统一不同厂家和用户的技术标准共识,构建协作规范以屏蔽差异。目前SOA技术标准分3类:元数据标准、基础通信标准和信息交互标准,从角色功能上划分为传输层、消息层、描述层、管理层、服务组合层和表示层等6层,如图1所示为SOA协议栈层次结构。

2 Apache CXF基础架构及组件

ApacheCXF框架是由ObjectWeb Celti和CodeHaus XFire合并成立。ObjectWeb Celtix是开源Java ESB框架,XFire则是SOAP堆栈。ApacheCXF融合ObjectWeb Celtix和CodeHaus XFire两个开源框架的功能,提供实现SOA所需要的核心ESB功能,包括SOA服务创建,服务路由,及QoS功能。CXF支持JAX-WS标准,提供对多种 Binding、DataBinding、Transport 以及各种 Format 的支持。CXF可以根据实际需要,采用代码优先(Code First)或 WSDL 优先(WSDL First)發布和使用Web Services。Apache CXF支持SOAP、XML/HTTP、RESTful HTTP或CORBA等协议,简化Service创建,易于和Spring无缝集成、易于异构信息系统的持续集成,并提供数据安全传输机制。

2.1 Apache CXF体系结构

CXF框架不为各组件创建和维护单独的信道,而是使每个组件逻辑上与总线相连,以使所有组件相互连接起来。Bus组件是CXF框架的核心组件,为共享资源提供了一个可配置的场所。CXF框架使用Spring依赖注入、以总线方式串接Messaging组件、Interceptors组件、Transport组件、Data Binding组件、Frontend组件、Service Model组件、Binding组件和WS-Support组件,以使得各个组件相互通讯。endprint

在具体实现中,抽象类AbstractBasicInterceptor Provider实现InterceptorProvider接口,CXFBusImpl继承AbstractBasicInterptorProvider类。ExtensionManagerBus类继承CXFBusImpl类以实现Bus拓展性。所有对CXF的Data Bindings、Binding、Transport等功能的引用最终转化为Bus组件的方法和内容。图3示出了BUS组件的实现类结构图。

通过对Bus进行扩展,可以方便地容纳自己的资源,或替换现有的资源。Bus默认以Spring依赖注入,串接运行态各组件。Bus默认由SpringBusFactory实现,在构造过程中,SpringBusFactory搜索META-INF/cxf(就包含在 CXF的Jar中)下的所有Bean配置文件,构建单独ApplicationContext。

2.2 消息组件和拦截器

消息组件、拦截器组件和相位组件共同构成CXF框架消息层。Apache CXF的Messaging、Phase和Interceptors类结构如图4所示。Messaging 接口是CXF传递信息的基础,所有操作最终都转化成对一定格式消息的操作。图4示出了CXF中消息层各组件实现类结构图。

CXF以消息处理为中心,建立在一个由消息、拦截器和拦截器链(Interceptpr Chain)组成的通用消息层之上。CXF通过Interceptors对消息进行处理,实现诸如消息压缩、SOAP消息处理等主要功能。拦截器的通用方法主要有handleMessage和handleFault,分别对应消息处理和错误处理。一般在消息传递及处理的过程中,通过拦截器对CXF进行安全认证等功能拓展。图5示出的代理模式,将在生成目标对象前创建一个具有与原初目标对象相同接口方法的代理,并在真实方法生效前,在代理的方法中添加定制特性方法实现细节业务逻辑。

CXF框架组合多个拦截器形成拦截器链,其中InterceptorChain用于实现增减Interceptor、控制消息处理及处置异常消息功能。图6及图7示出Apache CXF拦截器客户端实现过程和Apache CXF拦截器服务端实现基本过程。

2.3 前端编程模型

前端组件(Front-Ends)为CXF框架提供了创建服务的编程模型。CXF服务器端基于JAX-WS和JAX-RS规范的Frontend组件与客户端交互。在实现上,JAX-WS和JAX-RS提供FactoryBean部件依赖于Frontend组件的FactoryBean类,而FactoryBean类由依赖于由Client、Endpoint及Server接口实现的Endpoint组件,该组件通过Interceptor接口、Fault接口和Interceptorchain接口依赖于Interceptors组件。图8示出了CXF前端应用类结构,ServerFactoryBean类作用于服务器端点,AbstractServiceFactory类应用于简化前端模式的实现,而ClientFactoryBean类和ClientProxyFactoryBean类都基于ClientFactoryBean类。(图8)

2.4 Service模型

CXF框架中的服务通过服务模型来表示。它主要有两部分:ServiceInfo和服务本身。ServiceInfo作用类似WSDL,包含接口信息、绑定、端点(EndPoint)等信息;服务则包含了ServiceInfo、数据绑定、拦截器和服务属性等信息。可使用Java类和WSDL来创建服务。一般是由前端ServiceFactory完成服务的创建。

在具体实现上,动态客户端应用中Service组件包括Service、ServiceBuilder和ServiceImpl三个接口实现factory、invoker和model组件。其中model核心接口是ServiceInfo根组件,分别由InterfaceInfo组件、BindingInfo组件和EndpointInfo组件继承。

2.5 数据绑定、绑定及传输协议组件

绑定提供了在传输之上映射具体格式和协议的方法,主要的两个类是Binding和BindingFactory。BindingFactory负责创建Binding。

Data Bindings以生成XML schema的方式实现XML和Java之间的映射,数据绑定组件由Data Bindings主接口和Aegis组件、JAXB组件、XMLBeans组件及MTOM组件构成。绑定组件由Bindings接口(Binding、BindFactory、BindFactoryManager)和coloc、CORBA、http、object、SOAP和XML六个实现组件构成。

为了对绑定和前端屏蔽传输细节,CXF框架通过注册MessageObserver获得通知的方式,提供用于消息发送的Conduit传输对象和Destination消息接收對象。在具体实现上,CXF传输组件由Transport接口(Conduits对象和Destiations对象)和8个基础业务实现组件(http、http_jetty、http_osgi、https、https_jetty、jms、servlet和loca Transport组件)构成。

3 异构系统集成体系结构

在设计实现中,基于SOA设计理念定义的规范和标准,无须了解交互方系统内部实现细节,屏蔽Windows、Linux及Android等不同平台下的Java、.NET、C/C++、C#各类语言的差异,业务系统CXF框架作为对外界业务系统交互的SOA引擎,通过webservice的方式对基于XML规范的WSDL文件操作,实现异构系统数据共享。图9指出了集团级业务系统基于CXF框架集成异构业务系统的基本结构。endprint

服务器端调用方法把XML格式的SOAP请求/响应消息转换成Java目标方法调用,客户端调用方法把对SEI代理的方法调用转换成XML格式的SOAP请求和响应,SOAP消息处理结构如图10所示,SOAP消息的序列化与反序列化。

基于CXF基础框架构建SOA应用,实现上述序列化与反序列化过程,一般采用以下基本步骤:

①导入%CXF_HOME%\ lib下jar包配置基础编译环境。

②编写服务接口基类。

package com.cnpc.server;

import java.util.List;

import javax.jws.WebParam;

import javax.jws.WebService;

import com.cnpc.pojo.User;

@WebService

public interface HelloWorld {

String sayHi(@WebParam(name="text")String text);

String sayHiToUser(User user);

String[] SayHiToUserList(List userList);

}

③編写服务接口的实现类

package com.cnpc.server;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

import javax.jws.WebParam;

import javax.jws.WebService;

import com.cnpc.pojo.User;

@WebService(

endpointInterface="com.CNPC.server.HelloWorld",

serviceName="HelloWorld")

public class HelloWorldImpl implements HelloWorld {

Map users =

new LinkedHashMap();

public String sayHi(@WebParam(name = "text") String text) {

return "Hello,"+text;

}

public String sayHiToUser(User user) {

users.put(users.size()+1, user);

return "Hello,"+user.getName();

}

public String[] SayHiToUserList(List userList) {

String[] result = new String[userList.size()];

int i = 0;

for(User u:userList){

result[i] = "Hello " + u.getName();

i++;

}

return result;

}

}

④服务发布实现类

package com.cnpc.server;

import javax.xml.ws.Endpoint;

public class webServiceApp {

/**

* @param args

*/

public static void main(String[] args) {

System.out.println("web service start");

HelloWorldImpl implementor =

new HelloWorldImpl();

String address =

"http://localhost:8080/helloWorld";

Endpoint.publish(address, implementor);

System.out.println("web service started");

}

}

⑤验证服务发布情况如图11。

⑥编写实现客户端实现类

package com.cnpc.client;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import com.cnpc.pojo.User;

import com.cnpo.server.HelloWorld;

public class HelloWorldClient {

/**

* @param args

*/

public static void main(String[] args) {

JaxWsProxyFactoryBean jwpfb = new JaxWsProxyFactoryBean();

jwpfb.setServiceClass(HelloWorld.class);

jwpfb.setAddress("http://localhost:8080/helloWorld");

HelloWorld hw = (HelloWorld) jwpfb.create();

User user = new User();

user.setName("某油田");

user.setDescription("第一采油廠");

System.out.println(hw.sayHiToUser(user));

}

}

4 传输性能分析

4.1 无附加安全策略测试

图12测试时间表明,至少在测试程序中使用的数据,Metro2.0平均请求处理速度快于Axis2及CXF。在XML数据转换中,此三种框架协议栈具有相同的处理速度。这是在Metro和CXF框架中可以预料的,因为Metro和CXF都是基于JAXB标准实现数据转换的。由此可以判断,Axis2数据绑定框架实现以及Axis2采用也默认采用的数据绑定实现具有与JAXB一样的运行速度。

具有安全策略的测试性能比较,图13显示了基于如下安全配置的测试时间:①普通型:无安全策略(数据同图12)。②用户名令牌:WS安全策略基于纯文本用户令牌环请求。③标记:WS安全策略基于消息体和消息头标记时间戳。④加密标记:安全策略基于标记时间错的消息体和消息头,并加密消息体。图13,显示了对于1000个轻量级请求的指标化测试时间。

4.2 归一化耗时对比

图14显示了基于相同的1000个请求及轻量级响应的归一化相对时间。以上四种安全配置的测试结果显示,Axis2总是响应最慢的集成框架。Metro与CXF的差别小于CXF与Axis2:的差别, Metro框架总是最快的,Metro 框架比CXF框架快了10%,CXF比Axis2快近两倍。图15显示基于100个重量级响应指标化测试时间对比结果。

图16显示相对时间(均归一化为CXF结果)基于相同的100个请求和较重量级响应。在这个测试用例中,Axis2又一次比Metro和CXF(再次约是CXF的一半速度)慢好多,在轻量级消息响应中 Metro和CXF的差别大于逆转 CXF大约快了15%。在这个测试用例中,Axis2又一次比Metro和CXF(再次约是CXF的一般速度)慢好多,在轻量级消息响应中Metro和CXF的差别大于逆转CXF大约快了15%。基于以上测试报告,Metro 2.0在基本的请求/响应处理过程中比Axis 2及CXF 2.17要快。对于WebService安全性问题,Metro的XWSS函数库整体上比Axis2和CXF采用的函数库快。

4.3 性能分析

综合以上测试结果分析,CXF框架在服务提供应用中对重量级长消息(500KB及以上)的传输性能比Axis2具有更短的时间响应时间。

5 结束语

本文在解析SOA设计理念的基础上,深入剖析了Apache CXF开源框架体系结构及其组件构成,剖析附加安全策略与非附加安全策略的情况下CXF传输性能,并给出基于CXF异构系统集成的一种实现方法。SOA和开源框架对各类异构系统的集成在企业业务整合开展过程中具有重要作用。SOA的实施过程无论采用自顶而下逐步深入细化的过程,还是采用自底向上业务逐步融合的过程,都是一个持续集成生长发展的过程。SOA实施过程无论从初始、到受控管理、到定义清晰、到量化管理以致持续优化不断成熟并使组织受益,都是一个持续发展、逐步推进的过程。

参考文献:

[1]卢致杰,覃正,韩景倜,王立华,等.SOA体系设计方法研究[J].工业工程,2004,7(6):14-16.

[2]汤瀚秋.基于Axis2和CXF的Web Service传输性能测试方案研究[J].软件导刊,2012,11(6):15-16.

[3]Krafzig D, Banke K, Slama D. Enterprise SOA: Service-Oriented Architecture Best Practices. USA, Prentice Hall PTR, 2004: 41-59.

[4]Nicolai M.著.SOA实践指南:分布式系统的设计艺术[M]. 程桦译.北京:电子工业出版社,2008:1-283.

[5]Mark D.Hansen著.使用Java Web 服务构建SOA[M].成保栋译.北京:电子工业出版社,2009:1-535.

[6]SOA Design Patterns [M]. 1st ed. Boston: Pearson Education, Inc, 2009.

[7]A Study Case of Restful Frameworks in Raspberry Pi:A Performance and Energy Overview: Luiz Henrique Nunes, Edvard Oliveira, Julio Cezar Estrella, Stephan Reiff-Marganiec

[8]刘壮业.面向服务架构若干关键问题研究 [J].计算机工程与设计,2009,30(3):600-603

[9]卢致杰.覃正.韩景倜.王立华.SOA体系设计方法研究[J].工业工程,2004,7(6):15-19

[10]Hanscn M.D.著.使用Java.Web服务构建SOA[M].成保栋译.北京:电子工业出版社,2009:1-283.

[11]吴家菊.刘刚.基于面向服务架构的敏捷供应链信息集成研究 [J].计算机工程与设计,2006,27(19):3445-3448.

[12]Nicolai M.Josuttis著.SOA 实践指南-分布式系统设计的艺术[M].程桦译.北京:电子工业出版社,2008:1-283.

[13]余浩,朱成,丁鹏,著.SOA实践-构建基于Java Web 服务和BPEL的企业级应用[M].北京:电子工业出版社,2008:1-310.

[14]Thomas Erl著.SOA服务设计原则[M].郭耀译.北京:人民邮电出版社,2009:1-346.

[15]Thomas Erl Clive Gee.Jurgen Kress著.下一代SOA服务技术与面向服务简明指南[M].卢涛译.北京:电子工业出版社,2015:1-196.endprint

猜你喜欢

系统集成
加氢站与调压站能源供应系统集成技术及应用
试析汽车产业智能制造中的信息化系统集成
工业企业系统集成技术 系统集成技术与信息化集成系统(下)
“系统集成”式的改革
车牌识别与视频监控系统集成探讨
全舰计算环境体系结构和系统集成框架