⑤. 服务降级(cloud-provider-hystrix-payment8001)
- ①. 在主启动类上添加注解:@EnableCircuitBreaker(开启服务降级)
- ②. 在service中添加服务降级的方法
(我们设置了3s之内是正常的,如果超过了3s就有兜底的方法)
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = { @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000") }) public String paymentInfo_TimeOut(Integer id){ int timeNumber =3 ; //int age=10/0; try { TimeUnit.SECONDS.sleep(timeNumber); }catch (Exception e) {e.printStackTrace();} return "线程池:"+Thread.currentThread().getName()+" paymentInfo_TimeOut,id: "+id+"\t"+"呜呜呜"+" 耗时(秒)"+timeNumber; } public String paymentInfo_TimeOutHandler(Integer id){ return "线程池:"+Thread.currentThread().getName()+" paymentInfo_TimeOutHandler,id: "+id+"\t"+"O(∩_∩)O" ; }
③. 一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
⑥. 服务降级(cloud-consumer-feign-hystrix-order80)
- ①. 80订单微服务,也可以更好的保护自己,自己也依样画葫芦进行客户端降级保护
(我们自己配置过的热部署方式对java代码的改动明显,但对@HystrixCommand内属性的修改建议重启微服务)
- ②. yaml
feign: hystrix: enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。
- ③. 主启动类上添加 @EnableHystrix
- ④. 在controller中添加如下方法进行兜底处理
@GetMapping("/consumer/hystrix/timeout/{id}") @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = { @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500") }) //@HystrixCommand //这里设置的时间是1.5s,就是说调用服务会等待1.5s,如果超过了就会走fallbackMethod方法 //而我们在支付的微服务中,时间是3s public String paymentInfo_TimeOut(@PathVariable("id") Integer id) { return paymentHystrixService.paymentInfo_TimeOut(id); } public String paymentTimeOutFallbackMethod(@PathVariable Integer id) { return "我是消费者80,对方支付系统繁忙请10分钟后再试或者自己运行出错请检查自己!"; }
⑤. 我们在8001端进行了3s的延迟处理,这里80端去调用8001端的时候,如果超过了1.5s就会走兜底的方法
⑦. 目前的问题
每个业务方法对应一个兜底的方法,代码膨胀
统一和自定义的分开
⑧. 解决办法在controller类中添加上@DefaultProperties(defaultFallback=" “)
每个方法配置一个服务降级方法,技术上可以,实际上不合理
除了个别重要核心业务有专属,其他普通的可以通过@DefaultProperties(defaultFallback=”")统一跳转
@RestController @Slf4j @DefaultProperties(defaultFallback = "payment_Global_FallbackMethod") public class OrderHystrixController { @Resource private PaymentHystrixService paymentHystrixService; /*1>.OK*/ @GetMapping("/consumer/hystrix/ok/{id}") public String paymentInfo_OK(@PathVariable("id") Integer id) { return paymentHystrixService.paymentInfo_OK(id); } /*2>.timeOut*/ @GetMapping("/consumer/hystrix/timeout/{id}") // @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = { // @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500") // }) @HystrixCommand // //这里设置的时间是1.5s,就是说调用服务会等待1.5s,如果超过了就会走fallbackMethod方法 //而我们在支付的微服务中,时间是3s public String paymentInfo_TimeOut(@PathVariable("id") Integer id) { return paymentHystrixService.paymentInfo_TimeOut(id); } public String paymentTimeOutFallbackMethod(@PathVariable Integer id) { return "我是消费者80,对方支付系统繁忙请10分钟后再试或者自己运行出错请检查自己!"; } //globol fallback //下面是全局fallback方法 public String payment_Global_FallbackMethod() { return "Global异常处理信息,请稍后再试!!"; } }