張同楊
摘要:本文針對異構(gòu)系統(tǒng)集成中數(shù)據(jù)共享問題,通過剖析Apache CXF開源框架體系結(jié)構(gòu)及其組件構(gòu)成,分析CXF框架及SOA同類框架在不同條件下的性能對比,結(jié)合集團級業(yè)務信息系統(tǒng)整合特點,給出基于CXF框架構(gòu)建SOA的方法。理論分析與系統(tǒng)測試都表明Apache CXF在集團級異構(gòu)信息系統(tǒng)集成方面具有明顯優(yōu)勢。
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.
關鍵詞:面向服務架構(gòu);CXF;系統(tǒng)集成;SOA
Key words: service-oriented architecture;CXF;system integration;SOA
中圖分類號:TP399 文獻標識碼:A 文章編號:1006-4311(2017)32-0083-05
1 SOA
集團級業(yè)務系統(tǒng)數(shù)據(jù)一般涉及總部、區(qū)域公司、二級單位、基層單位業(yè)務數(shù)據(jù),以及諸如身份認證系統(tǒng)、人力資源系統(tǒng)、郵件系統(tǒng)、設備信息系統(tǒng)等其他集團級業(yè)務數(shù)據(jù),業(yè)務數(shù)據(jù)范圍廣泛、種類繁多。集團級業(yè)務系統(tǒng)持續(xù)集成所屬單位業(yè)務系統(tǒng)、其他集團級業(yè)務系統(tǒng)的實時數(shù)據(jù),豐富和完善集團級業(yè)務系統(tǒng)數(shù)據(jù)、提高數(shù)據(jù)質(zhì)量、降低數(shù)據(jù)導入導出復雜度、減少人工介入整理數(shù)據(jù)的工作量,在業(yè)務運營實踐中具有重要的現(xiàn)實意義。
然而,基于功能或過程的企業(yè)架構(gòu)一般是不同平臺、不同開發(fā)工具、不同管理規(guī)范、不同需求、不同時期研發(fā)的多階段交錯復雜業(yè)務系統(tǒng),體系結(jié)構(gòu)、平臺技術類型差異較大。這種差異和復雜嚴重影響了企業(yè)業(yè)務系統(tǒng)的敏捷性和穩(wěn)定性,從而影響到企業(yè)領導者的業(yè)務決策和企業(yè)核心能力的發(fā)揮。面對瞬息萬變的市場需求,企業(yè)需要具有快速反應、敏捷生存的能力,從而要求企業(yè)管理業(yè)務系統(tǒng)必須具有敏捷服務、快速重構(gòu)、資源重用及自由擴充等特點。
1.1 SOA設計理念
SOA設計理念以“支持異質(zhì)、分散和容錯”保持系統(tǒng)靈活性,以編排松散耦合軟件服務發(fā)布業(yè)務邏輯。在企業(yè)應用集成領域中,SOA理念復用企業(yè)現(xiàn)有應用,保護企業(yè)既有信息投資,對企業(yè)中的業(yè)務流程進行靈活重構(gòu)與優(yōu)化,以服務方式構(gòu)建業(yè)務流程和服務對象,增強業(yè)務的適應性和敏捷性。
1.2 SOA設計原則
SOA設計保持靈活性和松散耦合,設計原則主要是一致性原則,SOA架構(gòu)應采用所有參與者都一致理解的方式整合內(nèi)容,統(tǒng)一管理,以減少開發(fā)、集成及維護工作;服務粒度封裝適中原則,即應有利于可用性、可維護性、可操作性、可拓展性及易用性,統(tǒng)籌適度封裝操作數(shù)量;自治原則,所有服務自我管理,獨立部署、版本控制及管理,單一更改不影響整個系統(tǒng);高內(nèi)聚原則,一個服務基于一個主題進行合并和組裝;松耦合原則,服務之間透明訪問,一服務改變不影響其他服務;服務調(diào)用原則,平臺技術中立,支持多種可傳輸協(xié)議和數(shù)據(jù)格式。
1.3 SOA協(xié)議棧
SOA架構(gòu)通過統(tǒng)一不同廠家和用戶的技術標準共識,構(gòu)建協(xié)作規(guī)范以屏蔽差異。目前SOA技術標準分3類:元數(shù)據(jù)標準、基礎通信標準和信息交互標準,從角色功能上劃分為傳輸層、消息層、描述層、管理層、服務組合層和表示層等6層,如圖1所示為SOA協(xié)議棧層次結(jié)構(gòu)。
2 Apache CXF基礎架構(gòu)及組件
ApacheCXF框架是由ObjectWeb Celti和CodeHaus XFire合并成立。ObjectWeb Celtix是開源Java ESB框架,XFire則是SOAP堆棧。ApacheCXF融合ObjectWeb Celtix和CodeHaus XFire兩個開源框架的功能,提供實現(xiàn)SOA所需要的核心ESB功能,包括SOA服務創(chuàng)建,服務路由,及QoS功能。CXF支持JAX-WS標準,提供對多種 Binding、DataBinding、Transport 以及各種 Format 的支持。CXF可以根據(jù)實際需要,采用代碼優(yōu)先(Code First)或 WSDL 優(yōu)先(WSDL First)發(fā)布和使用Web Services。Apache CXF支持SOAP、XML/HTTP、RESTful HTTP或CORBA等協(xié)議,簡化Service創(chuàng)建,易于和Spring無縫集成、易于異構(gòu)信息系統(tǒng)的持續(xù)集成,并提供數(shù)據(jù)安全傳輸機制。
2.1 Apache CXF體系結(jié)構(gòu)
CXF框架不為各組件創(chuàng)建和維護單獨的信道,而是使每個組件邏輯上與總線相連,以使所有組件相互連接起來。Bus組件是CXF框架的核心組件,為共享資源提供了一個可配置的場所。CXF框架使用Spring依賴注入、以總線方式串接Messaging組件、Interceptors組件、Transport組件、Data Binding組件、Frontend組件、Service Model組件、Binding組件和WS-Support組件,以使得各個組件相互通訊。endprint
在具體實現(xiàn)中,抽象類AbstractBasicInterceptor Provider實現(xiàn)InterceptorProvider接口,CXFBusImpl繼承AbstractBasicInterptorProvider類。ExtensionManagerBus類繼承CXFBusImpl類以實現(xiàn)Bus拓展性。所有對CXF的Data Bindings、Binding、Transport等功能的引用最終轉(zhuǎn)化為Bus組件的方法和內(nèi)容。圖3示出了BUS組件的實現(xiàn)類結(jié)構(gòu)圖。
通過對Bus進行擴展,可以方便地容納自己的資源,或替換現(xiàn)有的資源。Bus默認以Spring依賴注入,串接運行態(tài)各組件。Bus默認由SpringBusFactory實現(xiàn),在構(gòu)造過程中,SpringBusFactory搜索META-INF/cxf(就包含在 CXF的Jar中)下的所有Bean配置文件,構(gòu)建單獨ApplicationContext。
2.2 消息組件和攔截器
消息組件、攔截器組件和相位組件共同構(gòu)成CXF框架消息層。Apache CXF的Messaging、Phase和Interceptors類結(jié)構(gòu)如圖4所示。Messaging 接口是CXF傳遞信息的基礎,所有操作最終都轉(zhuǎn)化成對一定格式消息的操作。圖4示出了CXF中消息層各組件實現(xiàn)類結(jié)構(gòu)圖。
CXF以消息處理為中心,建立在一個由消息、攔截器和攔截器鏈(Interceptpr Chain)組成的通用消息層之上。CXF通過Interceptors對消息進行處理,實現(xiàn)諸如消息壓縮、SOAP消息處理等主要功能。攔截器的通用方法主要有handleMessage和handleFault,分別對應消息處理和錯誤處理。一般在消息傳遞及處理的過程中,通過攔截器對CXF進行安全認證等功能拓展。圖5示出的代理模式,將在生成目標對象前創(chuàng)建一個具有與原初目標對象相同接口方法的代理,并在真實方法生效前,在代理的方法中添加定制特性方法實現(xiàn)細節(jié)業(yè)務邏輯。
CXF框架組合多個攔截器形成攔截器鏈,其中InterceptorChain用于實現(xiàn)增減Interceptor、控制消息處理及處置異常消息功能。圖6及圖7示出Apache CXF攔截器客戶端實現(xiàn)過程和Apache CXF攔截器服務端實現(xiàn)基本過程。
2.3 前端編程模型
前端組件(Front-Ends)為CXF框架提供了創(chuàng)建服務的編程模型。CXF服務器端基于JAX-WS和JAX-RS規(guī)范的Frontend組件與客戶端交互。在實現(xiàn)上,JAX-WS和JAX-RS提供FactoryBean部件依賴于Frontend組件的FactoryBean類,而FactoryBean類由依賴于由Client、Endpoint及Server接口實現(xiàn)的Endpoint組件,該組件通過Interceptor接口、Fault接口和Interceptorchain接口依賴于Interceptors組件。圖8示出了CXF前端應用類結(jié)構(gòu),ServerFactoryBean類作用于服務器端點,AbstractServiceFactory類應用于簡化前端模式的實現(xiàn),而ClientFactoryBean類和ClientProxyFactoryBean類都基于ClientFactoryBean類。(圖8)
2.4 Service模型
CXF框架中的服務通過服務模型來表示。它主要有兩部分:ServiceInfo和服務本身。ServiceInfo作用類似WSDL,包含接口信息、綁定、端點(EndPoint)等信息;服務則包含了ServiceInfo、數(shù)據(jù)綁定、攔截器和服務屬性等信息??墒褂肑ava類和WSDL來創(chuàng)建服務。一般是由前端ServiceFactory完成服務的創(chuàng)建。
在具體實現(xiàn)上,動態(tài)客戶端應用中Service組件包括Service、ServiceBuilder和ServiceImpl三個接口實現(xiàn)factory、invoker和model組件。其中model核心接口是ServiceInfo根組件,分別由InterfaceInfo組件、BindingInfo組件和EndpointInfo組件繼承。
2.5 數(shù)據(jù)綁定、綁定及傳輸協(xié)議組件
綁定提供了在傳輸之上映射具體格式和協(xié)議的方法,主要的兩個類是Binding和BindingFactory。BindingFactory負責創(chuàng)建Binding。
Data Bindings以生成XML schema的方式實現(xiàn)XML和Java之間的映射,數(shù)據(jù)綁定組件由Data Bindings主接口和Aegis組件、JAXB組件、XMLBeans組件及MTOM組件構(gòu)成。綁定組件由Bindings接口(Binding、BindFactory、BindFactoryManager)和coloc、CORBA、http、object、SOAP和XML六個實現(xiàn)組件構(gòu)成。
為了對綁定和前端屏蔽傳輸細節(jié),CXF框架通過注冊MessageObserver獲得通知的方式,提供用于消息發(fā)送的Conduit傳輸對象和Destination消息接收對象。在具體實現(xiàn)上,CXF傳輸組件由Transport接口(Conduits對象和Destiations對象)和8個基礎業(yè)務實現(xiàn)組件(http、http_jetty、http_osgi、https、https_jetty、jms、servlet和loca Transport組件)構(gòu)成。
3 異構(gòu)系統(tǒng)集成體系結(jié)構(gòu)
在設計實現(xiàn)中,基于SOA設計理念定義的規(guī)范和標準,無須了解交互方系統(tǒng)內(nèi)部實現(xiàn)細節(jié),屏蔽Windows、Linux及Android等不同平臺下的Java、.NET、C/C++、C#各類語言的差異,業(yè)務系統(tǒng)CXF框架作為對外界業(yè)務系統(tǒng)交互的SOA引擎,通過webservice的方式對基于XML規(guī)范的WSDL文件操作,實現(xiàn)異構(gòu)系統(tǒng)數(shù)據(jù)共享。圖9指出了集團級業(yè)務系統(tǒng)基于CXF框架集成異構(gòu)業(yè)務系統(tǒng)的基本結(jié)構(gòu)。endprint
服務器端調(diào)用方法把XML格式的SOAP請求/響應消息轉(zhuǎn)換成Java目標方法調(diào)用,客戶端調(diào)用方法把對SEI代理的方法調(diào)用轉(zhuǎn)換成XML格式的SOAP請求和響應,SOAP消息處理結(jié)構(gòu)如圖10所示,SOAP消息的序列化與反序列化。
基于CXF基礎框架構(gòu)建SOA應用,實現(xiàn)上述序列化與反序列化過程,一般采用以下基本步驟:
①導入%CXF_HOME%\ lib下jar包配置基礎編譯環(huán)境。
②編寫服務接口基類。
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
}
③編寫服務接口的實現(xiàn)類
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
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
String[] result = new String[userList.size()];
int i = 0;
for(User u:userList){
result[i] = "Hello " + u.getName();
i++;
}
return result;
}
}
④服務發(fā)布實現(xiàn)類
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");
}
}
⑤驗證服務發(fā)布情況如圖11。
⑥編寫實現(xiàn)客戶端實現(xiàn)類
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測試時間表明,至少在測試程序中使用的數(shù)據(jù),Metro2.0平均請求處理速度快于Axis2及CXF。在XML數(shù)據(jù)轉(zhuǎn)換中,此三種框架協(xié)議棧具有相同的處理速度。這是在Metro和CXF框架中可以預料的,因為Metro和CXF都是基于JAXB標準實現(xiàn)數(shù)據(jù)轉(zhuǎn)換的。由此可以判斷,Axis2數(shù)據(jù)綁定框架實現(xiàn)以及Axis2采用也默認采用的數(shù)據(jù)綁定實現(xiàn)具有與JAXB一樣的運行速度。
具有安全策略的測試性能比較,圖13顯示了基于如下安全配置的測試時間:①普通型:無安全策略(數(shù)據(jù)同圖12)。②用戶名令牌:WS安全策略基于純文本用戶令牌環(huán)請求。③標記:WS安全策略基于消息體和消息頭標記時間戳。④加密標記:安全策略基于標記時間錯的消息體和消息頭,并加密消息體。圖13,顯示了對于1000個輕量級請求的指標化測試時間。
4.2 歸一化耗時對比
圖14顯示了基于相同的1000個請求及輕量級響應的歸一化相對時間。以上四種安全配置的測試結(jié)果顯示,Axis2總是響應最慢的集成框架。Metro與CXF的差別小于CXF與Axis2:的差別, Metro框架總是最快的,Metro 框架比CXF框架快了10%,CXF比Axis2快近兩倍。圖15顯示基于100個重量級響應指標化測試時間對比結(jié)果。
圖16顯示相對時間(均歸一化為CXF結(jié)果)基于相同的100個請求和較重量級響應。在這個測試用例中,Axis2又一次比Metro和CXF(再次約是CXF的一半速度)慢好多,在輕量級消息響應中 Metro和CXF的差別大于逆轉(zhuǎn) CXF大約快了15%。在這個測試用例中,Axis2又一次比Metro和CXF(再次約是CXF的一般速度)慢好多,在輕量級消息響應中Metro和CXF的差別大于逆轉(zhuǎn)CXF大約快了15%?;谝陨蠝y試報告,Metro 2.0在基本的請求/響應處理過程中比Axis 2及CXF 2.17要快。對于WebService安全性問題,Metro的XWSS函數(shù)庫整體上比Axis2和CXF采用的函數(shù)庫快。
4.3 性能分析
綜合以上測試結(jié)果分析,CXF框架在服務提供應用中對重量級長消息(500KB及以上)的傳輸性能比Axis2具有更短的時間響應時間。
5 結(jié)束語
本文在解析SOA設計理念的基礎上,深入剖析了Apache CXF開源框架體系結(jié)構(gòu)及其組件構(gòu)成,剖析附加安全策略與非附加安全策略的情況下CXF傳輸性能,并給出基于CXF異構(gòu)系統(tǒng)集成的一種實現(xiàn)方法。SOA和開源框架對各類異構(gòu)系統(tǒng)的集成在企業(yè)業(yè)務整合開展過程中具有重要作用。SOA的實施過程無論采用自頂而下逐步深入細化的過程,還是采用自底向上業(yè)務逐步融合的過程,都是一個持續(xù)集成生長發(fā)展的過程。SOA實施過程無論從初始、到受控管理、到定義清晰、到量化管理以致持續(xù)優(yōu)化不斷成熟并使組織受益,都是一個持續(xù)發(fā)展、逐步推進的過程。
參考文獻:
[1]盧致杰,覃正,韓景倜,王立華,等.SOA體系設計方法研究[J].工業(yè)工程,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實踐指南:分布式系統(tǒng)的設計藝術[M]. 程樺譯.北京:電子工業(yè)出版社,2008:1-283.
[5]Mark D.Hansen著.使用Java Web 服務構(gòu)建SOA[M].成保棟譯.北京:電子工業(yè)出版社,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]劉壯業(yè).面向服務架構(gòu)若干關鍵問題研究 [J].計算機工程與設計,2009,30(3):600-603
[9]盧致杰.覃正.韓景倜.王立華.SOA體系設計方法研究[J].工業(yè)工程,2004,7(6):15-19
[10]Hanscn M.D.著.使用Java.Web服務構(gòu)建SOA[M].成保棟譯.北京:電子工業(yè)出版社,2009:1-283.
[11]吳家菊.劉剛.基于面向服務架構(gòu)的敏捷供應鏈信息集成研究 [J].計算機工程與設計,2006,27(19):3445-3448.
[12]Nicolai M.Josuttis著.SOA 實踐指南-分布式系統(tǒng)設計的藝術[M].程樺譯.北京:電子工業(yè)出版社,2008:1-283.
[13]余浩,朱成,丁鵬,著.SOA實踐-構(gòu)建基于Java Web 服務和BPEL的企業(yè)級應用[M].北京:電子工業(yè)出版社,2008:1-310.
[14]Thomas Erl著.SOA服務設計原則[M].郭耀譯.北京:人民郵電出版社,2009:1-346.
[15]Thomas Erl Clive Gee.Jurgen Kress著.下一代SOA服務技術與面向服務簡明指南[M].盧濤譯.北京:電子工業(yè)出版社,2015:1-196.endprint