【Spring Cloud】Feign调用异常触发降级后如何捕获异常

一、问题背景

在Spring Cloud的微服务架构中,通常微服务之间通过feign/openfeign来进行http调用,并且启用hystrix并配置降级策略fallback,可以在http调用异常时触发降级,代码如下

@FeignClient(name = "resourceFeign", fallback = ResourceFeignFallback.class)
public interface ResourceFeign {
    @PostMapping("/resource/list")
    Map<String, Object> resourceList();
}

@Component
public class ResourceFeignFallback implements ResourceFeign {

  @Override
  public Map<String, Object> resourceList() {
    Map result = new HashMap<>();
    result.put("code", 500);
    result.put("msg", "请求异常");
    return result;
  }
}

但是这种方式在http调用异常时,会直接执行降级策略,而无法捕获到具体的异常信息,这种情况如何解决?

二、解决方法

所以我们通常使用另一种方式,通过配置fallbackFactory来捕获异常信息,代码如下

@FeignClient(name = "resourceFeign", fallbackFactory = ResourceFeignFallbackFactory.class)
public interface ResourceFeign {
    @PostMapping("/resource/list")
    Map<String, Object> resourceList();
}

@Component
@Slf4j
public class ResourceWebFeignFallbackFactory implements FallbackFactory<ResourceFeign> {

    @Override
    public ResourceFeign create(Throwable throwable) {
        // 捕获异常
        log.error(throwable.getMessage());

        return new ResourceFeign() {
            @Override
            public Map<String, Object> resourceList() {
                  Map result = new HashMap<>();
                  result.put("code", 500);
                  result.put("msg", "请求异常");
                  return result;
            }
        };
    }
}

这样就可以捕获到http调用的异常信息

curd高级工程师

1.3k 声望
492 粉丝
0 条评论
推荐阅读
【Redisson】分布式锁的源码解析
分布式锁在实际工作中的应用还是比较多的,其实现方式也有很多种,常见的有基于数据库锁、基于zookeeper、基于redis的,今天我们来讲下基于redis实现的分布式锁。

kamier阅读 762

SpringCloud-使用Feign跨服务调用最佳方式
最近在学习如何使用springcloud,当学习到跨服务调用接口时接触到Feign和Ribbon,网上有好多文章是介绍他们俩的区别的,有兴趣的可以看看,本文主要推荐使用Feign并记录操作过程。

Awbeci2阅读 3.2k

5大主流方案对比:MySQL千亿级数据线上平滑扩容实战
在项目初期,我们部署了三个数据库A、B、C,此时数据库的规模可以满足我们的业务需求。为了将数据做到平均分配,我们在Service服务层使用uid%3进行取模分片,从而将数据平均分配到三个数据库中。

码猿技术专栏2阅读 629

SpringCloud Gateway 通过 Nacos 配置动态路由 (代码片段)
{代码...}

毛宇鹏阅读 3.9k

Java-微服务架构之认证服务
之前通过阅读《Spring微服务实战》写过关于spring-cloud+spring-security+oauth2的认证服务和资源服务文章,以及写过关于spring-gateway做token校验的文章,但是在实战过程中还是发现一些问题,于是通过跟朋友沟...

Awbeci阅读 1.1k

一天吃透SpringCloud面试八股文
Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。

程序员大彬阅读 548

Ribbon的基础使用模板
Ribbon是Spring Cloud核心组件之一,它提供的最重要的功能就是负载均衡,和硬件负载均衡F5不同,它的负载均衡是基于客户端的,Zuul网关和Feign可以通过Ribbon轻松的实现服务的负载均衡,同时避免了与业务无关的冗...

不语阅读 464

curd高级工程师

1.3k 声望
492 粉丝
宣传栏