标签:相同 class sim tor 同步 错误 elastic 开课 客户
1:Hystrix简介复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。 对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。
这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。1.2:Hystrix是什么
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
1.3:Hystrix能干什么
Hystrix能做很多事情,主要有:
- 服务隔离、降级、熔断、限流、快速失败
- 请求合并、请求缓存
- 接近实时的监控
加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
官方示例https://github.com/Netflix/Hystrix/wiki/How-To-Use
两者主要区别是:
1:前者的命令逻辑写在run();后者的命令逻辑写在construct()
2:前者的run()是由新创建的线程执行;后者的construct()是由调用程序线程执行
3:前者一个实例只能向调用程序发送单条数据,比如上面例子中run()只能返回一个String结果;后者一个实例可以顺序发送多条数据,可以顺序调用多个onNext(),便实现了向调用程序发送多条数据
execute()、queue()、observe()、toObservable()这4个方法用来触发执行run()/construct(),一个实例只能执行一次这4个方法,注意HystrixObservableCommand没有execute()和queue()。
默认情况下,命令名是从类名派生的:getClass().getSimpleName();
要明确地定义名字,通过HystrixCommand或HystrixObservableCommand构造函数传入,例如:
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(" HelloWorld1"))
.andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld"))
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("HelloWorldPool")));
虽然?HystrixCommandGroupKey?可以起到隔离线程池的作用,但是无法起到对线程池进行精细配置的作用。所以这里就需要线程池进行配置,例如:
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("HelloWorld1"))?
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("MyThreadPool"))
.andThreadPoolPropertiesDefaults(
.HystrixThreadPoolProperties.Setter()
.withCoreSize(20)
.withKeepAliveTimeMinutes(1)
.withMaxQueueSize(-1)
)
.andCommandPropertiesDefaults(
HystrixCommandProperties.Setter()
.withExecutionTimeoutInMilliseconds(100)
)
编写完?自己的Command?之后,使用的时候每次都需要 new 一个新对象,再调用?execute()?方法。注意,不要调用?run()?方法,否则熔断、隔离等功能是不生效的
run()里面抛出的HystrixBadRequestException只用做计数,方法抛出的所有其它异常都作为失败,触发getFallback()和断路器逻辑。
你可以包装你想要抛出的异常,HystrixBadRequestException适用的情况,如举报非法参数或非系统故障,不会计入失败的指标,不会触发回退逻辑。
快速失败就是指没有重写getFallback,遇到异常后直接抛出,程序停止运行
所谓降级,就是指在在Hystrix执行非核心链路功能失败的情况下,我们如何处理,比如我们返回默认值等。触发时会调用fallback设置的降级方法,在降级方法中,可以设置默认的降级返回数据。
使用fallback机制很简单,继承HystrixCommand只需重写getFallback(),继承HystrixObservableCommand只需重写resumeWithFallback()。
如下情况将会启动回退
Hystrix支持将一个请求结果缓存起来,下一个具有相同key的请求将直接从缓存中取出结果,减少请求开销。使用方式如下:
1:通过getCacheKey()在一个HystrixCommand或一个HystrixObservableCommand对象上实现该方法来启用请求缓存
2:另外要求这多个请求必须在同一个上下文。通过HystrixRequestContext.initializeContext()和context.shutdown()可以构建一个context,这两条语句间的所有请求都处于同一个context
3:通过isResponseFromCache()可检查返回结果是否来自缓存
Hystrix支持N个请求自动合并为一个请求,这将使多次网络交互变成一次,极大节省开销。注意一点,两个请求能自动合并的前提是两者足够“近”,即两者启动执行的间隔时长要足够小,默认为10ms,即超过10ms将不自动合并。
Hystrix支持2种请求合并方式:请求范围和全局范围。这是在collapser构造中配置的,默认为request-scoped。请求范围是指在一个HystrixRequestContexts上下文中的请求;全局范围指垮HystrixRequestContexts的请求。
cc老师2020年高级架构师系统培训课程7月6号正式开课,现在618活动,限时折扣。至少300学时录播课程,60小时直播课,内容包含最新架构体系,现主流的架构,以及即时更新最新的技术,从理论到实践,以及如何解决问题。面试常用的 Netty,Redis,Kafka,Zookeeper,Dubbo, Nginx + openResty + kong + Lua, ElasticSearch等技术都深入源码层级,轻松掌握这些技术,从容应对面试。对于有想跟我一样有着像提高自身技术的同学,课程的详情都在私塾的首页详细说明了,感兴趣的小伙伴,可以一起去 【私塾在线?】 学习
SpringCloud- 第四篇 Hystrix快速上手(一)
标签:相同 class sim tor 同步 错误 elastic 开课 客户
原文地址:https://blog.51cto.com/14846948/2508461