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 注解,这样的话就可以正常请求了,而且我们没必要将每一个属性都写入,只需要将我们所需要的参数加上即可

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值