欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Hystrix(二)---服务熔断(基础案例)

程序员文章站 2022-04-11 21:50:59
三,服务熔断熔断机制概述熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。在Spring Cloud框架里,熔断机制通过Hystrix实现。 Hystrix会监控微服务间调用的状,当检测到该节点微服务调用响应正常后,恢复调用链路。当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。榕断机制的注解是@HystrixCom...

三,服务熔断

熔断机制概述

熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。在Spring Cloud框架里,熔断机制通过Hystrix实现。 Hystrix会监控微服务间调用的状,当检测到该节点微服务调用响应正常后,恢复调用链路。当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。榕断机制的注解是@HystrixCommand。

雪崩效应

在微服务架构中通常会有多少个服务层调用,大量的微服务通过网络进行通信,从而支撑起整个系统。各个微服务之间也难免存在大量的依赖关系。然而任何服务都不是100%可用的,网络也往往是脆弱的,所以避免有些请求会失败。基础服务的故障导致级联故障,进而造成了整个系统的不可用,这种现象被称为雪崩式效应。服务雪崩效应描述的是一种因服务提供者的不可用导致服务消费者的不可用,并将不可用逐渐放大的过程。

A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像雪球一样放大到C和D时,雪崩效应就形成了。
Hystrix(二)---服务熔断(基础案例)

断路器

官网断路器流程图

Hystrix(二)---服务熔断(基础案例)

  • 断路器有完全打开状态:一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务
  • 半开:短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时 断路器关闭
  • 关闭:当服务一直处于正常状态 能正常调用

断路器的三个重要参数:快照时间窗、请求总数阀值、错误百分比阀值。

  • 快照时间窗:断路器确定是否打开需要统计一 些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
  • 请求总数阀值:在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20, 意味着在10秒内,如果该hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
  • 错误百分比阀值:当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。

增加8001的PaymentService的方法

//服务熔断
    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸
    })
    public String paymentCircuitBreaker(@PathVariable("id") Integer id)
    {
        if(id < 0)
        {
            throw new RuntimeException("******id 不能负数");
        }
        String serialNumber = IdUtil.simpleUUID();

        return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
    }
    public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id)
    {
        return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~   id: " +id;
    }

增加8001的PaymentController的方法

//服务熔断
    @GetMapping("/payment/circuit/{id}")
    public String paymentCircuitBreaker(@PathVariable("id") Integer id)
    {
        String result = paymentService.paymentCircuitBreaker(id);
        log.info("****result: "+result);
        return result;
    }

效果

Hystrix(二)---服务熔断(基础案例)
Hystrix(二)---服务熔断(基础案例)
多次查询id=-2,失败率超过60%,断路器开启,再查询正确的数据也会服务降级
Hystrix(二)---服务熔断(基础案例)

Hystrix(一)—服务降级(基础案例)

本文地址:https://blog.csdn.net/qq_43959546/article/details/107366329

相关标签: java