当前位置:   article > 正文

hystrix的降级有两种_hystrix 信号量 降级

hystrix 信号量 降级

hystrix的降级有两种
1,线程隔离的降级
hystrix会为方法中每个调用的服务生成一个单独的线程池,对于这个线程池可以设置1.1请求超时时间,1.2,线程数量限制,没有设置用默认

2,熔断降级
熔断降级主要是采取计数看一定请求数量内的失败率,和熔断开关的打开时间,没有设置用默认的,20次请求中50%失败打开熔断器,此失败就不是
1,中的超时主要是异常

 

 

Hystrix保护机制简介

Hystrix是Netflix公司的一款开源的一个延迟和容错库,用于隔离访问远程服务,第三方库,防止出现级联失败。

雪崩问题

微服务,服务间调用关系错中复杂,一个请求,可能调用多个接口服务才能实现,会形成特别复杂的调用链路。
例如:一次请求需要调用A/P/H/I四个服务,这四个服务又要调用其他服务。
在这里插入图片描述如果微服务 I 发生异常,请求阻塞,用户不会得到响应,则tomcat的这个线程不会得到释放。
在这里插入图片描述于是越来越多用户请求,越来越多的线程阻塞。服务器支持的并发数和线程是有限的,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其他服务都不可用。形成雪崩效应

在这里插入图片描述

Hystrix解决雪崩效应有两个手段:

  • 线程隔离
  • 服务熔断

线程隔离,服务降级

示意图Hystrix为每个依赖服务调用分配一个线程池,如果线程池已满调用将会被立即拒绝。默认不采用排队,加速失败,判定时间。
用户请求将不在直接访问服务,而是通过线程池中的闲置线程来访问服务,如果线程池已满,或者请求超时,则会进行降级处理。

什么是降级处理?
    优先保证核心服务,而非核心服务不可用或者弱可用。
 

优势:
用户请求故障时,不会被阻塞或看到系统崩溃。至少可以看到一个执行结果。
导致Hystrix服务降级的情况:

  • 请求超时
  • 线程池已满

引入依赖

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

@SpringBootApplication
@EnableCircutBreaker//开启熔断
public class TestApplcation{
    public static void main(String[] args){
        SpringApplication.run(TestApplication.class,args);
    }
}
 

或者

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

 

@SpringCloudApplication 组合了微服务经常会引入的三个注解,
1.@EnableCircutBreaker 开启熔断
2.@SpringBootApplication
3.@EnableDiscoveryClient 开启负载均衡

编写降级逻辑

 

@RestController("test")
public class TestController{
    @Autowried
    private TestTemplate testTemplate;
    
    @HystrixCommand(fallbackMethod="queryTestByIdFallBack")
    public String queryTestById(@Param("id")Long id){
        
    }
    public String queryTestByIdFallBack(Long id){
        return "请求繁忙";
    }

}
 

注意:
熔断降级逻辑方法必须跟正常逻辑方法返回值保持一致。
@HystrixCommand(fallbackMethod=“queryTestByIdFallBack”)用来声明一个降级逻辑方法。

@RestController("test")
@DefaultProperties(defaultFallback="queryTestByIdFallBack") //声明一个全局降级逻辑方法
public class TestController{
    @HystrixCommand
    public String queryTestById(@Param("id")Long id){
        return "";
    }
    public String queryTestByIdFallBack(Long id){
        return "请求繁忙";
    }
}

 

  • @DefaultProperties(defaultFallback=“queryTestByIdFallBack”):类上指明统一的降级方法。
  • @HystrixCommand:在方法上直接使用该注解,使用默认的剪辑方法。
  • defaultFallback:默认降级方法,不用任何参数,以匹配更多方法,但是返回值一定一致

设置超时

Hystrix默认超时时间为1S,我们可以通过hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds来设置Hystrix超时时间。

hystrix:
    command:
        default:
            execution:
                isolation:
                    thread:
                        timeoutInMilliseconds:6000 #设置超时时间为6000ms
            

 

服务熔断

服务熔断原理

熔断状态机3个状态:

  • Close:关闭状态,所有请求都正常访问。
  • Open:打开状态,所有请求都会被降级。Hystix会对请求情况计数。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
  • Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时。

修改熔断策略参数:

circuitBreaker:
    requestVolumeThreshold:10
    sleepWindowInMilliseconds:1000
    errorThresholdPercentage:50

 

1.requestVolumeThreshold:触发熔断的最小请求次数:默认20
2.errorThresholdPercentage:触发熔断的失败请求最小占比:默认50%
3.sleepWindowInMilliseconds:休眠时长,默认5000ms

 

参考:

https://blog.csdn.net/weixin_42789301/article/details/105093898

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/536976
推荐阅读
  

闽ICP备14008679号