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实现自定义错误处理的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud-feign客户端统一处理下游服务自定义异常(1.5.x版本下可以)