hytrix:
处理过程:
hystrix 可以配置一个窗口期,比如10S,请求失败率,请求失败数,在这个窗口期内,失败或超时达到设置的比例或者数量会开启熔断机制,开启熔断机制后,访问会直接走fallback方法,经过另一个窗口期时间,可以配置,会将断路器设置成半闸模式,允许一个请求通过,如果成功,关闭断路器,失败的话,继续打开断路器,并等待下一个窗口期,继续开启半闸模式。
如果断路器未打开,也可能造成失败:
当请求进来时,判断完断路器的打开关闭后,下一步会进行判断 线程或者信号量是否满,这个可以配置hystrixCommand执行使用线程池还是信号量,如果线程数达到最大线程或者信号量满了,会执行fallback,否则,下一步判断执行是否失败或者是否超时,如果成功,返回信息,失败走fallback
信号量:就是使用请求线程 执行请求,是同步的,没有返回值,不能超时控制,有信号量并发的上限。好处是没有线程切换,不用创建线程池造成cpu额外的计算开销
线程池: 异步执行,可以自己配置线程池的大小,会有超时控制,有返回值
hytrix超时判断方法:
区别于线程池线程,会在创建一个ScheduledThreadPoolExecutor线程,延迟执行,延迟时间是设置的超时时间,线程池线程先执行完 ,会去修改一个信号量,取消延迟线程 执行,执行成功,如果延迟线程触发,会中断执行线程,抛出timeoutException异常,被onerror方法捕获,执行fallback方法。
ScheduledThreadPoolExecutor 可以指定延迟时间进行执行任务或者 每隔一段时间循环执行
//指定时延后调度执行任务
public ScheduledFuture<?> schedule(Runnable command,
long delay, TimeUnit unit);
//指定时延后调度执行任务
public <V> ScheduledFuture<V> schedule(Callable<V> callable,
long delay, TimeUnit unit);
//指定时延后开始执行任务,以后每隔period的时长再次执行该任务
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);
使用线程池隔离策略还是信号量 主要看:请求的服务的响应速率,如果可能超时,响应慢,使用线程池,如果非常快,不存在超时问题使用信号量。
启动原理:启动类中增加@EnableHystrix->EnableCircuitBreaker->EnableCircuitBreakerImportSelector 在这里注册了一个切面HystrixCommandAspect到容器中,切面的pointCut为HystrixCommand注解!
捕捉到所有注解方法,生成一个代理类放到spring 容器中。通过CommandMetaHolder创建。