Feign实现自定义错误处理

Posted mufeng3421

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Feign实现自定义错误处理相关的知识,希望对你有一定的参考价值。

关键操作

实现ErrorDecoder接口

问题和背景

最近项目中在大量使用Feign和OkHttp作为http客户端使用,开发效率得到显著的提升。但也面临一些问题,比如每个下游系统的异常返回方式不同,需要编写大量的错误处理代码来适应不同的服务,而且错误处理代码混在业务代码中,违反单一职责原则和最少知识原则。面临着维护难度上升的风险。需要一个方案来规避这些后期维护成本上升的风险。

目的

防止项目腐化,避免错误处理代码与业务代码强耦合。导致后期的维护成本的上升和陷入逻辑迷宫的风险。保证灵活性和高可维护性

手段

拆分错误处理代码和业务逻辑代码。由于使用的是 Feign和OkHttp作为客户端,而企业场景下的开发通常有统一Trac请求的需求。首先想到的是客户端的请求和响应的拦截器实现。

实施

查询Feign的资料后发现Feign有 ErrorDecoder 接口。资料点这里
那我们只要实现Feign的 ErrorDecoder 的接口就可以实现 http请求层面的错误处理。

官方示例

public class StashErrorDecoder implements ErrorDecoder {

    @Override
    public Exception decode(String methodKey, Response response) {
        if (response.status() >= 400 && response.status() <= 499) {
            return new StashClientException(
                    response.status(),
                    response.reason()
            );
        }
        if (response.status() >= 500 && response.status() <= 599) {
            return new StashServerException(
                    response.status(),
                    response.reason()
            );
        }
        return errorStatus(methodKey, response);
    }
}

解读

StashErrorDecoder类实现了ErrorDecoder接口。在Feign客户端发生http请求层面的错误时会调用decode方法。在decode方法中实现自定义的错误处理。

使用

接下来就需要注册这个错误拦截器了,如果是直接手动构建FeignClient的使用方法。那需要在构建客户端时指定errorDecoder

return Feign.builder()
                .errorDecoder(new StashErrorDecoder())
                .target(StashApi.class, url);

如果是使用了spring-cloud-open-feign的使用方式,包含了启动的自动配置,所以只需要将错误处理类注册为配置类,即添加@Configuration注解即可。

@Configuration
public class StashErrorDecoder implements ErrorDecoder {
    @Override
    public Exception decode(String methodKey, Response response) {
        // 实现代码
    }
}

以上是关于Feign实现自定义错误处理的主要内容,如果未能解决你的问题,请参考以下文章

Feign自定义配置详解

在python 3.6中处理自定义编码时遇到类型错误

SpringCloud-feign客户端统一处理下游服务自定义异常(1.5.x版本下可以)

Spring Cloud Feign实现自定义复杂对象传参

2021-09-24 ruoyi框架中使用feign自定义服务,fegin使用遇到的坑

SpringCloud学习之feign