spring cloud 笔记 |第三章: Hystrix 熔断器

简介

在微服务架构中,存在着多个微服务,彼此之间可能存在依赖关系,当某个单元出现故障或者网络不通畅时,就会因为依赖关系形成故障蔓延,最终导致整个系统瘫痪,相对于传统架构更加不稳定.为了解决这样的问题,产生了熔断器模式.

熔断器的作用

当某个微服务发生故障时,通过熔断器的故障监控,向调用方返回一个错误响应,而不是长时间的等待,这样就不会使线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中蔓延,造成大面积雪崩效应.

Hystrix 熔断器工作原理

服务端的服务降级逻辑会因 Hystrix命令调用依赖服务超时而触发,也就是调用服务超时会进入断路回调逻辑处理.

但熔断器发挥作用需要满足熔断器三个重要条件:

1.快照时间窗

熔断器确定是否打开需要统计一些请求和错误数据,统计的时间范围就是快照时间窗,默认最近10秒.

2.请求总数下限

在快照时间窗内,必须满足请求总数下限才有资格熔断.默认为20次,如果说10秒内调用次数不足20次,即是请求服务超时,断路也不会打开.

3.错误百分比下限

当请求总数满足要求,但是错误率没有超过下限也不会熔断.默认50%.

因此,熔断器打开的条件是:在10秒快照时间窗期内,至少调用20次服务,并且服务调用错误率超过50%,才会打开熔断器.

不满足以上条件熔断器不会打开,服务调用错误只会触发服务降级,也就是调用fallback函数.每个请求时间延迟就是近似hystrix的超时时间.如果请求时间超过设定超时时间后就会返回fallback.当满足上面条件断路器打开,之后再请求调用的时候将不再调用处理逻辑,而是直接调用降级逻辑,会直接返回fallback,不在等待是否超时.通过断路器实现自动发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果.

在熔断器打开后,处理逻辑并没有结束.当熔断器打开,对处理逻辑进行熔断之后,hystrix会给处理逻辑设置一个休眠时间窗,在这个时间窗内,降级逻辑为临时的主逻辑,当休眠时间窗结束,熔断器会释放一次请求到处理逻辑,如果此次请求正常返回,那么熔断器闭合,处理逻辑回复正常工作;如果此次请求依然有温蒂,熔断器重新设置一个休眠时间窗.

通过以上机制,hystrix 熔断器实现了对依赖资源故障的处理,对降级策略的主动切换及对处理逻辑的主动恢复.这使得我们的微服务在依赖外部服务或资源的时候得到了非常好的保护,同时对于一些具备降级逻辑的业务需求可以实现自动化的切换和恢复,相比于设置开关由监控和运维来进行切换的传统实现方式显得更为智能和高效.

代码实现

实现原理图

image

准备工作

继续上一章笔记的工程,启动eureka-server 工程;启动service-hello工程;

创建Hystrix 熔断器

改造ribbon-server工程代码, 在其pom文件中加入hystrix的maven依赖:

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

在程序的启动类ServiceRibbonApplication 加@EnableHystrix注解开启Hystrix:

@EnableDiscoveryClient
@EnableEurekaClient
@SpringBootApplication
@EnableHystrix
public class ServiceRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run( ServiceRibbonApplication.class, args );
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

改造HelloService类,在helloService方法上加上@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法,熔断方法直接返回了一个字符串;

@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "helloError")
    public String helloService() {
        return restTemplate.getForObject("http://SERVICE-HELLO/hello",String.class);
    }

    public String helloError() {
        return "sorry,I'm error!";
    }

}

启动:service-ribbon 工程,当我们访问http://localhost:8084/hello 浏览器显示:

hello ! 我是 8083号服务器.

此时关闭 service-hello 工程,来模仿服务故障,再访问http://localhost:8084/hello 浏览器显示:

sorry,I'm error!

这就说明当 service-hello 服务不可用的时候,service-ribbon调用 service-hello的API接口,会执行快速失败,直接返回异常方法,而不是等待响应超时,这很好的控制了容器的线程阻塞。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270