Hystrix服务降级,一般产生原因三种:
1、运行时异常
2、超时
3、宕机
一般fallback方式有两种:
一种:控制层面
是在controller实现类上加@DefaultProperties(defaultFallback = “ExceptionController”)
@RestController
@DefaultProperties(defaultFallback = "ExceptionController")
public class HystirxController {
@Resource
HystrixService hystrixService;
@HystrixCommand
@GetMapping("/test/runtimeException")
public String RuntimeExceptionController(){
int a = 10/0;
hystrixService.getHystrixMessage();
return "成功";
}
public String ExceptionController()
{
return "服务器异常,请稍后再试";
}
}
ExceptionController是我定义的方法,具体逻辑是在服务异常时需要返回你设置的信息
这个是默认全局的,在当前controller类中的所有方法发生服务异常时,都会触发fallback
当然触发的前提是方法上面需要添加@HystrixCommand注解,来使用Hystrix降级操作;
调用接口返回:
服务器异常,请稍后再试
你也可以单独给一个方法单独设置fallback 比如:
@RestController
@DefaultProperties(defaultFallback = "ExceptionController")
public class HystirxController {
@Resource
HystrixService hystrixService;
@HystrixCommand(fallbackMethod = "SingleController")
@GetMapping("/test")
public String SingleHystirxController()
{
int a = 10/0;
hystrixService.getHystrixMessage();
return “”;
}
public String ExceptionController()
{
return "服务器异常,请稍后再试";
}
public String SingleController(){
return "单独处理";
}
}
调用SingleHystirxController运行时异常时,该方法会返回单独设置的fallback,而不是返回DefaultProperties设置的defaultFallback
调用接口返回:
单独处理
第二种:逻辑层面
controller层调用的service接口,用了@FeignClient注解,FeignClient是服务调用,把客户端与服务器端注入eureka,来调用我们的服务器端的接口,fallback的是继承HystrixService 类为其设计的fallback处理逻辑,避免代码耦合
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = FallbackService .class)
public interface HystrixService {
@GetMapping("")
public String getHystrixMessage();
}
@Component
public class FallbackService implements HystrixService {
@Override
public String getHystrixMessage() {
return "逻辑方法返回单独处理";
}
}
访问SingleHystirxController调用getHystrixMessage返回:
逻辑方法返回单独处理
我们再回顾下fallback的位置
1、控制类HystirxController上DefaultProperties注解默认fallback
2、控制层执行方法SingleHystirxController上HystrixCommand注解单独设置的fallback
3、调用service方法@FeignClient(fallback = FallbackService .class)
fallback优先显示:3>2>1