springcloud系列19——Feign使用fallbackFactory属性打印fallback异常

本文介绍如何在FeignClient中使用fallbackFactory属性处理服务不可用的情况,通过记录回退原因并自定义处理方法,确保应用程序的健壮性和用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在FeignClient中,我们通过制定fallback,可以在服务不可用时自动调用fallback制定的处理方法。

但如果如果希望同时知道发生回退的原因呢?

可以使用fallbackFactory属性。

下面以microservice-springcloud-movie-feign-with-hystrix模块来说明。

1.定义一个实现FallbackFactory的类
@Component
public class UserFeignClientHystrixFallbackFactory implements FallbackFactory<UserFeignClient>
{
    private Logger logger = LoggerFactory.getLogger(UserFeignClientHystrixFallbackFactory.class);

    @Override
    public UserFeignClient create(Throwable throwable)
    {
        logger.error("fallback reason:{}",throwable.getMessage());

        return new UserFeignClient()
        {
            @Override
            public User findUserById(Long userId)
            {
                User user = new User();
                user.setId(-1L);
                return user;
            }
        };
    }
}

如上,在发生回退时使用logger记录了回退的原因(异常),并返回了一个UserFeignClient,该实例重写了findUserById方法。

达到的效果就是在发生回退时,先打印回退原因,然后返回下面自定义的处理。

2.FeignClient类指定fallbackFactory属性。
// 不要同时使用fallback和fallbackFactory
@FeignClient(name = "microservice-springcloud-user"/*,fallback = UserHystrixClientFallback.class*/,fallbackFactory = UserFeignClientHystrixFallbackFactory.class)
public interface UserFeignClient {
    @RequestMapping(value = "/sample/{userId}", method = RequestMethod.GET)
    User findUserById(@PathVariable("userId") Long userId);
}

测试

1.启动Eureka Server;
2.启动user服务;
3.启动microservice-springcloud-movie-feign-with-hystrix。

浏览器访问/user/1,访问正常

关闭user服务,再次访问/user/1

可以看到,返回的是我们fallbackFactory中指定的处理方法的结果。

看控制台打印的异常信息是null

但实际上错误原因是TimeoutException,如下

现在多次刷新/user/1,使断路器打开。然后再次访问/user/1

现在回退的原因是断路器打开了。

注意

fallback和fallbackFactory只能指定一个,如果2个都指定了,生效的是fallback。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值