Hystrix熔断器

本文详细介绍了Spring Cloud Hystrix的使用,包括服务降级、服务熔断和限流的概念及其实现。通过设置HystrixCommand属性实现服务降级,使用熔断器避免服务雪崩,以及如何监控熔断状态。同时展示了服务端和客户端的降级、熔断示例代码,并讲解了如何配置Hystrix Dashboard进行监控。
摘要由CSDN通过智能技术生成

springcloud Hystrix熔断器

一、HyStrix

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

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

1、核心概念

服务降级(fallback)服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示
程序运行异常
超时
服务熔断触发服务降级
线程池/信号量也会导致服务降级
服务熔断(break)类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示;服务的降级->进而熔断->恢复调用链路
服务限流(flowlimit)秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行

2、服务端降级

概念:服务器忙,请稍后再试,不让客户端等待并立即返回友好提示,fallback。
发生原因:程序异常,超时,服务熔断触发服务降级,线程池打满。
2.1 pom

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2.2 实现
// 一般服务降级放在客户端

@Override
@HystrixCommand(fallbackMethod = "timeOutHandler",commandProperties = {
        @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "5000")
})
public String timeOut() {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return StringFormatter.format("当前线程:%s ,值:%s ,等待时间:%s",Thread.currentThread().getName(),"哈嘿ok","3s").getValue();
}

public String timeOutHandler() {
    return StringFormatter.format("当前线程:%s ,值:%s ,等待时间:%s",Thread.currentThread().getName(),"呜呜~","2s").getValue();
}

2.3 启动项注解

@EnableCircuitBreaker

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class PaymentHy8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentHy8001.class, args);
    }
}

3、客户端降级

3.1 pom

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--eureka client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

3.2 实现

@Component
@FeignClient(value = "provider-payment-hystrix",path = "/payment/hy",fallback = PaymentServiceFallBack.class)
public interface PaymentService {

    @GetMapping("/ok")
    public String ok();

    @GetMapping("/timeout")
    public String timeout();
}
@Component
public class PaymentServiceFallBack implements PaymentService{

    @Override
    public String ok() {
        return StringFormatter.format("80-当前线程:%s ,值:%s ,等待时间:%s",Thread.currentThread().getName(),"呜呜~","2s").getValue();
    }

    @Override
    public String timeout() {
        return StringFormatter.format("80-当前线程:%s ,值:%s ,等待时间:%s",Thread.currentThread().getName(),"呜呜~","2s").getValue();
    }
}

3.3 启动项注解

@EnableHystrix

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class OrderHystrix80 {

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

}

4、服务端熔断

概念:类比保险丝达到最大服务访问后直接拒绝访问,然后电泳服务降级方法并返回友好提示。

 /**
     * 服务熔断
     * @param id
     * @return
     */
    @Override
    @HystrixCommand(fallbackMethod = "circuitHandler",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 circuit(Long id) {
        if(id<0){
            throw new RuntimeException("id 不能为负数");
        }
        return StringFormatter.format("当前id:%s",id).getValue();
    }

    public String circuitHandler(Long id) {
        return StringFormatter.format("当前id %s 不能为负数 ",id).getValue();
    }

5、熔断监控

5.1 pom

 <!--    版本号由父工程pom管理    -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>

5.2 启动项

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboard9001 {

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

}

5.3 被监控启动项

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class PaymentHy8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentHy8001.class, args);
    }
    /**
     * 此配置是为了服务监控而配置,与服务容错本身无观,springCloud 升级之后的坑
     * ServletRegistrationBean因为springboot的默认路径不是/hystrix.stream
     * 只要在自己的项目中配置上下面的servlet即可
     * @return
     */
    @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;
    }
}
``
版权声明:本文为CSDN博主「Mr-Wanter」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mr_wanter/article/details/118385702

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气满满@WJW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值