原文作者作者:任聪
前言:此文所述处理方式为本人在实践过程中研究分析得出的一种解决方案。
本文不仅希望能为 SC 学习者提供一种如题问题的一种解决方案,并且希望通过本文引出各位 SC 的朋友对如题问题的共同探讨和最佳实践方案的分享。
场景及痛点
- 单个项目是通过 Jersey 来实现 restful 风格的架构
- 发生异常时异常信息总是提示没有回调方法,不能显示基础服务抛出的异常信息
- 暂时没有考虑发生异常之后进行回调返回特定内容
- 业务系统通过 feign 调用基础服务,基础服务是会根据请求抛出各种请求异常的(采用标准http状态码),现在我的想法是如果调用基础服务时发生请求异常,业务系统返回的能够返回基础服务抛出的状态码
- 当然基础服务抛出的请求异常不能触发 hystrix 的熔断机制
问题分析与解决方案
解决思路
- 通过网上一些资料的查询,看到很多文章会说 HystrixBadRequestException 不会触发 hystrix 的熔断 --> 但是并没有介绍该异常的实践方案
- 感觉要解决项目的痛点,切入点应该就在 HystrixBadRequestException 了。于是先看源码,一方面对 Hystrix 加深理解,尝试理解作者设计的初衷与想法,另一方面看看是否能找到其他方案达到较高的实践标准
主要类对象简介
- interface UserRemoteCall 定义feign的接口其上会有 @FeignClient,FeignClient 定义了自己的 Configuration --> FeignConfiguration
- class FeignConfiguration 这里是定义了指定 Feign 接口使用的自定义配置,如果不想该配置成为全局配置,不要让该类被自动扫描到
- class UserErrorDecoder implements ErrorDecoder 该类会处理响应状态码 (![200,300) || !404)
源码分析
Feign 的默认配置在 org.springframework.cloud.netflix.feign.FeignClientsConfiguration类中,如果不自定义Feign.Builder,会优先配置 feign.hystrix.HystrixFeign.Builder extends Feign.Builder,该类会让 Feign 的内部调用受到 Hystrix 的控制
//省略部分代码@Configuration@ConditionalOnClass({ HystrixCommand.class, HystrixFeign.class })protected static class HystrixFeignConfiguration { @Bean @Scope("prototype") @ConditionalOnMissingBean @ConditionalOnProperty(name = "feign.hystrix.enabled