本文主要是對ESB的總結(jié),下面我將從以下幾點(diǎn)去理清ESB相關(guān)知識(shí)點(diǎn)。
- 什么是ESB
- ESB解決了什么問題以及什么是HSB
- ESB產(chǎn)品有哪些?如何選擇
- 如何實(shí)現(xiàn)ESB的各個(gè)功能
- ESB與微服務(wù)的區(qū)別
一、什么是ESB
ESB是Enterprise Service Bus的簡稱,中文翻譯為企業(yè)服務(wù)總線,企業(yè)服務(wù)總線是一個(gè)實(shí)現(xiàn)系統(tǒng)間集成和互聯(lián)互通的重要技術(shù)架構(gòu),可以理解為是一種消息和服務(wù)集成的中間件平臺(tái)。
二、ESB解決了什么問題以及什么是HSB

ESB主要是為了解決多個(gè)應(yīng)用系統(tǒng)互聯(lián)所面臨的的復(fù)雜性,減低集成和維護(hù)成本。
舉個(gè)例子,比如我們的醫(yī)療業(yè)務(wù)系統(tǒng)都知道分為很多個(gè)系統(tǒng),包括HIS、LIS、EMR等等,如果這些業(yè)務(wù)系統(tǒng)是由多個(gè)商家做的,可能會(huì)有構(gòu)建語言不同、通信協(xié)議不同、數(shù)據(jù)傳輸格式不同等問題,那么如何把這些系統(tǒng)用一條線串起來呢?就是用ESB;還有我們醫(yī)療從業(yè)者、患者、管理人員等可以通過多個(gè)渠道訪問后臺(tái)系統(tǒng),比如瀏覽器的portal,移動(dòng)設(shè)備等;還有一些特殊的醫(yī)療業(yè)務(wù)應(yīng)用系統(tǒng),比如雙向會(huì)診、遠(yuǎn)程會(huì)診、業(yè)務(wù)協(xié)同等等,即實(shí)現(xiàn)了ESB的基本特點(diǎn),又滿足醫(yī)療衛(wèi)生行業(yè)的特定需求的ESB,叫做健康服務(wù)總線(Health Service Bus,HSB)。
ESB為了解決剛才說的問題,就需要保證多個(gè)應(yīng)用系統(tǒng)的服務(wù)接入,協(xié)議轉(zhuǎn)換,提供可靠的消息傳輸,數(shù)據(jù)格式轉(zhuǎn)換,基于內(nèi)容路由等功能。
有人可能會(huì)有疑問,應(yīng)用A發(fā)送消息給ESB,ESB再將消息轉(zhuǎn)換給應(yīng)用B,那么應(yīng)用A直接通過SOAP協(xié)議發(fā)送給B,效率不是應(yīng)該更高嗎?而且如果這些IT系統(tǒng)都在一個(gè)網(wǎng)絡(luò)中,提供的WebService都在統(tǒng)一命名空間下,就可以相互通信,為什么還要加上這一層?有兩點(diǎn)需要考慮。第一點(diǎn)。點(diǎn)對點(diǎn)做服務(wù)的時(shí)候,通常需要考慮日志記錄,服務(wù)訪問安全、傳輸安全、數(shù)據(jù)安全、路由分發(fā)等一系列問題,而這些完全可以統(tǒng)一管理,統(tǒng)一驗(yàn)證,靈活配置,;如果應(yīng)用A調(diào)用了應(yīng)用B,在調(diào)用了應(yīng)用C等具有邏輯流程的調(diào)用時(shí),還可以在ESB上實(shí)現(xiàn)流程引擎;第二點(diǎn),ESB是一個(gè)中間件平臺(tái),包含了消息中間件的全部功能,有異步消息處理機(jī)制,可以實(shí)現(xiàn)業(yè)務(wù)系統(tǒng)之間真正的松耦合的結(jié)構(gòu)。
三、市面上 ESB產(chǎn)品有哪些?如何選擇
一.CXF
CXF的定位不是ESB總線,而是一個(gè)服務(wù)框架(Service Framework),主要還是為關(guān)于服務(wù)的應(yīng)用提供API上的支持,或者上下文上的管理??墒撬那吧碇械囊粋€(gè)的Celtix就是IONA公司捐獻(xiàn)給開源界的ESB總線,所以總體上還是能提供ESB總線的功能(需依靠與其他的容器)。在CXF中的總線僅僅是起到一個(gè)共享資源的提供者的作用。這些貢獻(xiàn)資源就相當(dāng)于JBI規(guī)范中的綁定組件(BC)或服務(wù)引擎(SE)。即使如此CXF并沒有提供了對JBI規(guī)范的完整實(shí)現(xiàn)。能夠說它僅僅是一個(gè)相似的JBI容器。CXF支持與除了HTTP之外的其他協(xié)議的通信綁定,比如REST、JSON和CORBA等,所以對于Ajax有較強(qiáng)的兼容性。這相對與其他的ESB總線而言能夠說是一個(gè)較大的優(yōu)勢??墒荂XF的ESB總線是根據(jù)Spring框架來實(shí)現(xiàn)的,由Spring來管理Bus中的各個(gè)組件。而Spring對各個(gè)Bean或組件的管理是通過一個(gè)上下文的配置文件來實(shí)現(xiàn)的。這種方式相對與其它的ESB總線(比如根據(jù)JMX)的方式而言,則不支持動(dòng)態(tài)的熱部署。也就是說CXF不是一個(gè)JBI容器,它必須依附與其它的容器來執(zhí)行?,F(xiàn)有的資料來看,CXF眼下能夠部署在JBoss和BEA Weblogic中,Tomcatserver因?yàn)椴恢С滞暾腏2EE規(guī)范,特別是基于JCA的EJB,所以對CXF支持的程度不理想。盡管資料中沒有涉及到Geronimo,可是以Geronimo對J2EE規(guī)范的兼容程度來看,特別是EAR文檔的支持,在Geronimo中部署CXF應(yīng)該沒有什么太大的障礙。相同你能夠在使用Spring的應(yīng)用中嵌入CXF,而這僅僅須要在Spring的配置文件里填寫對應(yīng)的配置信息就可以。關(guān)于CXF的文檔較為豐富,這部分是因?yàn)樗旧硎钦狭薠fire和Celtix這兩個(gè)本身較為成熟的開源項(xiàng)目。另外它較大的依賴于Spring框架,所以假設(shè)對Spring較為熟悉的話,在使用上一般就沒有太大的障礙了。
二.Open ESB
OpenESB是Sun公司提出來的開源ESB項(xiàng)目,所以對JBI規(guī)范的支持程度就不用多說了。而GlassFish ESB則是將OpenESB的核心執(zhí)行環(huán)境與GlassFish應(yīng)用server以及NetBean的集成開發(fā)環(huán)境整合在一起的有一個(gè)ESB項(xiàng)目,當(dāng)然當(dāng)中還包括了一些OpenESB中已有的組件(子集)。
在OpenESB中提供了可以支持WS-BPEL2.0的引擎??墒侨缃襁@個(gè)組件支持WSDL1.1,暫不支持WSDL2.0。并且這個(gè)引擎要依托與NetBean集成開發(fā)平臺(tái),起碼僅僅能得到基于NetBean的對應(yīng)開發(fā)包和組件包。可是這個(gè)組件對BPEL提供了強(qiáng)大的支持,當(dāng)中包含支持端點(diǎn)狀態(tài)的監(jiān)控、支持多線程運(yùn)行、業(yè)務(wù)流程的調(diào)試、系統(tǒng)錯(cuò)誤的可靠性恢復(fù)中各個(gè)業(yè)務(wù)流程實(shí)例的數(shù)據(jù)庫持久化以及負(fù)載均衡等。在資料方面僅僅有一個(gè)演示視頻,主要還是基于NetBean平臺(tái)的使用介紹。其它發(fā)布的資料則則較少,特別是API方面差點(diǎn)兒沒有。所以假設(shè)要對OpenESB進(jìn)行依照自身的要求進(jìn)行擴(kuò)展則較為困難,除非對OpenESB的源碼進(jìn)行全面的分析。
三.ServiceMix
ServiceMix是Apache基金會(huì)下的一個(gè)ESB總線,同一時(shí)候也是一個(gè)獨(dú)立的JBI容器(也就是說它支持完整的JBI規(guī)范)。說它是一個(gè)獨(dú)立的JBI容器,是由于它擁有自己獨(dú)立的執(zhí)行環(huán)境,能像應(yīng)用server一樣啟動(dòng),并支持動(dòng)態(tài)的熱部署等,這一點(diǎn)則差別于CXF。
ServiceMix的容器執(zhí)行環(huán)境採用內(nèi)核的架構(gòu),并以Geronimo關(guān)于J2EE方面的實(shí)現(xiàn)為基礎(chǔ)(當(dāng)然也就支持J2EE的各方面規(guī)范,比如安全性方面的JAAS等),所以在性能上還是較為出色的。在通信上,整合了ActiveMQ,也支持多種的通信協(xié)議,比如HTTP和JMS。同一時(shí)候在管理組件上採用了JMX的管理架構(gòu),從而可以對部署在總線上的各種組件進(jìn)行動(dòng)態(tài)的配置和管理,或通過Web的形式,或通過JMX遠(yuǎn)程訪問均可。ServiceMix內(nèi)核可以整合到所處的操作系統(tǒng)中,從而作為OS的對外提供的服務(wù)。差別與其它總線的是,ServiceMix還提供了自己的腳本命令控制臺(tái),并通過一些簡單命令來管理應(yīng)用組件以及ServiceMix內(nèi)核實(shí)例。
關(guān)于ServiceMix的資料也較為的完備,當(dāng)中當(dāng)然也包含一些簡單的小樣例。關(guān)于組件擴(kuò)展方面和流程引擎整合方面的具體資料則不夠具體。假設(shè)要做進(jìn)一步的總線上的擴(kuò)展,則須要對源碼和樣例進(jìn)行較為深入的學(xué)習(xí)和研究,當(dāng)然這一切的基礎(chǔ)是對JBI的規(guī)范有較為全面的了解。
四.JBoss ESB
JBoss ESB是JBoss社區(qū)為面向SOA而提出的一個(gè)EAI系統(tǒng)平臺(tái)。它提供了非常多EAI本身所應(yīng)具有的功能,比如業(yè)務(wù)流程監(jiān)控、集成開發(fā)環(huán)境、工作流用戶接口、業(yè)務(wù)流程管理、分布式計(jì)算架構(gòu)以及作為應(yīng)用容器的功能等。能夠說JBossESB在功能上是較為強(qiáng)大的。但相對于上面的總線而言,它的技術(shù)架構(gòu)方案是最獨(dú)立的。由于它除了支持J2EE標(biāo)準(zhǔn)外,對于JBI規(guī)范壓根就不沾邊。當(dāng)然也就不存在JBI規(guī)范中的規(guī)范化消息路由、服務(wù)引擎和綁定組件了。JBossESB除了支持 Web Service外,還支持多種的遠(yuǎn)程調(diào)用協(xié)議,比如JMS。僅僅是相對于ServiceMix和CXF而言,假設(shè)要對JBossESB進(jìn)行擴(kuò)展,可能要花費(fèi)較大的時(shí)間和精力。
JBossESB相對上述的開源項(xiàng)目而言,一個(gè)非常大的優(yōu)勢在于文檔資料是最為豐富和完備的。所以在開發(fā)和擴(kuò)展上減小了不小的阻力。它而且依托于成熟的JBoss社區(qū),周圍齊全的開源項(xiàng)目支持,為后期的平臺(tái)擴(kuò)展提供了豐富的選擇空間。
四、 如何實(shí)現(xiàn)ESB的各個(gè)功能
1.ESB的服務(wù)接入方式?
- RPC 遠(yuǎn)程過程調(diào)用(面向方法)
- SOAP 面向服務(wù)的架構(gòu)(面向消息)
- REST 資源的狀態(tài)轉(zhuǎn)變(面向資源)
目前我們公司使用的HSF實(shí)際上就是RPC,還是JSON-RPC,RPC的另一種實(shí)現(xiàn)還有XML-RPC,通訊方式相同,采用調(diào)用本地服務(wù)(方法)一樣的調(diào)用服務(wù)器的服務(wù)(方式)的方式,只不過傳輸數(shù)據(jù)格式不同,JSON格式更加高效。
XML-RPC實(shí)際上就是這三種方式的最早通信方式,基于HTTP傳輸協(xié)議+XML參數(shù)封裝,一個(gè)XML-RPC消息就是一個(gè)請求體為xml的htpp-post的請求,服務(wù)端執(zhí)行了之后也以XML格式的編碼返回,后來這個(gè)標(biāo)準(zhǔn)演化成了SOAP,可以理解為SOAP是XML-RPC 的高級版本;
SOAP,簡單對象訪問協(xié)議,是一種輕量的、簡單的、基于xml的遠(yuǎn)程訪問協(xié)議,可以實(shí)現(xiàn)多種傳輸層或應(yīng)用層協(xié)議結(jié)合使用,如TCP/HTTP/SMTP等,實(shí)際上應(yīng)用最廣泛的還是基于HTTP+XML的實(shí)現(xiàn),相對于XML-RPC,SOAP更好的利用了XML,有相應(yīng)的服務(wù)描述語言,也是一段XML,也就是WSDL(Web Services Description Language),專門用來描述怎么訪問web服務(wù),描述了哪些細(xì)節(jié)呢?一般包含4點(diǎn),用于訪問服務(wù)的地址信息,用于傳輸信息的傳輸協(xié)議(比如通道數(shù)),用于所有可使用功能的名稱和接口方法,在所有的請求和響應(yīng)中所使用的數(shù)據(jù)類型,具體什么格式,這里不再展開,有興趣可以查看一下以下鏈接:
WebService之WSDL文件講解
最后說REST,非協(xié)議非規(guī)范,只是一種約束、概念或者開發(fā)方式,簡單的說就是,用HTTP動(dòng)詞(GET,POST,DELETE,DETC)描述操作,表示資源的轉(zhuǎn)換。滿足REST的約束叫RESTful結(jié)構(gòu),其實(shí)目前公司的并不是RESTful風(fēng)格。
近年來的REST被炒得很火,但不是所有情況都是適合的,REST目前都是基于HTTP/HTTPS,而SOAP可以支持很多傳輸協(xié)議,從HTTP/HTTPS到SMTP(Simple Mail Transfer Protocol,簡單郵件傳送協(xié)議),甚至JMS(Java Messaging Service,Java消息傳遞服務(wù))。而SOAP已經(jīng)是一個(gè)工業(yè)標(biāo)準(zhǔn),它具備良好定義的協(xié)議,以及一套良好確立的規(guī)則,在大型和小型系統(tǒng)中均有采用。
2.ESB的如何進(jìn)行協(xié)議轉(zhuǎn)換?
現(xiàn)在使用的ESB協(xié)議轉(zhuǎn)換基本上使用的ESB產(chǎn)品,實(shí)現(xiàn)基本上二進(jìn)制進(jìn)行轉(zhuǎn)換;具體的可以找相應(yīng)的產(chǎn)品的,比如 WSO2d產(chǎn)品的實(shí)現(xiàn):
WSO2 ——(7)ESB功能:協(xié)議轉(zhuǎn)換
目前有一些問題需要再調(diào)查一下,cxf3.1目前也只支持wsdl1.1,axis2的最新版也不支持wsdl2.0,需要繼續(xù)查詢資料如何轉(zhuǎn)換;有些企業(yè)再做接口對接的時(shí)候可能只提供wsdl,需要自己根據(jù)wsdl生成服務(wù)端提供服務(wù)給他們,可以利用soapUI實(shí)現(xiàn)。有些企業(yè)只支持wsdl1.0,我們要實(shí)現(xiàn)自己的ESB就要提供wsdl1.0與wsdl2.0版。
3.數(shù)據(jù)轉(zhuǎn)換
- 在應(yīng)用間交換不同格式的信息
- 操作消息的負(fù)載內(nèi)容,包括加密、壓縮和編碼轉(zhuǎn)換
- 在異構(gòu)的傳輸協(xié)議的數(shù)據(jù)類型間格式化消息
此過程也是依賴工具比如Mule可以用Transformer 進(jìn)行轉(zhuǎn)換,比如將JMS格式message轉(zhuǎn)化為其他類型的數(shù)據(jù),JDBC Transformer可以將CSV或xml文件中的數(shù)據(jù)轉(zhuǎn)移到數(shù)據(jù)庫中等等操作
4. 消息路由
- 基于消息內(nèi)容和復(fù)雜規(guī)則路由消息
- 消息的過濾、聚合以及重新排列序號
此過程也是依賴工具比如Mule可以用case when 等邏輯判斷,根據(jù)消息中指定的消息將消息發(fā)送到不同的服務(wù)端進(jìn)行處理。
5. 其他功能
ESB當(dāng)然還有其他功能,這里不再介紹,基本上各個(gè)ESB工具已經(jīng)封裝好,可根據(jù)ESB工具自己拓展和調(diào)用。這里給出其他功能介紹的鏈接 java系統(tǒng)間通信ESB。
五、ESB與微服務(wù)的區(qū)別
見我另一篇文章:企業(yè)服務(wù)總線 與 注冊服務(wù)管理