简介
在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也是很正常的。
Hystrix可以让我们在分布式系统中对服务间的调用进行控制,加入一些调用延迟或者依赖故障的容错机制.
Hystrix通过将依赖服务进行资源隔离,进而组织某个依赖服务出现故障的时候,这种故障在整个系统所有的依赖服务调用中进行蔓延,同时Hystrix还提供故障时的fallback降级机制
总而言之,Hystrix通过这些方法帮助我们提升分布式系统的可用性和稳定性
作用
1.隔离:资源隔离,对每个feign 服务远程调用 都创建不同的线程池资源,来保证原服务线程不会因为远程调用的服务挂掉全部卡住导致自己挂掉,所以每个远程服务都创建自己的线程池,既不影响原服务状态也不影响原服务调用其他远程服务。 ------让你的系统里,某一块东西,在故障的情况下,不会耗尽系统所有的资源
2.熔断:远程调用其他服务卡住时,直接终止其他请求线程继续调用这个服务,避免资源消耗
3.降级:远程调用不可用时可以使用备份方案弥补或者备选策略来优化服务体验
4.限流:限制服务请求并发量,避免高并发请求使服务崩溃
5.监控:支持近实时的监控、报警以及运维操作 (hystrix turbin可视化分布式系统监控)
优点:
(1)任何一个依赖服务都可以被隔离在自己的线程池内,即使自己的线程池资源填满了,也不会影响任何其他的服务调用
(2)服务可以随时引入一个新的依赖服务,因为即使这个新的依赖服务有问题,也不会影响其他任何服务的调用
缺点:
(1)线程池机制最大的缺点就是增加了cpu的开销 ,除了tomcat本身的调用线程之外,还有hystrix自己管理的线程池,并且会有线程上下文切换
信号量 和 线程池
默认使用了线程池模式
信号量:接收请求和执行下游依赖在同一个线程内完成,不存在线程上下文切换所带来的性能开销。
应用场景:数百个实例需要隔离,此时用线程池做隔离开销过大。同步的请求,一般用在内存资源调用。适合返回比较快的。
可以用来限流和削峰。一旦请求数量超过了semephore限定的数量之后,就会立即开启限流
线程池:用户请求会被提交到各自的线程池中执行,把执行每个下游服务的线程分离,从而达到资源隔离的作用。当线程池来不及处理并且请求队列塞满时,新进来的请求将快速失败,可以避免依赖问题扩散。
应用场景:依赖其他服务,多层级调用,返回比较久或者不可控,需要资源隔离。
hystrix 高级特性
1.request collapser 请求合并技术:其实对于高并发的访问来说,是可以提升性能的
hystrix注意点
单独配置线程池:根据@FeignClient里的value默认就是hystrix的groupName
1.超时时间配置不能太长,因为线程池的线程 会把 tomcat 的线程也卡住,并发太高处理不够快,请求会堆积。然后线程不够用就会走降级
2.coreSize : 不用把所有线程的核心线程数都默认,因为有的请求频繁有些请求量少
3.maximumSize 设置线程池的最大大小,只有在设置allowMaximumSizeToDivergeFromCoreSize的时候才能生效
4.keepAliveTimeMinutes 设置保持存活的时间,单位是分钟,默认是1
hystrix配置
负载相关的配置
hystrix.threadpool.default.coreSize:线程池大小,默认10
hystrix.threadpool.default.maximumSize:线程池最大大小,默认10
hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize:是否允许动态调整线程数量,默认false,只有设置为true了,上面的maximumSize才有效
hystrix.threadpool.default.keepAliveTimeMinutes :默认是1,超出coreSize的线程,空闲1分钟后释放掉
hystrix.threadpool.default.maxQueueSize 默认-1,不能动态修改
hystrix.threadpool.default.queueSizeRejectionThreshold 可以动态修改,默认是5,先进入请求队列,然后再由线程池执行
hystrix.command.default.execution.isolation.strategy:隔离策略,默认Thread,可以选择Semaphore信号量
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:超时时间,默认1000ms
hystrix.command.default.execution.timeout.enabled:是否启用超时,默认ture
hystrix.command.default.execution.isolation.thread.interruptOnTimeout:超时的时候是否中断执行,默认true
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests:信号量隔离策略下,允许的最大并发请求数量,默认10
降级相关的属性
hystrix.command.default.fallback.enabled 默认true
熔断相关的属性
hystrix.command.default.circuitBreaker.enabled:是否启用熔断器默认true
hystrix.command.default.circuitBreaker.requestVolumeThreshold:10秒钟内,请求数量达到多少才能去尝试触发熔断,默认20
hystrix.command.default.circuitBreaker.errorThresholdPercentage:10秒钟内,请求数量达到20,同时异常比例达到50%,就会触发熔断,默认50
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds:触发熔断之后,5s内直接拒绝请求,走降级逻辑,5s后尝试half-open放过少量流量试着恢复,默认5000
hystrix.command.default.circuitBreaker.forceOpen:强制打开熔断器
hystrix.command.default.circuitBreaker.forceClosed:强制关闭熔断器
高阶特性相关的参数
hystrix.command.default.requestCache.enabled 默true
hystrix.command.default.requestLog.enabled 记录日志到HystrixRequestLog,默认true
hystrix.collapser.default.maxRequestsInBatch 单次批处理的最大请求数,达到该数量触发批处理,默认Integer.MAX_VALUE
hystrix.collapser.default.timerDelayInMilliseconds 触发批处理的延迟,也可以为创建批处理的时间+该值,默认10
hystrix.collapser.default.requestCache.enabled 是否对HystrixCollapser.execute() and HystrixCollapser.queue()的cache,默认true
hystrix执行时的8大流程步骤以及内部原理 :
断路器的触发:
1.异常占比超过了一定的阈值(一个时间段内的 超时,报错)
2.超过了限制的流量
feign与hystrix整合
feign和hystrix整合后 生成的代理对象 HystrixFeign
调用流程