欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

nacos集成feign入门加踩过的坑

程序员文章站 2022-03-20 22:53:28
文章目录依赖feignprovider消费者踩过的坑依赖 org.springframework.cloud spring-cloud-starter-openfeign feignprovider@Slf4j...

依赖

        <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

相关标签: springcloudalibaba