Feign 的雪崩处理

Feign 的服务降级处理

修改application配置文件开启对 hystrix 的支持

#Feign 默认是不开启 Hystrix 的。默认为:false
feign.hystrix.enabled=true

编写fallback类和能够返回托底数据的 fallback 方法

    @Component
    public class ProductServiceFallback implements
            ProductConsumerService {
        //能够返回托底数据的 fallback 方法
        @Override
        public List findAll() {
            List list = new ArrayList<>();
            list.add(new Product(-1, "我是托底数据"));
            return list;
        }
    }

在service接口中添加注解指定fallback类

    @FeignClient(name = "ego-product-provider", fallback = ProductServiceFallback.class)
    public interface ProductConsumerService {
        //查询所有商品
        @RequestMapping(value = "/product/findAll", method = RequestMethod.GET)
        public List findAll();
    }

然后再Controller中注入接口

   /**
     * Product Consumer 服务
     */
    @RestController
    public class ProductController {
        @Autowired
        ProductConsumerService consumerservice;

        /**
         * Consumer 中的查询所有商品的方法
         */
        @RequestMapping(value = "/list", method = RequestMethod.GET)
        public List getAll() {
            return this.consumerservice.findAll();
        }
    }

此时访问controller,如果远程provider正常,controller获取的就是正常的数据
如果远程provider有故障,此时controller获取的就是托底数据。

Feign降级后的异常记录

添加FallbackFactory 类,继承FallbackFactory类,并指定service接口泛型,然后在类中创建Logger对象,在托底数据的方法中,使用Logger对象,进行日志记录

    @Component
    public class ProductServiceFallbackFactory implements
            FallbackFactory {
        Logger logger =
                LoggerFactory.getLogger(ProductServiceFallbackFactory.class);
        @Override
        public ProductConsumerService create(final Throwable arg0)
        {
            return new ProductConsumerService() {
                //能够返回托底数据的 fallback 方法
                @Override
                public List findAll() {
                    logger.warn("Fallback Exception: ",arg0);
                    List list = new ArrayList<>();
                    list.add(new Product(-1, "我是托底数据"));
                    return list;
                }
            };
        }
    }

在service接口中,使用@FeignClient注解,fallbackFactory 属性配置FallbackFactory类

    @FeignClient(name = "ego-product-provider", fallbackFactory = ProductServiceFallbackFactory.class)
    public interface ProductConsumerService {
        //查询所有商品
        @RequestMapping(value = "/product/findAll", method = RequestMethod.GET)
        public List findAll();
    }

此时访问controller,如果远程provider正常,controller获取的就是正常的数据
如果远程provider有故障,此时controller获取的就是托底数据,并通过Logger对象记录异常信息。

你可能感兴趣的:(Feign 的雪崩处理)