springcloud-Hystrix熔断器


typora-root-url: img

Hystrix 熔断器

概述

  • Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败(雪崩)。
  • 雪崩:一个服务失败,导致整条链路的服务都失败的情形。
  • Hystix 主要功能:
    • 隔离
      • 线程池隔离
      • 信号量隔离
    • 降级
    • 熔断
    • 限流

线程池隔离
在这里插入图片描述

信号量隔离
在这里插入图片描述

Hystrix 默认线程池隔离。


降级:异常,超时

在这里插入图片描述


熔断:当异常错误达到一定的数量,该服务端的该接口拒绝所有请求(熔断器打开),睡眠一定时间,然后熔断器半开,放少量请求过来,如果正常处理,则熔断器关闭,接口服务正常运行,正常的处理请求。

限流:指定信号量隔离的阈值。多出来的请求等着。就像吃饭排队一样。

Hystrix 降级 – 服务提供方

Hystix 降级:当服务发生异常或调用超时,返回默认数据

处理步骤

  1. 在服务提供方,引入 hystrix 依赖
  2. 定义降级方法
  3. 使用 @HystrixCommand 注解配置降级方法
  4. 在启动类上开启Hystrix功能:@EnableCircuitBreaker

在服务提供方,引入 hystrix 依赖

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

定义降级方法,直接在对应接口的方法中定义降级方法
使用 @HystrixCommand 注解配置降级方法,可以自定义超时时间等

@RestController
@RequestMapping("/goods")
public class GoodsController {

    @Autowired
    private GoodsService goodsService;

    @Value("${server.port}")
    private int port;

    /**
     * 降级:
     *  1. 出现异常
     *  2. 服务调用超时
     *      * 默认1s超时
     *
     *  @HystrixCommand(fallbackMethod = "findOne_fallback")
     *      fallbackMethod:指定降级后调用的方法名称
     */
    @GetMapping("/findOne/{id}")
    @HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = {
            //设置Hystrix的超时时间,默认1s
         @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    public Goods findOne(@PathVariable("id") int id){
        Goods goods = goodsService.findOne(id);
        goods.setTitle(goods.getTitle() + ":" + port);//将端口号,设置到了 商品标题上
        return goods;
    }

    /**
     * 定义降级方法:
     *  1. 方法的返回值需要和原方法一样
     *  2. 方法的参数需要和原方法一样
     */
    public Goods findOne_fallback(@PathVariable("id") int id){
        Goods goods = new Goods();
        goods.setTitle("服务端降级了~~~");
        return goods;
    }
}

在启动类上开启Hystrix功能:@EnableCircuitBreaker

@EnableEurekaClient //该注解 在新版本中可以省略
@SpringBootApplication
@EnableCircuitBreaker // 开启Hystrix功能
public class ProviderApp {


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

Hystrix 降级 – 服务消费方

处理步骤

1、fegin组件已经集成hystrix组件,不用导入依赖
2、定义fegin的接口实现类,重写远程调用方法,即降级方法
3、在 @FeginClient注解中使用fallback属性设置降级处理类
4、配置开启fegin.hystrix.enabled=true

定义fegin的接口实现类,重写远程调用方法,即降级方法
在这里插入图片描述

在 @FeginClient注解中使用fallback属性设置降级处理类
在这里插入图片描述

配置开启fegin.hystrix.enabled=true,application.yml配置文件

# 开启消费端的服务降级功能,默认是关闭状态
feign:
  httpclient:
    enabled: true

两边同时设置了降级策略,如果服务提供方出现异常,则服务提供端降级策略触发,消费端不会触发,因为放回的降级数据也是正常的数据。


Hystrix 熔断

概述

Hystrix 熔断机制,用于监控微服务调用情况,当失败的情况达到预定的阈值(5秒失败20次),会打开断路器,拒绝所有请求,直到服务恢复正常为止。

在这里插入图片描述

默认情况下,是开启熔断器的机制 断路器打开,全部请求都是访问降级方法
我们只需要配置几个属性即可

@GetMapping("/findOne/{id}")
    @HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = {
            //设置Hystrix的超时时间,默认1s
         @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000"),
            //监控时间 默认5000 毫秒
            @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "5000"),
            //失败次数。默认20次
            @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "20"),
            //失败率 默认50%
            @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "50")

    })
    public Goods findOne(@PathVariable("id") int id){

        //如果id == 1 ,则出现异常,id != 1 则正常访问
        if(id == 1){
            //1.造个异常
            int i = 3/0;
        }
        /*try {
            //2. 休眠2秒
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
        Goods goods = goodsService.findOne(id);

        goods.setTitle(goods.getTitle() + ":" + port);//将端口号,设置到了 商品标题上
        return goods;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值