第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的范围设置成整个项目就好了,不想扫描整个项目的话,一个个单独设定要扫描的包也可以

1
1
我不想放弃
太有用了,我还以为是自己写错了
2020-11-07
共1条回复

网络时空

提问者

2020-03-14

很奇怪,刚才继续运行发现此问题已经正常解决,FeignClient的 fallback方法验收正常了哈!

虽然没有得到师兄的问题,但问题目前正常了!


此问题已经了解了,谢谢大家哈!

0
0

网络时空

提问者

2020-03-14

我现在禁用了@FeignClient的fallback的功能,再次访问 http://localhost:9001/order/create就可以正常

******************************************************************

这说明就是我加上了 对 FeignClient的hystrix功能后,出现的问题。 问题我还在进一步排查中,不加就可以正常访问,这就排除了超时功能或其它问题。 师兄根据此现象给下建议哈!

******************************************************************

第一步:我在order工程中注释掉了

#feign:
#  hystrix:
#    enabled: true   

//img.mukewang.com/szimg/5e6c679109115bac05240533.jpg


第二步: 我在ProductClientService接口类中去掉了fallback的定义,由

@FeignClient(name="product",fallback=ProductClientService.ProductClientServiceFallback.class)

改回到

@FeignClient(name="product")

再次 在postman中 ,访问

http://localhost:9001/order/create就可以正常

如下图所示

//img1.sycdn.imooc.com/szimg/5e6c6773097c74b807820522.jpg


如下是我本地对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;
//        }
//        
//    }

}
 

0
0

SpringCloud Finchley(M2+RELEASE+SR2)微服务实战

SpringCloud组件实现微服务,【已升级Finchley.Release】

5672 学习 · 2489 问题

查看课程