SpringCloud-Hystrix-如何使用Fallback

先介绍一下我所在的团队使用Fallback的使用方式
  • FallBack的返回内容是null或者一个空集合,如下代码所示
public class ProductClientFallBack implements SdbProductClient {

    @Override
    public List<ProductVO> queryAllProducts() {
        return Lists.newArrayList();
    }

    @Override
    public ProductVO getProductById(int productId) {
        return null;
    }
}
  • Fallback文件由服务方提供
  • 针对现行的使用方式我产生了两个疑问/问题

    FallBack方法中直接返回null或者空集合这样真的好吗?
  • 直接返回null或者空集合会导致调用方无法区分null和空集合是来源于正常的业务逻辑还是发生了降级,这样使用很容易造成问题的难以追踪
  • 那么如何解决这个问题呢,可以参考以下代码,方法返回一个包装的Response或者特殊的Exception
    @Override
    public Response<Integer> uploadProductJob(List<ProductJob> productJobList) {
        return ResponseUtil.makeError(ErrorCode.CLIENT_SERVER_ERROR);
    }
FallBack 应该由服务方提供,还是在调用方来提供
  • 答案并不固定,分以下场景

    第一种情况,大部分接口都有降级逻辑,并且多个调用方使用同一套降级逻辑;这种情况下FallBack由服务方提供,这样可以省去调用方之间出现复制代码的情况,但是这样存在一个很严重的问题,就是复杂的降级逻辑会引用到其他包,可能会引发相互依赖的问题,所以这种情况下是放在服务方还是调用方还需要灵活的做一下决策
    第二种情况,大部分接口都有降级逻辑,并且多个调用方使用不同的降级逻辑;这种情况下FallBack文件放在调用方,由于调用方使用的是不同的降级逻辑,那么服务方就无法提供个性化的降级方案了
    第三种情况,大部分接口都没有降级逻辑;这种情况下FallBack文件由服务方提供即可,如个别接口需要有降级逻辑,在调用方实现降级逻辑即可;其中FallBack方法的返回内容,直接返回一个特殊的Exception或者特殊的Response;据我了解大部分技术团队都是这样用的,这样用起来简单、方便、直接一些

猜你喜欢

转载自www.cnblogs.com/accessking/p/11111706.html