Hystrix强力护卫

Posted 爱编码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hystrix强力护卫相关的知识,希望对你有一定的参考价值。

为什么要用Hystrix

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

Hystrix设计目标:

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

Hystrix基本使用

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

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

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

2、接口的改造

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

@FeignClient(value = "eureka-client", configuration = FeginConfig.classfallback = HiHystrix.class)
public interface EurekaClientFeign 
{

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

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

@Component
public class HiHystrix implements EurekaClientFeign{
    @Override
    public String hello(String name) {
        return "hi, " + name + ", error";
    }
}

3、application.properties的修改

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

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

####################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强力护卫

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相关配置

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


以上是关于Hystrix强力护卫的主要内容,如果未能解决你的问题,请参考以下文章

Bypass 护卫神SQL注入防御(多姿势)

网易官方极客战记(codecombat)攻略-森林-贴身护卫peasant-protection

过护卫神的一些方法

护卫神·主机大师

P1594 护卫队

luoguP1594 护卫队