SpringCloud系列之Hystrix业务异常处理实战
一、问题提出
在SpringCloud实践过程中,你是否也有以下疑问:
系统运作过程中,服务端抛出业务异常,FeignClient(Hystrix命令)执行失败并触发服务降级处理逻辑,再调用几次,你发现服务端接不到请求了,直接进入了Hystrix的“服务降级处理逻辑”,百思不得其解。
这也算是当时SpringCloud实践中比较棘手的问题之一了,就算你搜遍百度、Google也搜不到合理的解释和解决方案,啊,西湖的水,我的泪....
二、解决思路分析
Cloud组件调用流程:消费者发起请求 -> Ribbon -> Hystrix -> Feign -> 提供者
既然这是一个自定义的业务异常,自然需要Feign、Hystrix识别到这是一个业务异常,为了达到这一目标,我们需要当服务端抛出业务异常时,解决以下两个问题:
- Feign如何包装错误信息
- Hystrix如何跳过故障度量逻辑、服务降级逻辑
三、深入GayHub
针对问题1,笔者在源码中翻到了ErrorDecoder,感兴趣的朋友可以看以下源代码。
Feign中如果服务返回的状态码不是200,就会进入到Feign的ErrorDecoder中,因此如果我们要解析异常信息,就要重写ErrorDecoder
针对问题2,笔者带着疑问,最终在GayHub的issues中觅得了“佳人”,以下是HystrixBadRequestException异常说明原文。
All exceptions thrown from the run() method except for HystrixBadRequestException count as failures and trigger getFallback() and circuit-breaker logic.
You can wrap the exception that you would like to throw in HystrixBadRequestException and retrieve it via getCause(). The HystrixBadRequestException is intended for use cases such as reporting illegal arguments or non-system failures that should not count against the failure metrics and should not trigger fallback logic.
Failure Type | Exception class | Exception.cause | subject to fallback |
---|---|---|---|
FAILURE | HystrixRuntimeException | underlying exception (user-controlled) | YES |
TIMEOUT | HystrixRuntimeException | j.u.c.TimeoutException | YES |
SHORT_CIRCUITED | HystrixRuntimeException | j.l.RuntimeException | YES |
THREAD_POOL_REJECTED | HystrixRuntimeException | j.u.c.RejectedExecutionException | YES |
SEMAPHORE_REJECTED | HystrixRuntimeException | j.l.RuntimeException | YES |
BAD_REQUEST | HystrixBadRequestException | underlying exception (user-controlled) | NO |
简单翻译下就是,发生非HystrixBadRequestException异常时将会执行失败并触发服务降级处理逻辑,参数异常以及非系统异常不应计入故障度量以及服务降级处理,你可以包装异常的cause到HystrixBadRequestException中, 文中还附上了5中会被fallback的失败类型。
- FAILURE:执行失败,抛出异常。
- TIMEOUT:执行超时。
- SHORT_CIRCUITED:断路器打开。
- THREAD_POOL_REJECTED:线程池拒绝。
- SEMAPHORE_REJECTED:信号量拒绝。
四、SpringCloud实践方案
Feign利用HttpStatus来作为是否为异常请求的判断依据,在开发过程中可以定义一系列的业务异常状态码区间,例如笔者就比较喜欢把400-500作为业务异常码段,然后将这些错误码段的异常处理为HystrixBadRequestException。
/** * Feign的错误解码器 * @version Revision: 0.0.1 * @author: weihuang.peng * @Date: 2019-03-25 */ public class FeignErrorDecode implements ErrorDecoder { @Override public Exception decode(String methodKey, Response response) { // 这一部分的异常将会变成子系统的异常, 不会进入hystrix的fallback方法,将会进入ErrorFilter的过滤链路 if (response.status() >= HttpStatus.BAD_REQUEST.value() && response.status() < HttpStatus.INTERNAL_SERVER_ERROR.value()) { try { InputStream is = response.body().asInputStream(); Result receipt = JSON.parseObject(IOUtils.toString(is), Result.class); return BaseException.getInstance(receipt); } catch (Exception e) { } } // 这一部分会进入fallback return feign.FeignException.errorStatus(methodKey, response); } } @Configuration public class FeignConfiguration { /** * 业务异常解码器 * @return */ @Bean public ErrorDecoder getErrorDecoder() { return new FeignErrorDecode(); } }
这里有一个关注点:
- BaseException需要继承HystrixBadRequestException
- Feign的ErrorDecoder需要对业务异常的HttpStatus进行定义
五、源码分享
以下是笔者业务异常包装的案例,感兴趣的朋友可以关注以下。
https://github.com/pwh19920920/feign-hystrix-business-exception
六、引用参考
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
超详细!4小时开发一个SpringBoot+vue前后端分离博客项目!!
作者:吕一明 项目代码:https://github.com/MarkerHub/vueblog 项目视频:https://www.bilibili.com/video/BV1PQ4y1P7hZ/ 转载请保留此引用,感谢! 前后端分离项目 文章总体分为2大部分,Java后端接口和vue前端页面,比较长,因为不想分开发布,真正想你4小时学会,哈哈。 先看效果: 不多说,开始敲代码。 Java后端接口开发 1、前言 从零开始搭建一个项目骨架,最好选择合适,熟悉的技术,并且在未来易拓展,适合微服务化体系等。所以一般以Springboot作为我们的框架基础,这是离不开的了。 然后数据层,我们常用的是Mybatis,易上手,方便维护。但是单表操作比较困难,特别是添加字段或减少字段的时候,比较繁琐,所以这里我推荐使用Mybatis Plus(https://mp.baomidou.com/),为简化开发而生,只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间。 作为一个项目骨架,权限也是我们不能忽略的,Shiro配置简单,使用也简单,所以使用Shiro作为我们的的权限。 考虑到项目可能需...
- 下一篇
突发!HashiCorp禁止在中国使用企业版VAULT软件
前言 昨天HashiCorp突然发布一则消息,禁止在中国使用Vault软件的企业版本,官方申明是这样的: HashiCorp的解释是因为中国的出口管制的原因导致无法出售HASHICORP软件或者使用企业版的Vault。所以在没有取得HashiCorp书面协议的前提下,不得在中国境内使用,部署和安装HashiCorp的Vault企业版本软件。 注意,这里只是禁止使用企业版本的Vault软件,个人版本和HashiCorp公司的其他软件并不在此限制之内。大家不要被网络上面的谣言所迷惑,一定要勇于探索真理。 HashiCorp公司介绍 那么这个影响到底对我们有多大呢?我们先看下HashiCorp公司的成长史。 更多精彩内容且看: 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新 Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新 Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新 java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程 HashiCorp于2012年成立,由M...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6