Feign调用异常触发降级捕获异常

通过配置fallbackFactory来捕获异常信息,代码如下

@FeignClient(name = "user", fallbackFactory = UserFallBackFactory.class)
public interface UserFeign {

    @PostMapping("/get/list")
    Map getList();
    
}
@Component
public class UserFallBackFactory implements FallbackFactory<UserFeign> {

    @Override
    public UserFeign create(Throwable throwable) {
        // 捕获具体异常信息
        String message= FeginUtil.getMessage(throwable);
        return new UserFeign() {
            @Override
            public Map getList() {
            	 Map<String, Object> map = new HashMap<>();
                 map.put("status", 500);
                 map.put("message", message);
                 return map;
            }
        }
    }
}
public class FeginUtil {

    public static String getMessage(Throwable e) {
        if (e instanceof FeignException) {
            FeignException feignException  = (FeignException) e;
            String url = feignException.request().url();
            int status = feignException.status();
            String message = feignException.getMessage();
            if (status == 404) {
                return "服务未找到:" + url;
            }
            if (message.contains("Read timed out")) {
                return "服务处理请求超时:" + url;
            }
            if (message.contains("connect timed out")) {
                return "服务连接超时:" + url;
            }
        }
        
        if (e instanceof RuntimeException) {
            RuntimeException runtimeException  = (RuntimeException) e;
            String message = runtimeException.getMessage();
            if (StringUtils.isNotEmpty(message)) {
                if (message.contains("Load balancer does not have available server for client")) {
                    String[] split = message.split(":");
                    if (split.length > 2) {
                        return "没有找到可用的服务:" + split[2];
                    }
                }
                if(message.contains("[") && message.contains("]")){
                    int startIndex = message.lastIndexOf("[") + 1;
                    int endIndex = message.lastIndexOf("]");
                    String result = message.substring(startIndex, endIndex); 
                    JSONObject jsonObject = JSONObject.parseObject(result);
                    return "服务调用异常:" + jsonObject.getString("exception");
                }
            }
        }
        return "系统异常:" + e.getMessage();
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用Feign进行服务之间的调用时,有时会遇到调用超时的情况。调用超时通常是由于网络延迟、目标服务负载过高或者调用方设置的超时时间过短所引起的。然而,即使发生调用超时,仍然可以通过一些处理方式来保证调用的成功。 首先,可以通过适当调整Feign的超时设置来解决调用超时的问题。可以增加Feign的超时时间,以便给目标服务更多的时间来响应请求。这样,就有更多的机会使调用在超时之前完成,并成功处理返回结果。通过调整超时时间,可以适应不同场景下的调用耗时需求,以确保调用的成功与稳定。 其次,可以通过使用断路器来处理调用超时的情况。断路器可以将调用超时的请求直接快速失败,而不是一直等待超时结束。通过断路器的配置,可以设置一个适当的超时时间阈值,当调用超过这个时间后就会触发断路器的降级操作。在断路器触发后,可以通过提供默认结果或者进一步处理异常来保证调用的成功。 最后,可以结合重试策略来处理调用超时。当一个调用发生超时时,可以通过重新发起调用的方式进行重试。通过合理设置重试次数和间隔时间,可以增加调用成功的机会。同时,可以结合断路器来避免无限制的重试,以保护系统的稳定性。 总结而言,当Feign调用超时但是处理成功时,可以通过调整超时时间、使用断路器和结合重试策略等方式来保证调用的成功。这些处理方式可以根据实际情况进行灵活选择,以提高系统的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值