Spring Cloud微服务feign远程调用404问题

远程调用异常

有两服务课程服务和订单服务,课程服务 --> 调用订单服务,主要是查询课程是否存在支付过的订单
Spring Cloud微服务feign远程调用404问题_第1张图片

—更新 2020年8月13日09:06:02

课程服务定义的FeignClient接口

Spring Cloud微服务feign远程调用404问题_第2张图片

订单服务暴露的接口

Spring Cloud微服务feign远程调用404问题_第3张图片

排查问题

请求地址都对的上,为什么访问404呢?后来检查注解配置等是否缺少,最终把问题定位在UrlMapping中,可以看到有两个PathVariable丶{courseId}丶{memberId},课程ID和会员ID.经过调试发现远程调用请求的Url确实有问题,如图红框中的标记.
Spring Cloud微服务feign远程调用404问题_第4张图片
在这里插入图片描述
图中的请求地址对应的是 “/eduorder/order/ensureBuyCourse/{courseId}/ “,调试到这一步瞬间悟了,原来如此,因为memberId传进去的变量为空字符串””,然后生成的请求Url就变成了图中的 /eduorder/order/ensureBuyCourse/11922522/ ,所以请求404了,正确的请求地址应该是/eduorder/order/ensureBuyCourse/11922522/55555
试想如果courseId和memberId都为空,那么请求的Url应该是这样的: /eduorder/order/ensureBuyCourse//

总结

  1. 接口需要暴露给其他服务调用,避免在Mapping中定义PathVariable变量来映射地址
    反例: /eduorder/order/ensureBuyCourse/{courseId}/{memberId}/
    正确定义: /eduorder/order/ensureBuyCourse

  2. 远程调用的接口如果带有PathVariable变量,那么远程调用时请务必做非空处理,保证调用时传入的实参是正确的

你可能感兴趣的:(Spring,Cloud,spring,boot,spring,java)