使用Hystrix DSL创建弹性骆驼应用程序
Apache Camel是一個成熟的集成庫(到現(xiàn)在已有9年的歷史了),它實現(xiàn)了Enterprise Integration Patterns一書中的所有模式。 但是Camel不僅是EIP實現(xiàn)庫,它還是一個不斷發(fā)展,添加新模式并適應(yīng)行業(yè)變化的現(xiàn)代框架。 除了在每個版本中添加數(shù)十個連接器之外,Camel還與Java語言新版本本身和其他Java框架提供的新功能緊密結(jié)合。 隨著時間的流逝,諸如SOA和ESB之類的某些架構(gòu)樣式逐漸失去吸引力,而諸如REST之類的新架構(gòu)樣式使微服務(wù)變得流行。
為了使開發(fā)人員能夠利用這些新趨勢進行集成,Camel通過添加新的DSL(例如REST DSL)和新模式(例如Circuit Breaker)以及組件(例如Spring Boot)來做出響應(yīng)。 這還不是全部,我們還遠遠沒有完成。 借助Docker容器和Kubernetes之類的技術(shù),IT行業(yè)現(xiàn)在的發(fā)展速度甚至更快,Camel也正在不斷發(fā)展以減輕開發(fā)人員的負擔(dān)。 要了解某種工具,您需要在Docker和Kubernetes上開發(fā)和運行應(yīng)用程序,請查看Fabric8項目,特別是工具,例如Docker Maven插件,Kubernetes CDI擴展,Kubernetes Java客戶端,針對Kubernetes的Arquilian測試等。大量先進技術(shù)帶來的激動人心的時代即將來臨,讓我們看一下其中的一種:駱駝和基于Hystrix的斷路器。
兩個駱駝斷路器,該選擇哪個?
兩年前,當(dāng)我第一次閱讀Michael Nygard的Release It時 ,我無法停止在Camel中實現(xiàn)Circuit Breaker模式 。 通常,我會根據(jù)真正的客戶需求來貢獻自己的力量,但是斷路器模式是如此優(yōu)雅,我不得不這樣做。 為了以非介入方式實現(xiàn)它,我將其添加為Camel負載均衡器策略。 這很簡單:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"><route><from uri="direct:start"/><loadBalance><circuitBreaker threshold="2" halfOpenAfter="1000"><exception>MyCustomException</exception></circuitBreaker><to uri="mock:result"/></loadBalance></route> </camelContext>上面的DSL是自我描述的:如果模擬:結(jié)果端點拋出的MyCustomExceptions數(shù)量達到閾值,CircuitBreaker進入打開狀態(tài)并開始拒絕所有請求。 1000毫秒后,它將進入HalfOpenAfter狀態(tài),并且在此狀態(tài)下的第一個請求的結(jié)果將其下一個狀態(tài)定義為已關(guān)閉或已打開。 您可以想象這是CircuitBreker的最簡單的實現(xiàn),但仍然有用。
從那時起,Microseservices體系結(jié)構(gòu)變得越來越流行,Circuit Breaker Pattern及其java實現(xiàn)Hystrix也是如此 。 勞爾·克里帕拉尼(RaúlKripalani)在某個時候開始在駱駝(Camel)實施Hystrix,并將所有基礎(chǔ)工作都準(zhǔn)備就緒,但隨著時間的流逝,它失去了動力。 然后一次又一次地看到來自不同客戶的相同請求,我接下了繼電器并繼續(xù)工作,并將Hystrix組件推到了Camel。 看到社區(qū)的反饋,它仍然沒有它應(yīng)有的優(yōu)雅。 然后, Claus介入并通過將Hystrix轉(zhuǎn)變?yōu)镋IP(而不是組件)而使其成為駱駝DSL的一部分。 那么,現(xiàn)在在駱駝中創(chuàng)建基于Hystrix的斷路器是什么樣子呢?
public class ClientRoute extends RouteBuilder {@Overridepublic void configure() {from("timer:trigger?period=1s").log(" Client request: ${body}").hystrix().to("http://localhost:9090/service1")// use onFallback() to provide a repsonse message immediately: .transform().simple("Fallback ${body}")// use onFallbackViaNetwork() when there is a 2nd service call.onFallbackViaNetwork().to("http://localhost:7070/service2").end().log("Client response: ${body}");} }在上面的示例中,您只能看到斷路器的少數(shù)可用選項,要查看所有這些選項,請檢出官方文檔并試用放置在示例中的 Claus應(yīng)用程序。
根據(jù)此示例,您可能認為Hystrix是Camel核心的一部分,但事實并非如此。 駱駝核心仍然是這樣,沒有第三方庫的依賴。 如果要使用基于Hystrix的斷路器,則需要像其他任何非核心組件一樣,將camel-hystrix依賴項添加到依賴項中,并使其在運行時可用。
快速失敗,后備,隔板,超時等
Hystrix庫實現(xiàn)的不僅僅是斷路器模式。 它也可以進行批量處理,請求緩存,超時,請求折疊等。Camel中的實現(xiàn)不支持請求折疊和緩存,因為這些已經(jīng)使用Camel中可用的其他模式和組件完成了。 Camel中的請求折疊可以使用Aggregator EIP完成,而緩存可以使用Redis,Inifinspan,Hazelcast等緩存組件完成。Camel中的Hystrix DSL提供了Hystrix支持的大約30種配置選項,還通過JMX和/或公開了指標(biāo)用于Hystrix儀表板的 REST。
最后一點,不要忘記創(chuàng)建一個真正的彈性應(yīng)用程序,您需要的不僅僅是Hystrix。 Hystrix將在線程池級別進行批量處理,但是如果您不在進程,主機和物理計算機級別應(yīng)用相同的原理,那還不夠。 要創(chuàng)建一個可恢復(fù)的分布式系統(tǒng),您還需要使用Retry,Throttleing,Timeout…和其他好的技巧,我在Camel Design Patterns一書中已經(jīng)描述了其中的一些技巧。
要了解新模式,請查看示例 ,然后開始使用Hystrix保護基于Camel的微服務(wù)。
翻譯自: https://www.javacodegeeks.com/2016/06/create-resilient-camel-applications-hystrix-dsl.html
總結(jié)
以上是生活随笔為你收集整理的使用Hystrix DSL创建弹性骆驼应用程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: klf是什么意思 klf是哪种方言的发音
- 下一篇: 使用CLI扩展和重新平衡Couchbas