第10-6 feigin-hystrix问题急盼师兄答疑
来源:10-6 feign-hystrix的使用

网络时空
2020-03-12
师兄,晚上好!
我今天在看10-6 针对Feignclient使用hystrix,根据你视频中的描述及你提供的相应代码。你在视频中描述,我们不启动product工程的时候,
@PostMapping("/product/listForOrder")
List listForOrder(@RequestBody List productIdList);
此方法会触发hystrix的服务降级,执行如下内部类中的listForOrder返回null,这一点确实没错。但是我在进一步测试时,我仍然正常启动proudct不停掉product服务的时候,product对应的工程控制台下已经输出list的值了,
如下面所示
productInfoList = [ProductInfo(productId=157875196366160022, productName=皮蛋粥, productPrice=0.01, productStock=99, productDescription=好吃的皮蛋粥, productIcon=//fuss10.elemecdn.com/0/49/65d10ef215d3c770ebb2b5ea962a7jpeg.jpeg, productStatus=0, categoryType=1, createTime=2017-03-28 19:39:15.0, updateTime=2020-02-11 23:45:37.0), ProductInfo(productId=164103465734242707, productName=蜜汁鸡翅, productPrice=0.02, productStock=945, productDescription=好吃, productIcon=//fuss10.elemecdn.com/7/4a/f307f56216b03f067155aec8b124ejpeg.jpeg, productStatus=0, categoryType=2, createTime=2017-03-30 17:11:56.0, updateTime=2019-12-09 23:29:08.0)]
但是,我发现始终会进入如下product-client.jar包中的内部类中的listForOrder方法,返回null值,这就不正常了。这时候应该是返回正常的值才对,因为这时候producdt的服务我并未停掉,且order中我定义的超时时间是3秒,这个时候不应该还返回空值null
order工程对应的控制台下输出的错误信息如下
-----------------------------
2020-03-12 22:00:05.920 INFO 7804 — [trix-products-1] c.netflix.config.ChainedDynamicProperty : Flipping property: products.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2020-03-12 22:00:05.950 ERROR 7804 — [nio-9001-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
-----------------------------
如下问题,急盼师兄答复解疑,谢谢!
如下是你视频提供的相应源代码
----------------------------
@FeignClient(name = “product”, fallback = ProductClient.ProductClientFallback.class)
public interface ProductClient {
@PostMapping("/product/listForOrder")
List<ProductInfoOutput> listForOrder(@RequestBody List<String> productIdList);
@PostMapping("/product/decreaseStock")
void decreaseStock(@RequestBody List<DecreaseStockInput> decreaseStockInputList);
@Component
static class ProductClientFallback implements ProductClient {
@Override
public List<ProductInfoOutput> listForOrder(List<String> productIdList) {
return null;
}
@Override
public void decreaseStock(List<DecreaseStockInput> decreaseStockInputList) {
}
}
}
3回答
-
消逝的菜鱼
2020-03-31
哇,这里简直就是绝世巨坑。这个问题的关键在于@Component组件的扫描,@ComponentScan导致了项目的自动扫描出现了问题,结果@RequestMapping映射的路径全部都没扫描,访问全部404,把@ComponentScan的范围设置成整个项目就好了,不想扫描整个项目的话,一个个单独设定要扫描的包也可以
112020-11-07 -
网络时空
提问者
2020-03-14
很奇怪,刚才继续运行发现此问题已经正常解决,FeignClient的 fallback方法验收正常了哈!
虽然没有得到师兄的问题,但问题目前正常了!
此问题已经了解了,谢谢大家哈!
00 -
网络时空
提问者
2020-03-14
我现在禁用了@FeignClient的fallback的功能,再次访问 http://localhost:9001/order/create就可以正常
******************************************************************
这说明就是我加上了 对 FeignClient的hystrix功能后,出现的问题。 问题我还在进一步排查中,不加就可以正常访问,这就排除了超时功能或其它问题。 师兄根据此现象给下建议哈!
******************************************************************
第一步:我在order工程中注释掉了
#feign:
# hystrix:
# enabled: true第二步: 我在ProductClientService接口类中去掉了fallback的定义,由
@FeignClient(name="product",fallback=ProductClientService.ProductClientServiceFallback.class)
改回到
@FeignClient(name="product")
再次 在postman中 ,访问
http://localhost:9001/order/create就可以正常
如下图所示
如下是我本地对Feignclient定义的代码
------------------------
/**
* @author Administrator
*
*fallback属性指定服务降级发生时,如下方法会由哪个类中的方法来做相应处理,这里是由ProductClientServiceFallback内部类来处理
*/
@FeignClient(name="product")
//@FeignClient(name="product",fallback=ProductClientService.ProductClientServiceFallback.class)
public interface ProductClientService {
//订单服务调用listForOrder方法时,实际上就是请求调用的seriverid=products对应的 /product/listForOrder的url
// 两个坑:1. @GetMapping不支持 2. @PathVariable得设置value
@RequestMapping(value="/product/msg/{name}", method=RequestMethod.GET)
public String msg(@PathVariable("name") String name);
// @RequestMapping(value="/product/listForOrder", method=RequestMethod.POST)
@PostMapping("/product/listForOrder")
List<ProductInfo> listForOrder(@RequestBody List<String> productIdList);
@PostMapping("/product/decreaseStock")
// @RequestMapping(value="/product/decreaseStock", method=RequestMethod.POST)
void dereseStock(@RequestBody List<CartDTO> cardDTOList);
// @Component //此处的内部类一定要加上@Component,以便让spring的ioc容器识别
// static class ProductClientServiceFallback implements ProductClientService{
//
// //如果如上listForOrder调用产生服务降级的话就会触发此方法,与上面的listForOrder方法一一对应
// @Override
// public List<ProductInfo> listForOrder(List<String> productIdList) {
// // TODO Auto-generated method stub
// //当网络不通或者访问失败时,返回固定/默认内容
// System.out.println("################# come into listForOrder");
// return null;
// }
//
// //如果如上dereseStock调用产生服务降级的话就会触发此方法,与上面的dereseStock方法一一对应
// @Override
// public void dereseStock(List<CartDTO> cardDTOList) {
// // TODO Auto-generated method stub
// // 当网络不通或者访问失败时,返回固定/默认内容
// System.out.println("****************** come into dereseStock");
// }
//
// //测试用
// @Override
// public String msg(String name) {
// // TODO Auto-generated method stub
// System.out.println("@@@@@@@@@@@@@@@@@@@ come into msg");
// return null;
// }
//
// }
}
00
SpringCloud Finchley(M2+RELEASE+SR2)微服务实战
5672 学习 · 2489 问题
相似问题
回答 4
回答 1