hystrix熔断和降级的区别_java架构师高端课微服务_05_SpringCloud_Netflix_Hystrix

bd2f597fdb2dfa518b704f6e7076d026.png

主要内容

Hystrix简介

服务降级

服务熔断

请求缓存

Feign的雪崩处理

可视化的数据监控Hystrix-dashboard

学习目标

33008142b19d89be5acccd602b734d5a.png

一、 Hystrix简介

1 什么是灾难性雪崩效应

14f51da8b6bd1240a035429921260664.png

造成灾难性雪崩效应的原因,可以简单归结为下述三种:

服务提供者不可用。如:硬件故障、程序BUG、缓存击穿、并发请求量过大等。

重试加大流量。如:用户重试、代码重试逻辑等。

服务调用者不可用。如:同步请求阻塞造成的资源耗尽等。

雪崩效应最终的结果就是:服务链条中的某一个服务不可用,导致一系列的服务不可用,最终造成服务逻辑崩溃。这种问题造成的后果,往往是无法预料的。

解决灾难性雪崩效应的方式通常有:降级、熔断和请求缓存。

2 什么是Hystrix

Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力。本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力。为了实现容错和自我保护,下面我们看看Hystrix如何设计和实现的。

Hystrix设计目标:

1、 对来自依赖的延迟和故障进行防护和控制——这些依赖通常都是通过网络访问的

2、 阻止故障的连锁反应

3、 快速失败并迅速恢复

4、 回退并优雅降级

5、 提供近实时的监控与告警

Hystrix遵循的设计原则:

1、 防止任何单独的依赖耗尽资源(线程)

2、 过载立即切断并快速失败,防止排队

3、 尽可能提供回退以保护用户免受故障

4、 使用隔离技术(例如隔板,泳道和断路器模式)来限制任何一个依赖的影响

5、 通过近实时的指标,监控和告警,确保故障被及时发现

6、 通过动态修改配置属性,确保故障及时恢复

7、 防止整个依赖客户端执行失败,而不仅仅是网络通信

Hystrix如何实现这些设计目标?

1、 使用命令模式将所有对外部服务(或依赖关系)的调用包装在HystrixCommand或HystrixObservableCommand对象中,并将该对象放在单独的线程中执行;

2、 每个依赖都维护着一个线程池(或信号量),线程池被耗尽则拒绝请求(而不是让请求排队)。

3、 记录请求成功,失败,超时和线程拒绝。

4、 服务错误百分比超过了阈值,熔断器开关自动打开,一段时间内停止对该服务的所有请求。

5、 请求失败,被拒绝,超时或熔断时执行降级逻辑。

6、 近实时地监控指标和配置的修改。

在Spring cloud中处理服务雪崩效应,都需要依赖hystrix组件。在Application Client应用的pom文件中都需要引入下述依赖:

e31dabdd4029acb45e6ba9e17e858c50.png

二、 服务降级

降级是指,当请求超时、资源不足等情况发生时进行服务降级处理,不调用真实服务逻辑,而是使用快速失败(fallback)方式直接返回一个托底数据,保证服务链条的完整,避免服务雪崩。

解决服务雪崩效应,都是避免application client请求application service时,出现服务调用错误或网络问题。处理手法都是在application client中实现。我们需要在application client相关工程中导入hystrix依赖信息。并在对应的启动类上增加新的注解@EnableCircuitBreaker,这个注解是用于开启hystrix熔断器的,简言之,就是让代码中的hystrix相关注解生效。

具体实现过程如下:

1 修改application service代码

修改application service工程中的代码,模拟超时错误。此模拟中,让服务端代码返回之前休眠2000毫秒,替代具体的复杂服务逻辑。

09e4633590d2d257c3feef0d2efca891.png

3839258b35386955068e0dd4929faf62.png

2 application client POM依赖

600bc8dee11b3c51fa46e051d83294fa.png

3 application client容错处理代码

ed8844327d67a1d738e1d0c4bfc3cd6c.png

