zoukankan      html  css  js  c++  java
  • Hystrix

    Hystrix的三个重要概念:

    服务降级.

      说明:服务器忙,请稍候再试,不让客户端等待并立刻返回一个友好提示,fallback

      降级条件:超时,运行异常,线程池/信号量打满也会导致服务降级,熔断触发

    服务熔断

      说明:类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示

      概述:熔断机制是应对雪崩效应的一种微服务链路保护机制。当程序链路的某个微服务出错不可用或者相应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。

          当检测到该节点微服务响应正常后,恢复调用链路。当失败的调用达到一定阈值时缺省是5秒内20次调用失败,就会启动熔断机制,熔断机制的注解是@HystrixCommand.

    服务限流

      说明:秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行

    总结

      感觉降级功能单一,阈值参数单一

      熔断可以自我恢复,且熔断条件参数全面

    服务降级

      就是在触发降级条件时,返回一个兜底的方法,不至于让用户死等。

      如下图fallbackMethod是兜底方法,value是超时时间,单位是毫秒,只要在方法上加上这两注解,降级服务就开启了,图中的TimeUnit.seconds.sleep是hutool包下的延时启动

    ·  

       注意:由于写一个方法,就得在方法上做服务降级注解操作,会造成代码臃肿,降低可读性

          所以我们需要将同用化的方法默认的去指派兜底方法:@DefaultProperties(defaultFallback="兜底方法")

          ps:除了个别重要核心业务有专属降级兜底方法,其他普通的都通过@DefaultProperties(defaultFallback="兜底方法")。

    服务熔断

    熔断器(断路器)工作原理:

    • 假设请求量达到一定的阈值(HystrixCommandProperties.circuitBreakerRequestVolumeThreshold())
    • 假设错误百分比超过阈值错误百分比 (HystrixCommandProperties.circuitBreakerErrorThresholdPercentage())
    • 满足其一,打开断路器。
    • 当断路器打开,短路所有进过该短路器的请求。
    • 一段时间后(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()), 允许一个请求通过(此时短路器为半开状态),如果该请求成功,短路其设置为打开,否则将短路器设置为关闭,从1开始再进行判断。

    熔断操作的相关注解参数阈值:

    //服务熔断
    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),  //是否开启断路器
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),   //请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),  //时间范围
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失败率达到多少后跳闸
    })

    Hystrix工作流程

    官方给的流程图是这样的:

     转换成我们自己的流程图是这样的:

    1、  初始化,有两种方式初始化一个Hystrix命令,通过new HystrixCommand或者new HystrixObservableCommand创建,使用服务实例和请求服务需要的参数来构造一个Hystrix命令。

      如果通过注解的方式使用HystrixCommand,那么在请求被拦截时,将会在HystrixCommandAspect中创建Command对象。

    2、  成功创建Hystrix后,有四种方法执行实际的命令并得到返回结果。这里Hystrix还使用了响应式编程来设计。

      对于使用HystrixCommand创建命令的实例,执行execute或者queue;而对于使用HystrixObservableCommand创建命令的实例,执行observe或者toObservable方法,可以请求服务然后得到执行结果。这四个方法的特性是:

    execute - 会阻塞,然后返回依赖服务的结果
    queue - 返回一个Future,然后可以通过get方法获得以来服务的结果。
    observe - 订阅包含依赖服务响应结果的订阅器,当有结果时返回一个订阅器。
    toObservable - 返回一个订阅器,当订阅它时,会知晓Hystrix命令并返回结果。

    3、当前Command是否启用缓存功能(即hystrix.command.default.requestCache.enabled是否为true),启用缓存,并且缓存命中时,立即返回;当返回数据后丢入缓存中去。。

    4、如果第三步没有缓存,Hystrix会检查它的熔断器,如果此时熔断器开启了,那么Hystrix不会执行命令,直接返回降级结果。

    5、如果信号或者线程池拒绝请求,返回降级结果。

    6、Hystrix通过调用HystrixCommand.run()或者HystrixObservableCommand.construct()方法来触发调用外部服务的操作,如果超时或者失败,返回降级结果。 如果run或者construct方法超过了命令定义的超时值,线程会抛出TimeoutException,

    此时Hystrix捕捉到异常,就会忽略run或construct方法的返回值,进入fallback。

    注意:没有任何方式可以阻止延迟的线程停止工作,在JVM中,Hystrix可以做到最好的就是抛出一个InterruptedException,如果Hystrix封装的服务没有捕获InterruptedException,Hystrix线程池中的线程会继续它的工作。



    7、不管请求如何进行:成功、失败、超时、熔断,Hystrix都会上报健康状态到熔断器,记录服务状态,用于判断是否启动/半启动熔断器。

    8、fallback,进行降级操作。

    fallback流程我们通常也称为:服务降级。

    1) 说明

      a) 引起服务降级的场景

      第4步,当前命令处于“熔断/短路”状态,断路器是打开时。

      第5步,当前命令的线程池、请求队列、信号量被占满时。

      第6步,HystrixObservableCommand#construct()或HystrixCommand#run()抛出异常的时候。

    总结:会触发回退操作的条件:超时,运行异常,服务宕机(线程池、请求队列、信号量被占满时),熔断触发。

    对于每一个Hystrix命令,都需要覆盖getFallback方法,在fallback函数中实现降级的方案,如果需要在fallback中使用网络调用,那么需要通过另一个HystrixCommand或者HystrixObservableCommand。

    在HystrixCommand中是实现getFallback方法,在HystrixObservableCommand中,是实现sumeWithFallback方法,如果没有实现fallback方法,或者fallback方法抛出了异常,Hystrix还是会返回一个Observerable,

    但是不会返回内容并通过一个onError通知来马上终止。通过onError通知,发生异常的会被返回Hystrix的调用者。尽量不要写出可能会抛出异常的fallback实现。

    9、如果一切正常,那么Hystrix会发送成功的结果到Observable,程序再去获取。

     

     


  • 相关阅读:
    RABC权限管理
    七牛云上传
    支付宝沙箱支付(Django端)超适合小白哦~
    ModelSerialzier + ModelViewSet基础使用
    微博三方登录
    Celery梳理
    ios 动画
    ios 贝塞尔动画
    ios 贝塞尔
    ios Masonry 开发细节
  • 原文地址:https://www.cnblogs.com/shuai666/p/14743619.html
Copyright © 2011-2022 走看看