前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hystrix强力护卫

Hystrix强力护卫

作者头像
用户3467126
发布2021-09-03 15:46:34
3550
发布2021-09-03 15:46:34
举报
文章被收录于专栏:爱编码爱编码

为什么要用Hystrix

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

Hystrix设计目标:

  • 对来自依赖的延迟和故障进行防护和控制——这些依赖通常都是通过网络访问的
  • 阻止故障的连锁反应
  • 快速失败并迅速恢复
  • 回退并优雅降级
  • 提供近实时的监控与告警

Hystrix基本使用

上篇文章中关于feign有过介绍,feign是集成了Hystrix的组件,所以使用Hystrix功能,不需要在引用额外的依赖,只需开启其配置就行。

1、在pom文件里添加histyix的相关依赖。

代码语言:javascript
复制
 <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

2、接口的改造

因为Feign是应用在接口上的,所以在其@FeignClient注解上需要增加配置。

代码语言:javascript
复制
@FeignClient(value = "eureka-client", configuration = FeginConfig.class, fallback = HiHystrix.class)
public interface EurekaClientFeign {

    @GetMapping("/hello/")
    String hello(@RequestParam String name);
}

在@FeignClient注解上增加了fallback = HiHystrix.class的配置,当访问接口出现异常时,回调HiHystrix类进行处理。

代码语言:javascript
复制
@Component
public class HiHystrix implements EurekaClientFeign{
    @Override
    public String hello(String name) {
        return "hi, " + name + ", error";
    }
}

3、application.properties的修改

代码语言:javascript
复制
spring.application.name=eureka-feign
server.port=8081
eureka.client.serviceUrl.defaultZone=http://localhost:1101/eureka/
# 添加开启Hystrix的配置
feign.hystrix.enabled=true

特别地,如果你需要自定义限流操作的话,还需要添加下面配置:

代码语言:javascript
复制
####################1、线程池隔离配置##############
  # 隔离策略
hystrix.command.default.execution.isolation.strategy=THREAD
  # 核心线程数
 hystrix.threadpool.default.coreSize=10
 # 最大任务队列容量
 hystrix.threadpool.default.maxQueueSize=30
 # 任务拒绝的任务队列阈值
 hystrix.threadpool.default.queueSizeRejectionThreshold=30
 # 超时时间上限
 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000


####################2、信号量隔离配置##############
# 隔离策略
hystrix.command.default.execution.isolation.strategy=SEMAPHORE
# 最大并发请求上限
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=10

更多配置可参考文章:https://www.cnblogs.com/throwable/p/11961016.html

Hystrix原理

1、执行流程

摘自Hystrix官网流程图如下:https://github.com/Netflix/Hystrix/wiki/How-it-Works

Hystrix整个工作流如下:

    1. 构造一个 HystrixCommand或HystrixObservableCommand对象,用于封装请求,并在构造方法配置请求被执行需要的参数;
    1. 执行命令,Hystrix提供了4种执行命令的方法,后面详述;
    1. 判断是否使用缓存响应请求,若启用了缓存,且缓存可用,直接使用缓存响应请求。Hystrix支持请求缓存,但需要用户自定义启动;
    1. 判断熔断器是否打开,如果打开,跳到第8步;
    1. 判断线程池/队列/信号量是否已满,已满则跳到第8步;
    1. 执行HystrixObservableCommand.construct()或HystrixCommand.run(),如果执行失败或者超时,跳到第8步;否则,跳到第9步;
    1. 统计熔断器监控指标;
    1. 走Fallback备用逻辑
    1. 返回请求响应

2、源码分析

Hystrix源码跟踪图如下:

如果你想更加深入一步一步跟踪其原理,可以参考这篇集合文章:https://blog.csdn.net/X5fnncxzq4/article/details/80147193

3、Hystrix断路器

熔断器有三个状态 CLOSED 、 OPEN 、 HALF_OPEN 熔断器默认关闭状态,当触发熔断后状态变更为 OPEN ,在等待到指定的时间,Hystrix会放请求检测服务是否开启,这期间熔断器会变为 HALF_OPEN 半 开启状态,熔断探测服务可用则继续变更为 CLOSED 关闭熔断器。

Closed :关闭状态(断路器关闭),所有请求都正常访问。代理类维护了最近调用失败的次数, 如果某次调用失败,则使失败次数加1。如果最近失败次数超过了在给定时间内允许失败的阈值, 则代理类切换到断开(Open)状态。此时代理开启了一个超时时钟,当该时钟超过了该时间,则切 换到半断开(Half-Open)状态。该超时时间的设定是给了系统一次机会来修正导致调用失败的错 误。

Open :打开状态(断路器打开),所有请求都会被降级。Hystix会对请求情况计数,当一定时间 内失败请求百分比达到阈值,则触发熔断,断路器会完全关闭。默认失败比例的阈值是50%,请求 次数最少不低于20次。

Half Open :半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路 器会自动进入半开状态。此时会释放1次请求通过,若这个请求是健康的,则会关闭断路器,否则 继续保持打开,再次进行5秒休眠计时。

断路器circuitBreaker相关配置

代码语言:javascript
复制
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000 #默认的连接超时时间1秒,若1秒没有返回数据,自动的触发降级逻辑
      circuitBreaker:
        enabled: true
        # 设置将使断路器打开的滑动窗口中的最小请求数量。
        requestVolumeThreshold: 5
        # 设置一个错误百分比,当请求错误率超过设定值,断路器就会打开。
        errorThresholdPercentage: 10
        #设置断路器打开后拒绝请求的时间量,每隔一段时间(sleepWindowInMilliseconds,单位是毫秒)允许再次尝试(也就是放行一个请求
        sleepWindowInMilliseconds: 10000

参考文章

https://github.com/Netflix/Hystrix/wiki/How-it-Works https://www.cnblogs.com/throwable/p/11961016.html https://blog.csdn.net/X5fnncxzq4/article/details/80147193

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱编码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要用Hystrix
  • Hystrix基本使用
  • Hystrix原理
    • 1、执行流程
      • 2、源码分析
        • 3、Hystrix断路器
        • 参考文章
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档