SpringCloud学习(十三):Hystrix的服务降级实现
1、订单侧使用fallback
在cloud-provider-payment8001中完成
(1)为paymentInfo_TimeOut写一个降级的服务
当我们当前的方法不能正常运行时,需要有一个方法来为他兜底
public String paymentInfo_TimeOutHandler(Integer id) { return "线程池: "+Thread.currentThread().getName()+" 8001系统繁忙或者运行报错,请稍后再试,id: "+id+" "+"o(╥﹏╥)o"; }
(2)开启和激活服务降级
为paymentInfo_TimeOut加上@HystrixCommand注解,并在主启动类上添加@EnableCircuitBreaker注解
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = { @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000") }) public String paymentInfo_TimeOut(Integer id) { int timeNumber = 5; // int age = 10/0; try { TimeUnit.SECONDS.sleep(timeNumber); } catch (InterruptedException e) { e.printStackTrace(); } return "线程池: "+Thread.currentThread().getName()+" id: "+id+" "+"O(∩_∩)O哈哈~"+" 耗时(秒): "+timeNumber; } public String paymentInfo_TimeOutHandler(Integer id) { return "线程池: "+Thread.currentThread().getName()+" 8001系统繁忙或者运行报错,请稍后再试,id: "+id+" "+"o(╥﹏╥)o"; }
(3)运行测试
1.测试超时
在浏览器地址栏输入
http://localhost:8001/payment/hystrix/timeout/1
2.测试异常
将代码中睡眠5秒的代码注释掉,将模拟异常的 int age = 10/0; 注释打开,重启测试
2、服务侧使用fallback
这里涉及到一个重要的常识:Hystrix不仅能放在消费侧,也能放在服务侧。
(1)yml
1. feign: 2. hystrix: 3. enabled: true
2)在主启动类上加上@EnableHystrix注解
(3)逻辑代码
与上面订单侧一致
(4)运行测试
启动7001、8001、80,在浏览器地址栏输入
http://localhost:90/consumer/payment/hystrix/timeout/1
3、解决代码膨胀
使用DefaultProperties
假如每个方法都需要一个兜底的降级方法,那一百个方法就需要一百个兜底,而这些兜底方法的代码逻辑往往大同小异,导致代码膨胀,于是我们可以写一个全局通用的降级方法。
(1)在类上加上注解@DefaultProperties
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
(2)暂时把fallbackMethod里的内容注释
因为就近原则,fallbackMethod里的内容会干扰我们的测试,但是不要注释掉@HystrixCommand了。
@RestController @Slf4j @DefaultProperties(defaultFallback = "payment_Global_FallbackMethod") public class OrderHystrixController { @Autowired private PaymentHystrixService paymentHystrixService; @GetMapping("/consumer/payment/hystrix/ok/{id}") public String paymentInfo_OK(@PathVariable("id") Integer id) { String result = paymentHystrixService.paymentInfo_OK(id); log.info("===========result:" + result); return result; } @GetMapping("/consumer/payment/hystrix/timeout/{id}") @HystrixCommand // (fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = { // @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500") // }) public String paymentInfo_TimeOut(@PathVariable("id") Integer id) { // int i = 10/0; String result = paymentHystrixService.paymentInfo_TimeOut(id); log.info("===========result:" + result); return result; } public String paymentInfo_TimeOutHandler(Integer id) { return "线程池: "+Thread.currentThread().getName()+" 8001系统繁忙或者运行报错,请稍后再试,id: "+id+" "+"o(╥﹏╥)o"; } // 全局fallback方法 public String payment_Global_FallbackMethod() { return "Global异常处理信息,请稍后再试,/(ㄒoㄒ)/~~"; } }
(3)运行测试
4、实现解耦
现在我们将fallback方法写在controller层上,那么有其他服务又要为每个服务配置fallback,并且与业务逻辑代码混在一起,耦合度高;并且在客户端去调用服务端时,若遇上服务端宕机,就不能实现服务降级。于是我们可以在80服务中单独写一个类继承service接口,来处理服务降级。
1、新建PaymentFallbackService类,实现80服务中的PaymentHystrixService接口
@Component public class PaymentFallbackService implements PaymentHystrixService{ @Override public String paymentInfo_OK(Integer id) { return "----------PaymentHystrixService`s fallback-----------------"; } @Override public String paymentInfo_TimeOut(Integer id) { return "----------PaymentHystrixService`s fallback-----------------"; } }
2、 在service接口上标注
3、运行测试
将之前配置的全局fallback方法暂时注释掉,重新运行。
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的