SpringCloud中Feign为什么总是打印不出报错信息?

724 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

写在前面

Feign是微服务中服务间调用的优选组件,后来的OpenFeign也是基于此来开展的。

我会创建一个新的专栏,来保存我最近使用Feign的一些心得和问题点,欢迎大家关注。

为什么要打印出Feign的报错信息

总是会碰到Feign调不通的时候,这种问题的出现简直是五花八门。

有可能是路径错误!

有可能是服务连接不上!

有可能是Nacos命名空间和他人一致,发送到他人服务上去了!

总之千奇百怪,而目前项目框架中,还总是只使用fallback来实现Feign接口,这就导致了我明明知道出问题了,但是出的什么问题却不知道。

所以,不得不将Feign的报错信息全部打印出来。

解决方案

Feign提供了FallBackFactory工厂类,只需要实现这个工厂类,就能捕获到feign接口的全部异常。

首先在Feign接口中进行调整,调整完后如下:

@FeignClient(value = 'other', fallbackFactory = FileFallbackFactory.class)
public interface FileFeign {
}

在@FeignClient注解中声明fallbackFactory即可。

接下来实现FileFallbackFactory类。

@Slf4j
@Component
public class FileFallbackFactory implements FallbackFactory<FileFallback> {

    @Override
    public FileFallback create(Throwable throwable) {
        log.error(throwable.getMessage());
        throwable.printStackTrace();
        return new FileFallback();
    }

}

@Slf4j
class FileFallback implements FileFeign {

}

通过实现FallBackFactory工厂类中create方法,即可捕获所有经过Feign接口的异常,而且也可以兼容fallback类。

只需要再从当前文件中声明一个子类即可。

期间我遇到了哪些问题?

关于Feign是使用Fallback比较好,还是使用FallbackFactory比较好,这是困扰我的一个问题。

这其中就是是否捕获异常的区别。

想了很久,我大概是这样做的。

正式上线的情况,可以采用Fallback,毕竟只是处理异常,不是抛出异常。

测试环境,还是尽量是FallbackFactory,报错全一些,代码编写时也能轻松一些。

总结

在编写代码的过程中,没办法获取到所有的错误简直就是灾难,不能和代码有信息差。