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对象记录异常信息。