zoukankan      html  css  js  c++  java
  • Hystrix入门执行过程

    netflix-hystrix团队开发了hystrix-javanica,使用流行的java注解以及函数式编程,来替代hystrix枯燥的编程方法.

    其主要是HystrixCommand注解的使用.
    /**
     *  Sync Execution
     */
    @HystrixCommand(fallback="syncFallback")
    public List<User> findUsers(User param){
        return userRepository.find(param);
    }
    /**
     * Aysync Execution
     * 
     */
    @HystrixCommand(fallback="asyncFallback")
    public Future<List<User>> findUsers(User param){
        return new AsyncResult<List<User>>(){
             public List<User> invoke() {return userRepository.find(param)}
        };
    }
    Future<List<User>> future = userService.findUser(param);
    List<User> users = funture.get();
    /**
     * Reactive Execution
     */
    @HystrixCommand
    public Observable<List<User>> findUsers(User param){
        return new Observer.create(subscriber->{
            if(!subscriber.isUnscribed(){
                subscriber.onNext(userRepository.find(param);
                subscriber.onCompleted ();
            }
        })
    }
    Observable obsevable = userService.findUser(param);
    List<User> users = observable.toBlocking().single();
    /**
      *  降级方法必须的参数应该与被执行的方法参数一致,否则hystrix不会查询到降级方法,会直接抛出异常
      *  降级方法也可以同步异步执行
      /
    @HystrixCommand(fallback="defaultFallback")
    private List<User> syncFallback(User param){
         return Lists.newArrayList(new User("zhangsan",23));
    }
    /**
      *  Async Execution Command Async Fallback
      *  Throwable 参数是可选的  
      *  
      /
    @HystrixCommand(fallback="defaultFallback")
    private Future<List<User>> async(User param,Throwable e){
        return new AysncResult<List<User>>(){
             public List<User> invoke() { return Lists.newArrayLists(new User("default",22))}
        }
    }
    降级(fallback)方法也可以被降级
    private List<User> defaultFallback(User param){
        return null;
    }

    忽略元数据末尾回到原数据开始处

    1.hystrixCommand 有三种执行方式,分别是同步执行,异步执行和Reactive execution(没翻译出来).
    其工作方式如上图所示(netflix最新提供),在hystrixCommand执行时,需要提前声明是哪种执行方式
    2.hystrix 会选择提前设定好的方式执行HystrixCommand
    3.如果你使用了Request Cache,并且这个请求的响应刚好在这个缓存中, 这个响应就会立即返回Observe对象.
    4.如果断路器是打开状态,hystrixCommand就不会执行,而会直接执行降级(fallback)方法.
    5.如果hystrix的线程池或者队列或者是信号量是满负荷,hystrixCommand将不会执行,直接执行降级(fallback)方法.
    6.执行我们所编写的业务逻辑.并且判断是否执行成功.超时. 如果执行分业务逻辑既没有抛出异常 也没有超时,则直接返回成功的执行结果
    7. 如果执行失败或者执行超时,则需要hystrix降级策略,并且上报断路器,用于统计和计算断路器的状态.
    8.通过上面的流程 可以总结出 hystrix 触发降级策略主要有以下几个原因:执行业务逻辑时抛出了非HystrixBadRequestException异常,
    业务逻辑执行超时,断路器开启直接阻断以及线程池/信号量满负荷直接拒绝.
    当一个hystrixCommand没有给出降级策略时,直接抛出异常
    如果降级逻辑失败,则直接抛出异常或者执行降级的降级逻辑.
    9.执行成功,返回执行成功的结果. 对于返回执行成功接结果hystrix做出了如下图的执行策略
    执行成功后会返回一个Observer对象, 然后根据设定的执行策略,再返回结果

    HystrixCommand 是怎样打开一个断路器?

    hystrixCommand通过四个参数来确定是否需要开启断路器
    circuitBreakerRequestVolumeThreshold 
    metricsRollingStatisticalWindowBuckets
    metricsRollingStatisticalWindow
    circuitBreakerErrorThresholdPercentage

    hystrixCommand 对于每个断路器默认维护10个bucket ,通过 metricsRollingStatisticalWindowBuckets参数来设置,

    metricsRollingStatisticalWindow的默认值是10秒,对于每个bucket分配1秒
    circuitBreakerRequestVolumeThreshold 的默认值是20 

    这几个参数的意思是10秒钟之内必须统计出20次请求的失败,超时, 或者线程池或信号量拒绝的次数

    circuitBreakerErrorThresholdPercentage 这个参数的意思是失败率的百分比阈值,如果失败率超过了这个比率,断路器就会被打开.

    HystrixCommand 怎样关闭一个断路器?

    当断路器打开一段时间后,就会进入半开(Half-Open State)状态,通过circuitBreakerSleepWindowInMilliseconds来设置这个时间

    当一个请求通过这个断路器时,断路器就不会阻断这个请求而会直接将这个请求通过,如果这个请求仍然是失败的,那么断路器会直接回到打开状态.

    如果这个请求是成功的,断路器就会关闭.并且开始进行下一次统计.

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    如何在一个类中定义一些常量,每个对象都可以方便访问这些常量而不用重新构造?
    __init__函数一定需要吗
    python 面向对象编程
    Linux 操作系统原理 — mmap() 进程虚拟内存映射
    在VSCode中刷leetcode
    MIMO 天线技术
  • 原文地址:https://www.cnblogs.com/xmanblue/p/6803063.html
Copyright © 2011-2022 走看看