hystrix服务熔断和降级

hystrix简介

分布式系统面临的问题

复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败

当多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的扇出,如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,从而引出系统崩溃,这就是服务雪崩

解决方案

hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖不可避免的会调用失败,比如超时,异常等,hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性

何为熔断

就是在某个服务出现故障后,通过故障监控,会向调用方返回一个符合预期的,可处理的备选响应,而不是长时间等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间,不必要的占用,从而避免故障造成分布式系统的服务雪崩

hystrix重要概念

服务降级

  • 服务降级就是向调用方返回一个符合预期的,可处理的备选响应,而不是长时间等待或者抛出调用方无法处理的异常

哪些情况会发出降级:

  • 程序运行异常
  • 超时
  • 服务熔断触发服务降级
  • 线程池/信号量打满

服务熔断

  • 熔断就类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示,其实就是服务降级的触发条件,当响应恢复正常后,可以恢复服务的正常调用

在这里插入图片描述

服务限流

  • 限定指定时间只能指定数量的请求进来

demo案例

服务降级

引入依赖

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

启动类加上注解

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class Hystrix {

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

配置降级处理方法

    @HystrixCommand(fallbackMethod = "timeOutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    @RequestMapping("/errorTimeAwait")
    public Object errorTimeAwait(){
        return paymentService.error_timeAwait();
    }


    public Object timeOutHandler(){
        return "超时啦!";
    }

这种方式的话,每一个需要处理降级的业务都需要配置一个单独的处理方法,会造成代码膨胀

全局降级处理

@RestController
@RequestMapping("/pay")
@DefaultProperties(defaultFallback = "globalHandler")//再配合 @HystrixCommand对业务方法实现降级
public class PaymentController {

    /**
     * 服务熔断和降级,限流在消费端和服务提供端都可以配置
     * 这里模拟消费端配置
     */

    @Autowired
    private PaymentService paymentService;

    @RequestMapping("/ok")
    public Object ok(){
        return paymentService.ok();
    }

    @HystrixCommand
    @RequestMapping("/errorTimeAwait")
    public Object errorTimeAwait(){
        return paymentService.error_timeAwait();
    }


    public Object timeOutHandler(){
        return "超时啦!";
    }
}

还有一种是在feign调用方中设置

@Component
@FeignClient(value = "PAYMENT8101",fallback = FeignServiceImpl.class)//声明服务名
public interface FeignService {

    @RequestMapping("/res/res")//controller方法的接口声明
    String create();
}

将降级处理方法实现在实现类上

@Component
public class FeignServiceImpl implements FeignService {
    /**
     * 降级处理方法
     * @return
     */
    @Override
    public String create() {
        return "------- 降级啦 -------";
    }
}

配置文件开启配置

feign:
  hystrix:
    enabled: true

服务熔断

    //在10s中有6次请求失败则触发断路器,10s一个窗口
    @HystrixCommand(fallbackMethod = "timeOutHandler",commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),//是否开启断路器
            @HystrixProperty(name = "circuitBreaker.requestVolmueThreshold",value = "10"),//请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),//时间窗口期
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")//失败率达到多少后触发熔断
    })
    @RequestMapping("/errorTimeAwait")
    public Object errorTimeAwait(){
        return paymentService.error_timeAwait();
    }


    public Object timeOutHandler(){
        return "超时啦!";
    }

猜你喜欢

转载自blog.csdn.net/weixin_41922289/article/details/106741336