欢迎光临散文网 会员登陆 & 注册

java架构师高端课微服务_05_SpringCloud_Netflix_Hystrix

2020-07-06 15:45 作者:自学Python的小姐姐呀  | 我要投稿

主要内容

Hystrix简介

服务降级

服务熔断

请求缓存

Feign的雪崩处理

可视化的数据监控Hystrix-dashboard

学习目标

一、 Hystrix简介

什么是灾难性雪崩效应

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

服务提供者不可用。如:硬件故障、程序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文件中都需要引入下述依赖:

二、 服务降级

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

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

具体实现过程如下:

修改application service代码

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

2  application client POM依赖

3  application client容错处理代码

4  application client配置文件application.yml


5  application client启动类


三、 服务熔断

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

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

具体实现过程如下:

application client POM依赖

2  application client容错处理代码


3  application client配置文件application.yml


4  application client启动类


四、 请求缓存

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

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

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

修改application service代码


2  application client POM依赖


3  application client 容错处理代码


5  application client 启动类



五、 Openfeign的雪崩处理

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

服务降级

1.1 POM依赖

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

1.1 application client 接口

1.3 application client 接口实现


1.4 application client 配置文件application.yml










java架构师高端课微服务_05_SpringCloud_Netflix_Hystrix的评论 (共 条)

分享到微博请遵守国家法律