SpringCloud-服务降级

本文深入解析Hystrix断路器的功能与配置,包括服务降级、熔断及限流策略,演示如何在Spring Cloud中应用Hystrix处理分布式系统延迟与容错问题,提升系统稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Hystrix

1、简介

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

“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方法返回一个符合
预期的、可处理的备选相应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了
服务调用方的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统的蔓延,乃至雪崩。

2、作用

1、服务降级
    服务处理不过来的时间,提示服务器忙,请稍后再试,不让客户端等待。FallBack。
    什么情况会触发降级:
        1、程序运行异常
        2、服务调用超时
        3、服务熔断触发服务降级
        4、线程池满也会导致降级

2、服务熔断
    达到最大的访问服务后,直接拒绝访问,然后调用服务降级返回友好提示

3、服务限流
    秒杀高并发操作,限流。

3、服务降级

1、新建服务提供,添加pom依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>

2、在主启动类开启断路器@EnableCircuitBreaker

3、在需要对服务降级的方法上添加@HystrixCommand注解
    举例:
    @HystrixCommand(fallbackMethod = "payment_timeoutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", 
    value = "3000")
    })
    public String payment_timeout(Integer id) throws InterruptedException {
        if(id > 0){
            TimeUnit.SECONDS.sleep(5);
            return "线程池:" + Thread.currentThread().getName() + ", payment_timeout , 
    id : " + id + ", success~~~";
        }else{
            int a = 10/0;
            return "线程池:" + Thread.currentThread().getName() + ", payment_timeout , 
    id : " + id + ", success~~~";
        }
    }

    public String payment_timeoutHandler(Integer id){
        return "服务降级,端口:8001,线程池:" + Thread.currentThread().getName() + ", 
    payment_timeoutHandler , id : " + id + ", fail~~~";
    }

4、新建服务消费者,同样添加pom依赖

5、在主启动类添加@EnableHystrix,配置application.properties,开启feign和hystrix开关
    feign.hystrix.enabled = true

6、同样可以客户端对服务进行降级,和3的配置类似

7、在类上添加@DefaultProperties(defaultFallback = "payment_Global_FallBack")
    配置服务降级的方法

8、在需要配置的方法上加@HystrixCommand即可

9、默认方法上配置了详细的服务降级策略则不使用全局的,否则使用全局的

10、默认降级方法在业务逻辑放在一起过于混乱,在服务消费端因为使用了Feign,所以有一个调用服务的远程
接口,写一个实现类添加@Component,在实现类里实现降级,在接口上添加@FeignClient(name = 
"PROVIDER-PAYMENT-HYSTRIX-SERVICE",fallback = OrderServiceFallBack.class),指明服务降级使
用的哪个类即可。

4、服务熔断

1、和服务降级类似配置

2、在需要熔断的方法上加上注解
    @HystrixCommand(fallbackMethod = "circuitBreakerHandler",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"),
    })
简述:该方法在10s内调用次数大于等于10次,如果失败率高达60%则开启熔断。
      默认10秒,20次,50%错误率。、
      详细@HystrixProperty参数参考Github
      https://github.com/Netflix/Hystrix/wiki/Configuration

5、服务监控

1、新建项目,添加pom依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
    </dependency>

2、在主启动类加上注解@EnableHystrixDashboard

3、访问http://localhost:xxx/hystrix进入图形界面

4、在需要监控的服务启动类配置一个Bean
    @Bean
    public ServletRegistrationBean getServlet() {
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean registrationBean = new 
       ServletRegistrationBean(streamServlet);
        registrationBean.setLoadOnStartup(1);
        registrationBean.addUrlMappings("/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return registrationBean;
    }

5、在图形化监控输入http://localhost:xxx/hystrix.stream,需要访问的服务端口

6、即可看到服务的信息

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值