微服务架构中组件的原理和分析(hystrix)

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创建。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值