javascript
轻量级的开源集成:Apache Camel还是Spring集成?
首先,為全面披露信息,在過(guò)去的1.5年中, 我一直擔(dān)任 FuseSource(現(xiàn)為Red Hat) 的顧問(wèn),為零售,運(yùn)輸,銀行/金融等不同行業(yè)的大型和小型公司提供SOA和集成項(xiàng)目支持。我的專(zhuān)長(zhǎng)是使用該領(lǐng)域的一些最佳開(kāi)源項(xiàng)目來(lái)設(shè)計(jì)具有高可伸縮性和吞吐量要求的解決方案: Apache ActiveMQ , Apache Camel , Apache ServiceMix , Apache CXF等。
我是Apache Camel的DZone Refcardz之一的作者,標(biāo)題為“ Apache Camel Essential Components” ,也是同一標(biāo)題的網(wǎng)絡(luò)廣播的發(fā)言人。 我還是Packt Publishing即將出版的關(guān)于Apache Camel的書(shū)的技術(shù)評(píng)論員,我希望很快能公開(kāi)發(fā)布該書(shū)。
不用說(shuō),我已經(jīng)使用Apache Camel做過(guò)一些工作,對(duì)此我有所貢獻(xiàn),并鼓勵(lì)人們進(jìn)行檢查。
但是在我開(kāi)始使用FuseSource之前,我曾在其他中間件集成項(xiàng)目中工作過(guò)-一些開(kāi)源,一些商業(yè),但是我第一次嘗試輕量級(jí)開(kāi)源集成項(xiàng)目并不是使用Apache Camel。
我在2009年偶然發(fā)現(xiàn)了Spring Integration ,非常喜歡它。
我寫(xiě)了有關(guān)Spring Integration的博客 ,對(duì)用戶(hù)論壇做出了貢獻(xiàn),對(duì)bug修復(fù)和示例做出了貢獻(xiàn)等,在社區(qū)中保持了一些活躍。 我非常尊重Mark,Oleg,Gary,Gunnar等。 等 在Spring Integration上所做的出色工作。
我喜歡它如何擴(kuò)展Spring以及它如何緊密實(shí)施由Gregor Hohpe和Bobby Wolf分類(lèi)的Enterprise Integration Pattens 。 那時(shí)我在幾個(gè)項(xiàng)目上使用了它,我堅(jiān)信除非您在實(shí)際項(xiàng)目中使用過(guò)它來(lái)解決實(shí)際問(wèn)題,否則您對(duì)項(xiàng)目沒(méi)有真正的感覺(jué)。 但是,由于我有機(jī)會(huì)足夠深入地使用了這兩個(gè)項(xiàng)目,因此我想為Blogo貢獻(xiàn)我的觀察和見(jiàn)解
首先,有很多文章比較了兩個(gè)項(xiàng)目。 有些關(guān)注統(tǒng)計(jì)數(shù)據(jù),例如社區(qū)活動(dòng)或組件數(shù)量。 盡管在某種程度上相關(guān),但我想更深入一點(diǎn)。 因此,以下博客文章是我對(duì)Apache Camel和Spring Integration的想法 ,以及(破壞者警報(bào)!)為什么我會(huì)選擇Camel作為集成項(xiàng)目。
抽象,抽象,抽象
這兩個(gè)項(xiàng)目旨在滿(mǎn)足類(lèi)似的需求:輕量級(jí)集成庫(kù),具有EIP的完整實(shí)現(xiàn),用于中介和路由,以及在常用技術(shù)之上提供抽象以與外部系統(tǒng)接口。 一些常見(jiàn)的技術(shù)包括Web服務(wù)(SOAP / REST),JMS或異步消息傳遞,基于文件的批處理系統(tǒng),TCP套接字,FTP / SFTP,RDBMS等。 基本上,只要兩個(gè)異構(gòu)系統(tǒng)需要同步或異步進(jìn)行交互并交換數(shù)據(jù),輕量級(jí)的集成庫(kù)就可以為您提供極大的幫助。 對(duì)于那些問(wèn)“不是ESB做什么的人?” ..恩……有點(diǎn)……但是我可以再寫(xiě)一次。
對(duì)于我們這些集成系統(tǒng)的人來(lái)說(shuō),我們很快就能發(fā)現(xiàn)關(guān)于集成的兩件事。 #1不性感,#2很難。
了解技術(shù),語(yǔ)義以及系統(tǒng)如何用于實(shí)現(xiàn)業(yè)務(wù)功能方面的差異至關(guān)重要。 您最終編寫(xiě)的代碼應(yīng)專(zhuān)注于這些業(yè)務(wù)問(wèn)題,并應(yīng)盡可能利用現(xiàn)有的商品組件。 編寫(xiě)代碼以與文件系統(tǒng)交互或?qū)⑾l(fā)送到隊(duì)列絕對(duì)被認(rèn)為是商品代碼,只是增加了必須維護(hù)的代碼庫(kù)。 如果您手工/自己編寫(xiě)代碼,那么您還可能承擔(dān)將錯(cuò)誤引入對(duì)業(yè)務(wù)邏輯或業(yè)務(wù)語(yǔ)義不重要的區(qū)域的風(fēng)險(xiǎn)。 以我的拙見(jiàn),這是不必要的風(fēng)險(xiǎn)。
這樣便可以使用Apache Camel或Spring Integration。它們通過(guò)提供對(duì)社區(qū)審核過(guò)的商品組件的訪問(wèn)以及實(shí)現(xiàn)常見(jiàn)的EIP(例如轉(zhuǎn)換,路由,過(guò)濾,拆分/聚合等)來(lái)幫助簡(jiǎn)化集成項(xiàng)目。再次..由社區(qū)審查。 如果您手動(dòng)編寫(xiě)這些代碼,祝您好運(yùn)。 當(dāng)然可以做到,人們一直都在這樣做,但這對(duì)大多數(shù)項(xiàng)目來(lái)說(shuō)都是不必要的風(fēng)險(xiǎn)。
我在哪里
是的,因此您可以將這兩個(gè)項(xiàng)目中的任何一個(gè)視為特定技術(shù)之上的“抽象”。 這個(gè)抽象概念使您可以專(zhuān)注于“集成應(yīng)該做什么”。 為了解決這個(gè)問(wèn)題,我相信Apache Camel很有意思。
領(lǐng)域特定語(yǔ)言
集成要比編寫(xiě)的要經(jīng)常讀得多..與代碼相同。 因此,就像您渴望編寫(xiě)具有短函數(shù),描述性變量,適當(dāng)級(jí)別的數(shù)據(jù)隱藏等的精美代碼一樣,集成項(xiàng)目的編碼也是如此,但將其帶入了一個(gè)新的高度。 您想要對(duì)其進(jìn)行編碼,以便您可以閱讀并理解它。 盡管使用了集成代碼,但是即使您的代碼編寫(xiě)得井井有條,“正在集成的內(nèi)容”的全部含義和意圖最終仍會(huì)丟失在成堆的代碼中。 您可以利用集成抽象庫(kù),但是盡管它們達(dá)到了上述目的,但您想要的是清楚地回答“正在集成什么”。
Apache Camel提出了一種領(lǐng)域特定語(yǔ)言 ,我相信這是兩個(gè)項(xiàng)目之間的重要區(qū)別。 使用DSL,即使面對(duì)中等到復(fù)雜的集成,其他項(xiàng)目也開(kāi)始變得不清楚,您可以非常簡(jiǎn)潔明了地表達(dá)“正在集成的內(nèi)容”。 Apache Camel 以Java(我最喜歡的),Spring XML,Scala,Blueprint-OSGI,Groovy ..以及其價(jià)值(甚至是Kotlin)提供DSL。
使用DSL,您可以使用“ from”,“ split”,“ choice”和“ to”之類(lèi)的結(jié)構(gòu)來(lái)構(gòu)建集成“ Routes”。 這些使您可以用通用語(yǔ)言指定“集成正在做什么”。
當(dāng)我使用Spring Integration時(shí),他們沒(méi)有DSL。 您使用Spring XML直接處理了通道和組件(管道和過(guò)濾器),而通道是主要的抽象。 他們當(dāng)時(shí)在Scala DSL上工作,但是盡管我很喜歡Scala,它仍然沒(méi)有得到廣泛使用,因此出于在通用語(yǔ)言或XML集成項(xiàng)目中使用它的目的,沒(méi)有太多選擇。 基本上,您將端點(diǎn)(如jms-gateway或http-gateway)與通道連接在一起,并將通道的另一端連接到EIP(如Splitter或Router)。 但是對(duì)于要連接的每個(gè)組件,您還必須注意所使用的通道是什么,輸入是什么,輸出是什么。
并且一旦您的項(xiàng)目開(kāi)始增長(zhǎng),您就會(huì)發(fā)現(xiàn)通道對(duì)象激增。 最終稀釋了集成的含義。
例如,看一下Cafe Spring Integration Example 。 這個(gè)例子并不是很復(fù)雜,但是它說(shuō)明了我遇到的問(wèn)題。 想象一下在許多Spring上下文文件中拆分通道和組件,您會(huì)看到它如何變得非常混亂。
這是使用Apache Camel實(shí)現(xiàn)完全相同的示例的方法:
當(dāng)然,我不希望人們能夠在不了解或未使用每個(gè)相應(yīng)庫(kù)的情況下準(zhǔn)確掌握每個(gè)示例的工作,但是毫無(wú)疑問(wèn),我發(fā)現(xiàn)閱讀以駱駝式DSL表示的富有表現(xiàn)力的DSL更容易。與嘗試解釋所有通道的SI路徑/流量。 這使我更接近“此集成的功能”,而不會(huì)為細(xì)節(jié)所困擾。
測(cè)試中
編寫(xiě)集成流程的另一個(gè)非常重要的部分是測(cè)試。 我不會(huì)像往常一樣大聲疾呼,如果不測(cè)試代碼,你會(huì)是個(gè)傻瓜,但是如果不測(cè)試集成,甚至?xí)颖丁?他們所能達(dá)到的復(fù)雜程度以及所涉及的中介,都需要驗(yàn)證其是否有效!!
當(dāng)時(shí),Spring Integration沒(méi)有專(zhuān)門(mén)用于測(cè)試路由的良好實(shí)踐。 大概是因?yàn)樗麄円呀?jīng)有一個(gè)針對(duì)Spring本身的通用測(cè)試框架 。 您可以肯定地做到這一點(diǎn),因?yàn)槲覀兌剂?xí)慣于使用Spring編寫(xiě)單元測(cè)試或集成測(cè)試,并使用EasyMock或Mockito模擬合作者 ,對(duì)嗎? 而且,如果您需要任何額外的功能,則必須自己構(gòu)建它們。
但是,有了Apache Camel,就可以立即使用豐富的測(cè)試支持,并且可以很容易地使用它來(lái)鼓勵(lì)測(cè)試您的路線。 Camel的測(cè)試框架建立在Spring Test的某些功能之上,因此最終成為兩全其美。 例如,您可以模擬會(huì)影響實(shí)時(shí)系統(tǒng)的路由部分,并專(zhuān)注于路由和中介功能。 您可以像使用Mockito一樣設(shè)置期望和斷言行為,但是它內(nèi)置在庫(kù)中并添加了其他功能。 我的同事David Valeri擁有出色的測(cè)試和調(diào)試博客,以及他在CamelOne上的演講
例如,在以下代碼段中,我們可以斷言在5000ms的時(shí)間內(nèi)在模擬端點(diǎn)上收到了兩條消息:
您甚至可以通過(guò)應(yīng)用AOP建議來(lái)模擬實(shí)時(shí)端點(diǎn),如下所示:
除了模擬組件之外,如果您在執(zhí)行OSGI時(shí)無(wú)需部署到容器,您還可以獲得協(xié)助測(cè)試Blueprint XML的功能,可以使用DataSet組件進(jìn)行浸泡測(cè)試或壓力測(cè)試,以及許多其他復(fù)雜的測(cè)試方案。
查看這些鏈接以獲取更多信息:
- 端點(diǎn)測(cè)試:數(shù)據(jù)集
- 端點(diǎn)測(cè)試:模擬
- 端點(diǎn)測(cè)試:測(cè)試
- 淘汰實(shí)時(shí)技術(shù)
- 駱駝測(cè)試
- 駱駝彈簧測(cè)試
- 藍(lán)圖測(cè)試
社區(qū)
最后,但同樣重要的是,我想指出的是,Apache Camel擁有一個(gè)充滿(mǎn)活力的多元化社區(qū),由來(lái)自世界各地的不同公司的不同項(xiàng)目的參與者組成。 在寫(xiě)到郵件列表或提交JIRA之后,幾分鐘之內(nèi)就可以得到回復(fù)。 您希望在非營(yíng)利性的核心開(kāi)源基金會(huì)(如Apache Software Foundation )中找到的同一生態(tài)系統(tǒng)與在其他項(xiàng)目中發(fā)現(xiàn)的完全不同。
我當(dāng)然不是說(shuō)Spring Integration論壇和JIRA并不活躍,但是我認(rèn)為Apache Camel項(xiàng)目中非項(xiàng)目或公司(VMWare / SpringSource)人員的活動(dòng)更多。 在我看來(lái),這傾向于培養(yǎng)更多的創(chuàng)造力,更多的外部人做出貢獻(xiàn)并使項(xiàng)目變得更好等。這是開(kāi)源和開(kāi)放社區(qū)發(fā)展的核心。 當(dāng)然會(huì)有更多的爭(zhēng)論,但最終結(jié)果是非常積極的。
在有關(guān)Spring Integration與Camel的其他一些文章中,作者指出Camel比Spring Integration具有更多的組件。 這里有一個(gè)更大的連接選項(xiàng)方面的觀點(diǎn),但我認(rèn)為更重要的一點(diǎn)是,其中許多是由非核心的Camel開(kāi)發(fā)人員貢獻(xiàn)的。 另外,您可以嘗試在github上進(jìn)行快速搜索,您會(huì)發(fā)現(xiàn)人們編寫(xiě)的Camel組件甚至還沒(méi)有帶到Apache社區(qū),但是您仍然可以利用。
您應(yīng)該使用哪一個(gè)?
因此,我在這里幾乎永無(wú)休止的散文中發(fā)表了自己的見(jiàn)解。但是,我鼓勵(lì)您檢查兩個(gè)項(xiàng)目并自己決定。 其他人將有不同的經(jīng)驗(yàn)和意見(jiàn),并且在某種程度上將在決定下一個(gè)集成項(xiàng)目中使用哪個(gè)方面起很大作用。
以上是我的很多看法。 但是,如果我遺漏了某些內(nèi)容或歪曲了某些內(nèi)容,請(qǐng)發(fā)表評(píng)論并糾正我!
翻譯自: https://www.javacodegeeks.com/2013/10/light-weight-open-source-integration-apache-camel-or-spring-integration.html
總結(jié)
以上是生活随笔為你收集整理的轻量级的开源集成:Apache Camel还是Spring集成?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑桌面壁纸吓人的(好看又恐怖的壁纸 吓
- 下一篇: 为您的下一个基于Spring的应用程序考