风萧萧兮易水寒

Spring Cloud Hystrix断路器(四)

前言

在微服务场景中,通常会有很多层的服务调用。如果一个底层服务出现问题,故障会被向上传播给用户。我们需要一种机制,当底层服务不可用时,可以阻断故障的传播。这就是断路器的作用。他是系统服务稳定性的最后一重保障。

常常会遇到正在使用某个系统,点击到某一个功能的时候显示该模块正在升级或者请稍后查看等。怎么实现呢??

使用Feign整合Hystrix

默认是不开启的,需要修改配置文件application.yml,添加下面的代码

feign:
  hystrix:
    #开启Hystrix熔断,默认false
    enabled: true

新增支付模块熔断器

/**
 * @ Description   :  支付模块熔断器
 * @ Author        :  GMaya
 * @ CreateDate    :  2020/3/18 9:35
 * @ Version       :  1.0
 */
@Component
public class PayClientFallBack implements PayClient {
    @Override public String getPay() {
        return "支付模块正在抢修,请稍后!" +" :feign演示";
    };
};


修改PayClient接口

@FeignClient(name = "pay",fallback = PayClientFallBack.class) // 服务名称

启动服务端,启动pay客户端,启动order客户端。
访问http://localhost:8082/getOrder

然后把pay客户端关掉!

使用RestTemplat整合Hystrix

pom添加j依赖

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

启动类新增注解

@EnableCircuitBreaker

或者

@SpringBootApplication+@EnableDiscoveryClient+@EnableCircuitBreaker
也可以使用@SpringCloudApplication 一个顶替仨

SpringCloudApplication注解 源码:

修改订单接口

/**
 * @ Description   :  订单接口接口
 * @ Author        :  GMaya
 * @ CreateDate    :  2020/3/16 11:03
 * @ Version       :  1.0
 */
@RestController
public class OrderController {

//    @Autowired
//    private PayClient payClient; // 注入支付模块服务

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/getOrder")
    @HystrixCommand(fallbackMethod = "getRestTemplateFallBack")
    public String getOrder(){
        String pay = restTemplate.getForObject("http://pay/getPay", String.class);
        //        String pay = payClient.getPay();
        return pay;
    };

    private String getRestTemplateFallBack(){
        return "不好啦,机房着火了,restTemplate演示!";
    };
};


当然,当接口多的时候,还可以改造

/**
 * @ Description   :  订单接口接口
 * @ Author        :  GMaya
 * @ CreateDate    :  2020/3/16 11:03
 * @ Version       :  1.0
 */
@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class OrderController {

//    @Autowired
//    private PayClient payClient; // 注入支付模块服务

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/getOrder")
//    @HystrixCommand(fallbackMethod = "getRestTemplateFallBack")
    @HystrixCommand // 使用默认熔断,加一个注解就行
    public String getOrder(){
        String pay = restTemplate.getForObject("http://pay/getPay", String.class);
        //        String pay = payClient.getPay();
        return pay;
    };

    private String getRestTemplateFallBack(){
        return "不好啦,机房着火了,restTemplate演示!";
    };

    private String defaultFallback(){
        return "默认熔断!";
    };
};


重启查看


最后:
额外配置,如需更多,请查看专业解释

如果设置和默认值一样,没必要写出来配置

feign:
  hystrix:
    #开启Hystrix熔断,默认false
    enabled: true
hystrix:
  command:
    # 全局设置
    default:
      execution:
        isolation:
          # 命令执行超时时间,默认1000ms,只在线程池隔离中有效。
          thread:
            timeoutInMilliseconds: 1000
            # 发生超时是是否中断,默认true,只在线程池隔离中有效。
            interruptOnTimeout: true
        # 执行是否启用超时,默认启用true,只在线程池隔离中有效。
        timeout:
          enabled: true
坚持原创技术分享,您的支持将鼓励我继续创作!