前言

  高可用相关的技术以及架构,对于大型复杂的分布式系统,是非常重要的。而高可用架构中,非常重要的一个环节,就是如何将分布式系统中的各个服务打造成高可用的服务,从而足以应对分布式系统环境中的各种各样的问题,比如服务间的调用超时,或者服务间的调用失败,避免整个分布式系统被某个服务的故障给拖垮。而要解决这些棘手的分布式系统可用性问题,就涉及到了高可用分布式系统中的很多重要的技术,包括资源隔离,限流与过载保护,熔断,优雅降级,容错,超时控制,监控运维,等等。而行业中大部分的朋友,对高可用系统架构以及相关的技术并没有太多的了解,这也成为了你设计一个复杂的高可用系统架构,或者面试高阶Java职位时的一个重要阻碍。

  在行业中,实现高可用架构的非常流行和重要的框架就是Hystrix,是国外知名的视频网站Netflix所开源的。Hystrix能够完美的解决分布式系统架构中,打造高可用服务面临的一系列技术难题,包括资源隔离,限流与过载保护,熔断,优雅降级,容错,超时控制,监控运维等等。

断路器-Hystrix的深入了解

工作流程(参考:https://github.com/Netflix/Hystrix/wiki/How-it-Works

1、 创建一个 HystrixCommand 或 HystrixObservableCommand 实例

第一步就是构建一个 HystrixCommand 或 HystrixObservableCommand 实例来向其它组件发出操作请求,通过构造方法来创建实例。

HystrixCommand:返回一个单响应

HystrixObservableCommand:返回一个观察者发出的响应

2、 执行方法

这里有4个方法,前两个只适用于 HystrixCommand 不适用于 HystrixObservableCommand

execute():阻塞型方法,返回单个结果(或者抛出异常)

queue():异步方法,返回一个 Future 对象,可以从中取出单个结果(或者抛出异常)

  • observe():返回Observable 对象

toObservable():返回Observable 对象

3、 缓存判断

检查缓存内是否有对应指令的结果,如果有的话,将缓存的结果直接以 Observable 对象的形式返回

 

4、 断路器判断

检查Circuit Breaker的状态。如果Circuit Breaker的状态为开启状态,Hystrix将不会执行对应指令,而是直接进入失败处理状态(图中8)。如果Circuit Breaker的状态为关闭状态,Hystrix会继续执行(图5)

5、 线程池、任务队列、信号量的检查

确认是否有足够的资源执行操作指令。当线程池和队列(或者是信号量,当不使用线程池隔离模式的时候)资源满的时候,Hystrix将不会执行对应指令并且会直接进入失败处理状态(图8)

6、 HystrixObservableCommand.construct() 和 HystrixCommand.run()

如果资源充足,Hystrix将会执行操作指令。操作指令的调用最终都会到这两个方法:

HystrixCommand.run():返回一个响应或者抛出一个异常

HystrixObservableCommand.construct():返回一个可观测的发出响应(s)或发送一个onError通知

如果执行指令的时间超时,执行线程会抛出 TimeoutException 异常。Hystrix会抛弃结果并直接进入失败处理状态。如果执行指令成功,Hystrix会进行一系列的数据记录,然后返回执行的结果。

7、 统计断路器的健康情况

Hystrix会根据记录的数据来计算失败比率,一旦失败比率达到某一阈值将自动开启Circuit Breaker

 

8、 回退

如果我们在Command中实现了HystrixCommand.getFallback()方法(或HystrixObservableCommand. resumeWithFallback() 方法,Hystrix会返回对应方法的结果。如果没有实现这些方法的话,仍然 Hystrix会返回一个空的 Observable 对象,并且可以通过 onError 来终止并处理错误。

调用不同的方法返回不同的结果:

execute(): 将会抛出异常

queue(): 将会返回一个Future 对象,如果调用它的get()方法将会抛出异常

  • observe()和 toObservable():都会返回上述的 Observable 对象

9、 返回成功

如果Hystrix执行成功,返回的响应取决于在步骤2中调用命令。

execute():阻塞型方法,返回单个结果(或者抛出异常)

queue():异步方法,返回一个 Future 对象,可以从中取出单个结果(或者抛出异常)

  • observe():返回Observable 对象

toObservable():返回Observable 对象

断路器的工作原理

断路器开启或者关闭的条件:

1、  当满足一定的阀值的时候(默认10秒内超过20个请求次数)

2、  当失败率达到一定的时候(默认10秒内超过50%的请求失败)

3、  到达以上阀值,断路器将会开启

4、  当开启的时候,所有请求都不会进行转发

5、  一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。重复4和5。

HystrixCircuitBreaker源码分析

如果是对Hystrix技术感兴趣的话,建议可以参考下这个免费的视频资料,这是一个基于Hystrix技术的高可用架构的项目实战免费课程,课程都是用每日上亿流量的大型电商网站中的商品详情页系统中的缓存服务,作为项目实战。学习地址

断路器-Hystrix的深入了解的更多相关文章

  1. SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)

    前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netfl ...

  2. 【Spring Cloud笔记】 断路器-hystrix

    在微服务架构中,一个微服务的超时失败可能导致瀑布式连锁反映,Spring Cloud Netflix 的断路器Hystrix通过自主反馈,防止了这种情况发生.下面介绍简单的断路器使用方法. [step ...

  3. spring cloud学习(五)断路器 Hystrix

    断路器 Hystrix 断路器模式 (云计算设计模式) 断路器模式源于Martin Fowler的Circuit Breaker一文. 在分布式环境中,其中的应用程序执行访问远程资源和服务的操作,有可 ...

  4. 004声明式服务调用Feign & 断路器Hystrix

    1.POM配置 和普通Spring Boot工程相比,添加了Eureka Client.Feign.Hystrix依赖和Spring Cloud依赖管理 <dependencies> &l ...

  5. SpringCloud IDEA 教学 (四) 断路器(Hystrix)

    写在开始 在SpringCloud项目中,服务之间相互调用(RPC Remote Procedure Call —远程过程调用),处于调用链路底层的服务产生不可用情况时,请求会产生堆积使得服务器线程阻 ...

  6. 断路器Hystrix与Turbine集群监控-Spring Cloud学习第三天(非原创)

    文章大纲 一.Hystrix基础介绍二.断路器Hystrix简单使用三.自定义Hystrix请求命令四.Hystrix的服务降级与异常处理五.Hystrix的请求缓存与请求合并六.Hystrix仪表盘 ...

  7. SpringCloud断路器(Hystrix)和服务降级案列

    断路器(Hystrix) 为什么需要 Hystrix? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC).为了保证其高可用,单个服务又必须集群部署.由于网络原因或者自 ...

  8. 【Spring Cloud学习之六】断路器-Hystrix

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 Spring Cloud 1.2 一.服务雪崩1.什么是服务雪崩分布式系统中经常会出现某个基础服务不可用造成整个系统不 ...

  9. 断路器Hystrix(Feign)

    上一篇中我们讲了 断路器Hystrix(Ribbon) 本章讲解Feign+Hystrix已经Request请求传递,各种奇淫技巧…. - Hystrix Hystrix支持回退概念:当 断路器 打开 ...

随机推荐

  1. B1295 [SCOI2009]最长距离 最短路

    就是一道最短路的裸题,直接跑spfa就行了.(spfa死了) 最后在答案处判断是否障碍物太多,然后就直接找最大值就行. (数据特别水,我错误算法60) 题干: Description windy有一块 ...

  2. Blender插件加载研究

    目标 [x] 解析Blender插件代码加载原理, 为测试做准备 结论 采用方法3的方式, 可以在测试中保证重新加载子模块, 是想要的方式, 代码如下: _qk_locals = locals() d ...

  3. POJ 3264 线段树 ST

    题意:给你一个数列,从中挑一段,问你这段数的最大值减最小值是多少. 思路:线段树. // by Sirius_Ren #include <cstdio> #include <algo ...

  4. A - Next Round

    Problem description "Contestant who earns a score equal to or greater than the k-th place finis ...

  5. angualr2之路由与导航(一)

    1. 唯一根模块式组件导航 在唯一根模块式组件导航中,全局只有一个模块,即根模块. 1.1 根模块 在根模块中,需要导入所有组件及其对应的服务,并将组件加入声明,将其对应的服务加入提供商. // ap ...

  6. Android_方向传感器

    Android方向传感器小案例,主要代码如下: package com.hb.direction; import android.app.Activity; import android.conten ...

  7. VHDL之concurrent之generate

    GENERATE It is another concurrent statement (along with operators and WHEN). It is equivalent to the ...

  8. (转)Bootstrap 之 Metronic 模板的学习之路 - (3)源码分析之 body 部分

    https://segmentfault.com/a/1190000006697252 body 的组成结构 body 部分包含了 HEADER.CONTAINER.FOOTER,其中 CONTAIN ...

  9. Jmeter JSON断言和响应断言的区别是什么?

    假设响应数据是{"code":0,"datas":{"informationStatus":1}} 响应断言:"code" ...

  10. 微信小程序—picker(滚动选择器)

    官方api:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html 上边是官网的api.小程序中,底部下拉滚动选择主要有这几种 ...