nacos集成feign入门加踩过的坑
文章目录
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
feignprovider
@Slf4j
@Api(tags = {"商品详情接口"})
@RestController
@Ignore
@RequestMapping("/pms")
public class FeignController {
@Autowired
private ProductService productService;
@ApiOperation("获取商品详情")
@GetMapping("/queryProduct")
public ResponseVO<ProductPO> queryProduct(@RequestParam("productId")Integer productId){
log.info("请求接口 /pms/queryProduct 参数:{}", JSON.toJSONString(productId));
return productService.queryProduct(productId);
}
}
productService省略
消费者
FeignService
value就是nacos注册的名字
@FeignClient(value = "netsadcloud-pms")
public interface FeignService {
@GetMapping("pms/queryProduct")
ResponseVO<ProductPO> queryProduct(@RequestParam("productId")Integer productId);
}
controller
/**
* @author: Boss
* Date: 2020/12/31
* Time: 8:50
* Description:
*/
@Api(tags = {"订单相关接口"})
@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private FeignService feignService;
@ApiOperation("获取商品详情")
@GetMapping("/queryProduct")
public ResponseVO<ProductPO> queryProduct( @RequestParam("productId")Integer productId){
log.info("请求接口 /order/queryProduct 参数:{}", JSON.toJSONString(productId));
try {
return feignService.queryProduct(productId);
} catch (Exception e) {
log.error("Feign远程调用失败,原因是:{}",e.getMessage());
}
throw new MyException(ErrorCode.FEIGN_ERROR);
}
}
踩过的坑
1.debug的时候Feign超时
Feign调用时读取超时(Read timed out executing GET)解决
解决方式(很多人比较关注,所以放在最前面):
因为Feign调用默认的超时时间为一分钟,一分钟接口不能返回就会抛出异常,所以在服务端的yml文件中增加如下配置即可解决:
feign:
client:
config:
default:
connectTimeout: 10000
readTimeout: 600000
2.返回对象没有无参构造函数
feign.codec.DecodeException: Type definition error: [simple type, class com.freegift.utilspringbootstarter.model.VO.ResponseVO]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.freegift.utilspringbootstarter.model.VO.ResponseVO
(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (PushbackInputStream); line: 1, column: 2]
原因:json反序列化话需要对应实体类有无参构造器。
ResponseVO加入无参构造函数
返回值
jackson序列化注意点:
被 序列化/反序列化 的实体
a. 必须要有无参构造方法
b.字段要有set/get方法
c. 不需要序列化的字段 可以用@jsonIgnore 修饰
3.关于FeignClient调用get方法,无法传递参数的解决办法
FeignClient 在进行远程调用的时候,get方法在接受的时候会将参数放入RequestBody中,将方法转为了post请求,这样服务端就无法获取请求参数,导致请求出错,所以我们在传递自定义参数的时候,需要将每个属性拆解出来加上@RequestParam 注解,这样的话就可以正常请求了,而且我们没必要将每一个属性都写入,只需要将我们所需要的参数加上即可
本文地址:https://blog.csdn.net/qq_43578385/article/details/112258105