SpringCloud系列之Hystrix熔断器

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

Hystrix的目标

  1. 通过第三方客户端库访问的依赖项(通常是通过网络)的延迟和故障进行保护和控制。
  2. 在复杂的分布式系统中防止级联故障。
  3. 快速失败,快速恢复。
  4. 回退,尽可能优雅地降级。
  5. 启用近实时监控、报警和操作控制。

Hystrix设计原理

  1. 防止任何单个依赖项耗尽整个容器(如tomcat)用户线程
  2. 甩掉包袱,快速失败而不是排队。
  3. 在任何可行的地方提供回退,以保护用户不受失败的影响。
  4. 使用隔离技术(如隔离板、泳道和断路器模式)来限制任何一个依赖项的影响。
  5. 通过近实时的度量、监视和报警来优化发现时间。
  6. 通过配置的低延迟传播来优化恢复时间。
  7. 支持对Hystrix的大多数方面的动态属性更改,允许使用低延迟反馈循环进行实时操作修改。
  8. 避免在整个依赖客户端执行中出现故障,而不仅仅是在网络流量中。

Hystrix断路器简单demo
引入jar包

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-hystrix</artifactId>
      <version>1.4.6.RELEASE</version>
</dependency>

在启动类上开启断路器

@SpringBootApplication
@EnableEurekaClient // 表示是eureka的客户端
@EnableFeignClients
@EnableDiscoveryClient  // 提供服务发现
@EnableCircuitBreaker   // 开启hystrix断路器
public class UserServiceApplication {

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

    /**
     * 远程调用
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    /**
     * feign的日志通过代码的方式(也可以通过yml配置文件的方式)
     */
    @Bean
    public Logger.Level feignLogger() {
        return Logger.Level.FULL;
    }
}

单个回滚方法

/**
 * Hystrix实例:单个回滚
 * @author Jack.Hu
 */
@RestController
public class UserController {
   
    /**
     * 熔断机制
     * 异常后执行getFeignFallback()方法
     */
    @HystrixCommand(fallbackMethod = "getFeignFallback")
    @GetMapping("feign/{id}")
    public String getFeign(@PathVariable("id") int id) {
        int i = 1 / 0; // 异常
        return userFeign.getOrder1(id);
    }

    private String getFeignFallback(@PathVariable("id") int id) {
    	System.out.println("断路器生效。");
        return "提示:网络繁忙,请稍候再试。。" + id;
    }
}

访问请求:localhost:7001/feign/555
在这里插入图片描述
控制台
在这里插入图片描述

全局的回滚方法

/**
 * Hystrix实例:全局回滚
 * @author Jack.Hu
 */
@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class UserController {
   
    @GetMapping("feign/{id}")
    public String getFeign(@PathVariable("id") int id) {
        int i = 1 / 0; // 异常
        return userFeign.getOrder1(id);
    }

    private String defaultFallback() {
    	System.out.println("全局断路器生效。");
        return "提示:服务器繁忙,请稍候再试。。";
    }
}

访问请求:localhost:7001/feign/555
在这里插入图片描述
控制台
在这里插入图片描述

下面是我开发的小程序,感兴趣的小伙伴可以扫一扫

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值