hystrix应用 博客
Apache Camel是一个成熟的集成库(到现在已有9年的历史了),它实现了Enterprise Integration Patterns一书中的所有模式。 但是Camel不仅是EIP实现库,它还是一个不断发展,添加新模式并适应行业变化的现代框架。 除了每个版本中添加了数十个连接器之外,Camel还与Java语言新版本本身和其他Java框架提供的新功能紧密结合。 随着时间的流逝,诸如SOA和ESB之类的某些架构样式逐渐失去吸引力,而诸如REST之类的新架构样式则使微服务受到欢迎。
为了使开发人员能够利用这些新趋势进行集成,Camel通过添加诸如REST DSL之类的新DSL和诸如Circuit Breaker之类的新模式以及诸如Spring Boot之类的组件来做出响应。 这还不是全部,我们还远远没有完成。 借助Docker容器和Kubernetes等技术,IT行业现在正以更快的速度向前发展,而Camel也在不断发展以减轻开发人员的负担。 要了解某种工具,您需要在Docker和Kubernetes上开发和运行应用程序,请查看Fabric8项目,特别是工具,例如Docker Maven插件,Kubernetes CDI扩展,Kubernetes Java客户端,针对Kubernetes的Arquilian测试等。大量有趣的技术将带给您激动人心的时代,下面让我们看一下其中的一种:骆驼和基于Hystrix的断路器。
两座骆驼断路器,该选择哪一个?
两年前,当我第一次阅读Michael Nygard的Release It时 ,我无法停止在Camel中实现Circuit Breaker模式 。 通常,我会根据实际客户的需求来贡献自己的力量,但是断路器模式是如此优雅,我不得不这样做。 为了以非介入方式实现它,我将其添加为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自我描述:如果模拟:结果端点抛出的MyCustomExceptions数量达到阈值数量,则CircuitBreaker进入打开状态并开始拒绝所有请求。 1000毫秒后,它将进入halfOpenAfter状态,并且在此状态下的第一个请求的结果将其下一个状态定义为已关闭或已打开。 您可以想象这是CircuitBreker的最简单的实现,但仍然有用。
从那时起,Microseservices体系结构变得越来越流行,Circuit Breaker Pattern及其java实现Hystrix也是如此 。 劳尔·克里帕拉尼(RaúlKripalani)在某个时候开始在骆驼(Camel)实施Hystrix,并将所有基础工作落实到位,但是随着时间的流逝,它失去了动力。 然后一次又一次地看到来自不同客户的相同请求,我接下了继电器并继续进行工作,并将Hystrix组件推到了Camel。 看到社区的反馈,它仍然没有它应有的优雅。 然后, Claus介入并通过将Hystrix转变为EIP(而非组件)而使其成为Camel DSL的一部分。 那么现在在骆驼中创建基于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}");}
}
在上面的示例中,您几乎看不到断路器的所有可用选项,要查看所有这些选项,请检出官方文档并尝试放置在示例中的 Claus应用程序。
根据此示例,您可能认为Hystrix是Camel核心的一部分,但事实并非如此。 骆驼核心仍然是这样,没有第三方库的依赖。 如果要使用基于Hystrix的断路器,则需要像其他任何非核心组件一样,将camel-hystrix依赖项添加到依赖项中,并使其在运行时可用。
快速失败,后备,隔板,超时等
Hystrix库实现的不仅仅是断路器模式。 它也可以进行批量处理,请求缓存,超时,请求折叠等。Camel中的实现不支持请求折叠和缓存,因为这些已经使用Camel中可用的其他模式和组件完成了。 Camel中的请求折叠可以使用Aggregator EIP完成,而缓存可以使用Redis,Inifinspan,Hazelcast等缓存组件完成。Camel中的Hystrix DSL提供了Hystrix支持的大约30种配置选项,还通过JMX和/或公开了指标Hystrix仪表板的 REST。
最后一点,不要忘记创建一个真正的弹性应用程序,您需要的不仅仅是Hystrix。 Hystrix将在线程池级别进行批量处理,但是如果您不在进程,主机和物理计算机级别应用相同的原理,那还不够。 要创建一个可恢复的分布式系统,您还需要使用Retry,Throttleing,Timeout…和其他好的技巧,我在Camel Design Patterns一书中已经描述了其中的一些技巧。
要了解新模式,请查看示例 ,然后开始使用Hystrix保护基于Camel的微服务。
翻译自: https://www.javacodegeeks.com/2016/06/create-resilient-camel-applications-hystrix-dsl.html
hystrix应用 博客