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来设置这个时间

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

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

Hystrix入门执行过程的更多相关文章

  1. Android入门学习:Android 系统框架及应用程序执行过程

    Android基础知识学习 新手上路,还请多多帮助.由于初学,博客内容难免有不正确的地方,还请各位多多指教,相互学习! 主要内容: 1.Android层次架构及主要功能 2.Android编程模型,程 ...

  2. C C++ Java C# JS编译、执行过程的原理入门分析

    C.C++是典型的编译型编程语言,编译链接后,点击则可执行. JS,解释型脚本语言,则不需要进行编译,直接解释执行. Java和C#则是所谓的高级语言,编译执行的方式做了很多处理, 尤其是C#,VS编 ...

  3. JSP起源、JSP的运行原理、JSP的执行过程

    JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变. 如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序 ...

  4. android,view的执行过程onDraw、onSizeChanged,onFinishInflate

    小试view的执行过程,此是入门,高手绕道. ----------------------------------------------------------------------------- ...

  5. 微服务容错限流Hystrix入门

    为什么需要容错限流 复杂分布式系统通常有很多依赖,如果一个应用不能对来自依赖 故障进行隔离,那么应用本身就处在被拖垮的风险中.在一个高流量的网站中,某个单一后端一旦发生延迟,将会在数秒内导致 所有应用 ...

  6. Spring AOP 源码分析 - 拦截器链的执行过程

    1.简介 本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在我们的得 ...

  7. Hystrix入门与分析(二):依赖隔离之线程池隔离

    1.依赖隔离概述 依赖隔离是Hystrix的核心目的.依赖隔离其实就是资源隔离,把对依赖使用的资源隔离起来,统一控制和调度.那为什么需要把资源隔离起来呢?主要有以下几点: 1.合理分配资源,把给资源分 ...

  8. JSP的原理、JSP的执行过程

    Jsp的本质是servlet, 通过response的printWriter返回,response的getOutputStream只能调用一次,返回流就不能返回页面刷新. JSP起源 在很多动态网页中 ...

  9. Hystrix入门教程

    Hystrix入门教程 一·什么是Hystrix?Hystrix有什么作用?使用Hystrix有哪些适用场景 Hystrix是springCloud的组件之一,Hystrix 可以让我们在分布式系统中 ...

随机推荐

  1. JSP入门详解

    一.基础知识详解 1.JSP中使用html注释<!-- -->客户端可见,使用jsp注释<%-- --%>客户端不可见(查看源文件只看到空行),单行和多行注释也看不到(//或者 ...

  2. DataGridView列自适应宽度

    来源:http://www.cnblogs.com/wolf-sun/p/3480104.html 在做winform项目中,数据控件DataGridView的使用多多少少是会用到的,如果不设置它的属 ...

  3. 能使用html/css解决的问题就不要使用JS

    为什么说能使用html/css解决的问题就不要使用JS呢?两个字,因为简单.简单就意味着更快的开发速度,更小的维护成本,同时往往具有更好的体验,下面介绍几个实例. 1. 导航高亮 导航高亮是一种很常见 ...

  4. 关于MORMOT跨平台

    关于MORMOT跨平台 MORMOT服务端程序,支持Win32 / Win64.还有LINUX,通过FPC. 但是你能够写一个客户端在所有DELPHI支持的平台,要使用 cross-platform ...

  5. (转)找回vss超级管理员密码

    原文:http://www.cnblogs.com/446557021/archive/2011/01/05/1926213.html 如果忘记了VSS管理员密码,打开vss数据库所在的文件夹,打开d ...

  6. 推荐两份学习 Kotlin 和机器学习的资料

    最近 Kotlin 和人工智能比较火,有不少同学留言问我怎么学习 Kotlin,怎么学习机器学习,今天就给大家推荐两份不错的学习资料. 1. Kotlin 学习资料其实,在我看来最好的学习资料就是 K ...

  7. 将matlab的figure保存为pdf,避免图片太大缺失

    有时画的matlab图太大,或者有太多的子图,导致图太宽,如果直接保存成pdf的话,会导致左右边丢失,显示不下.一个有效又简单的办法是:   1.在matlab figure里面,Edit -> ...

  8. 用asp.net还原与恢复sqlserver数据库

    上次做了个项目,涉及到数据库的还原和恢复,到网上找了一下,是利用SQLDMO实现的,只要添加SQLDMO引用就好了,然后利用下边的类的方法就可以实现了. 我把原作者的类扩充了一下,可以自动识别web. ...

  9. 用curl抓取网站数据,仿造IP、防屏蔽终极强悍解决方式

    最近在做一些抓取其它网站数据的工作,当然别人不会乖乖免费给你抓数据的,有各种防抓取的方法.不过道高一尺,魔高一丈,通过研究都是有漏洞可以钻的.下面的例子都是用PHP写的,不会用PHP来curl的孩纸先 ...

  10. 微信小程序 - 选取搜索地点并且显示(map)

    演示如下,使用时,你也许会配合它:腾讯地图路线规划 wxml: <view class='address' bindtap='onChangeAddress'> <input cla ...