f88136635671b83f1a955372103e82fd.png

be06c8fcc77b5f6b44fe2235fdd0e6fa.png

26289119720dd875f96c3247e533048a.png

4 application client配置文件application.yml

a2fd74474d3bfc855632d22da1d30b27.png

5 application client启动类

a4498d3f3c783676b76f6fcd786f9b4d.png

三、 服务熔断

当一定时间内,异常请求比例(请求超时、网络故障、服务异常等)达到阀值时,启动熔断器,熔断器一旦启动,则会停止调用具体服务逻辑,通过fallback快速返回托底数据,保证服务链的完整。

熔断有自动恢复机制,如:当熔断器启动后,每隔5秒,尝试将新的请求发送给服务提供者,如果服务可正常执行并返回结果,则关闭熔断器,服务恢复。如果仍旧调用失败,则继续返回托底数据,熔断器持续开启状态。

7d38efc0543aecfc8f225c449cd8973b.png

具体实现过程如下:

1 application client POM依赖

4ff77bd58dd305e89e10c9bef817b162.png

99d7c6a4b91412cd9b5832ec0952f247.png

2 application client容错处理代码

7d44e0ce16bc47b4d7730d6a91c42be5.png

75aa2265a3f58d65dd1248b5026b9bed.png

cabf4b74c606ee2655b07f4d7ccf847c.png

3 application client配置文件application.yml

e62b576bff717b7f47f80381898cad3b.png

4 application client启动类

a84d171a0899e55a76ea4d8e37b008e9.png

76afde7e89955c714f20cdb633788b7b.png

四、 请求缓存

请求缓存:通常意义上说,就是将同样的GET请求结果缓存起来,使用缓存机制(如redis、mongodb)提升请求响应效率。

使用请求缓存时,需要注意非幂等性操作对缓存数据的影响。

请求缓存是依托某一缓存服务来实现的。在案例中使用redis作为缓存服务器,那么可以使用spring-data-redis来实现redis的访问操作。

1 修改application service代码

e660d10e53e7bbe857b95e3c6fa24f5f.png

ebf5295ce09f73e16490b6954f612d10.png

2 application client POM依赖

09e436fca436e0e33b7df986f959ca06.png

0d1221a27ef46a7b43223796884dde0a.png

3 application client 容错处理代码

55a6d1ca5d9c4fbdfff8f5c5f953b020.png

71219125ce5861132a7c09e34dacec24.png

662d3bf6ab0fbd05d8471bae82fac767.png

9f87bf88518743560b2ca1c90163f26b.png

28223e0f5c3dcb96eef8aba35397a54b.png

7c84271d0d8fdd3a59ead564495631fd.png

2803e879f8d57726448d29441c8d1b7b.png

5 application client 启动类

8092d1bf8fdb673d5d4f17bffa10b6ea.png

五、 Openfeign的雪崩处理

在声明式远程服务调用Openfeign中,实现服务灾难性雪崩效应处理也是通过Hystrix实现的。而feign启动器spring-cloud-starter-openfeign中是包含Hystrix相关依赖的。如果只使用服务降级功能不需要做独立依赖。如果需要使用Hystrix其他服务容错能力,需要依赖spring-cloud-starter-netflix-hystrix资源。从Dalston版本后,feign默认关闭Hystrix支持。所以必须在全局配置文件中开启feign技术中的Hystrix支持。具体实现如下:

1 服务降级

1.1 POM依赖

Openfeign的启动器依赖spring-cloud-starter-openfeign中,自带Hystrix处理相关依赖,所以不需要修改POM依赖,直接通过配置即可开启容错处理机制。

1.1 application client 接口

a64b34c9d18b0a1f687ca42919839306.png

1.3 application client 接口实现

4c789c1aaac431feb16a7280d176875e.png

9b82d374b629faf09e2943400ea3a020.png

21a762db4ba6a0833215e36c58da930b.png

1.4 application client 配置文件application.yml

d15de8561a8f06c62c60b316ad95ef97.png

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值