目录

  • Hystrix熔断器
  • 服务端降级演练
  • 客户端降级演练
  • 全局降级方法
  • 解耦熔断降级
  • 总结


Hystrix熔断器

在微服务架构中,当某个服务不可用,或出现故障,可能会导致调用它的服务线程等待,严重的出现多个服务阻塞,引发连锁的雪崩效应。

熔断器的思想就是,在中间服务出现故障是,向服务调用方返回一个预期的、可处理的降级响应,而不是返回调用方一个不能处理的异常。

Spring Cloud Hystrix 是基于 Netflix 公司的开源组件 Hystrix 实现的,它提供了熔断器功能,能够有效地阻止分布式微服务系统中出现联动故障,以提高微服务系统的弹性。Spring Cloud Hystrix 具有服务降级、服务熔断、线程隔离、请求缓存、请求合并以及实时故障监控等强大功能。

服务端降级演练

1.producer服务提供的接口

@Controller
@RequestMapping("/orderService/service")
public class UserController {

    @Autowired
    private HystrixService hystrixService;

    @ResponseBody
    @RequestMapping("/getInfoOut")
    public String getInfoOut(){
        return hystrixService.getInfoTimeOut();
    }
}

2.业务类HystrixService

在方法上使用@HystrixCommand注解,fallbackMethod指定降级方法名称,@HystrixProperty指定特定的的异常情况;

execution.isolation.thread.timeoutInMilliseconds 用于设置调用超时时间的峰值,超出时间峰值则执行降级方法。

@Service
public class HystrixServiceImpl implements HystrixService {
  
    @HystrixCommand(fallbackMethod = "dealTimeOut",
            commandProperties = {
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")})
    @Override
    public String getInfoTimeOut() {
        try {
            TimeUnit.SECONDS.sleep(6);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "producer info return";
    }

    public String dealTimeOut() {
        return "系统忙,稍后重试";
    }
}

3.consumer服务调用

@Controller
@RequestMapping("/orderService/service")
public class UserController {

    @Autowired
    FeignService feignService;

    @ResponseBody
    @RequestMapping("/getInfoOut")
    public String getInfoOut(){
        return feignService.getInfoOut();
    }
}

访问http://localhost:8092/orderService/service/getInfoOut接口,返回:

微服务中的 lombok 微服务中的熔断器作用_java

因为接口调用方法超时异常,断路器将方法请求打到了降级方法,故接口返回降级方法的响应信息。

客户端降级演练

1.调用方启动类添加使用@EnableHystrix注解

@EnableFeignClients
@EnableHystrix
@SpringBootApplication
public class ConsumerApplication {

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

}

2.调用方接口方法使用@HystrixCommand注解

@Controller
@RequestMapping("/orderService/service")
public class UserController {

    @Autowired
    FeignService feignService;

    @ResponseBody
    @RequestMapping("/getInfo")
    @HystrixCommand(fallbackMethod = "dealTimeOut")
    public String getInfo(){
        return feignService.getInfo();
    }

    public String dealTimeOut() {
        return "客户端自己处理熔断降级";
    }
}

3.服务提供方接口方法加一个6秒等待

@Controller
@RequestMapping("/orderService/service")
public class UserController {

    @ResponseBody
    @RequestMapping("/getInfo")
    public String getInfo(){
        try {
            TimeUnit.SECONDS.sleep(6);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "producer info";
    }
}

访问http://localhost:8092/orderService/service/getInfo接口,返回:

微服务中的 lombok 微服务中的熔断器作用_java_02

全局降级方法

1.在调用方controller类上使用注解@DefaultProperties,指定defaultFallback降级方法

2.在同类下创建全局的降级方法,此处dealTimeOut()

3.在接口方式上直接使用注解@HystrixCommand即可

@DefaultProperties(defaultFallback = "dealTimeOut")
@Controller
@RequestMapping("/orderService/service")
public class UserController {
    
    @Autowired
    FeignService feignService;
    
    @HystrixCommand
    @ResponseBody
    @RequestMapping("/getInfo")
    public String getInfo(){
        return feignService.getInfo();
    }
    
    public String dealTimeOut() {
        return "客户端全局处理熔断降级";
    }
    
}

访问http://localhost:8092/orderService/service/getInfo接口,返回:

微服务中的 lombok 微服务中的熔断器作用_spring cloud_03

解耦熔断降级

1.新建一个实现类FeignFallBackServiceImpl,实现标注了@FeignClient注解的业务接口FeignService,此实现类里面的方法编写熔断逻辑

@Component
public class FeignFallBackServiceImpl implements FeignService {

    @Override
    public String getInfo() {
        return "解耦熔断降级处理";
    }
}

2.业务接口@FeignClient注解里面指定fallback属性值,即为刚新建的实现类FeignFallBackServiceImpl.class

@Component
@FeignClient(value = "producer-service", fallback = FeignFallBackServiceImpl.class)
public interface FeignService {

    @RequestMapping(value = "orderService/service/getInfo", method = RequestMethod.GET)
    String getInfo();
}

访问http://localhost:8092/orderService/service/getInfo接口,返回:

微服务中的 lombok 微服务中的熔断器作用_spring boot_04

总结

本文通过代码示例介绍了hystrix熔断器在微服务项目开发中如何使用,从业务层粒度熔断降级处理,到全局熔断降级处理,以及解耦业务和熔断降级逻辑,更灵活的使用hystrix