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

SpringBoot工程下使用OpenFeign的坑及解决

程序员文章站 2022-03-11 12:10:04
一、前言在springboot工程(注意不是springcloud)下使openfeign的大坑。为什么不用springcloud中的feign呢?首先我的项目比较简单(目前只有login与业务模块)...

一、前言

在springboot工程(注意不是springcloud)下使openfeign的大坑。为什么不用springcloud中的feign呢?

首先我的项目比较简单(目前只有login与业务模块)所以暂时不去引入分布式的架构,但两个服务之间存在一些联系因此需要接口调用接口(实现该操作方式很多我选择了openfeign,踩坑之路从此开始。。。)。

二、具体的坑

使用openfeign我是直接参考官方的demo,官方的例子写的简洁明了直接套用到自己的工程中即可,自己也可以做相应的封装再调用但demo中使用到了一个feign的核心注解@requestline,问题就是出在该注解上。

此时你去做调试如果使用的是get请求,被请求的接口则会收到post的请求然后a接口(请求方)就报500的错误,b接口(被请求方)则提示接口不支持post请求(不支持post请求是非常正常的,因为b接口定义的method是get方法)。

以下是我的代码片段:

自定义userfeign接口

public interface userfeign { 
    /**
     * 根据userid获取用户信息
     * @param userid
     * @return
     */
    @requestline("get /user/getuserbyid?id={id}")
    result getuserbyid(@param("id") string userid);
}

调用userfeign接口

@service
public class userservice{ 
    /**
     * 通过openfegin实现接口调用接口
      * @param userid
     * @return
     */
    public result getuserbyidwith(string userid) {
        userfeign userinfo = feign.builder()
                .decoder(new jacksondecoder())
                .target(userfeign.class, "http://localhost:8080");
        result res = userinfo.getuserbyid(userid);
        return res;
    }
}

a接口 (请求方)

@requestmapping(value = "/test", method = requestmethod.get)
public result test() {
    string id = "ad545461300a";
    return userservice.getuserbyidwith(id);
}

b接口 (被请求方)

@requestmapping(value = "/getuserbyid", method = requestmethod.get)
public result getuserbyuserid(@requestparam(required = true) string id){
    if ("".equals(id)) {
        throw new businessexception(400, "userid不能为空!");
    }
    users info = usersservice.getuserbyid(id);
    if (info == null) {
        throw new businessexception(404, "userid有误!");
    }
    return resultuntil.success(info);
}

以上代码我做了一些小调整,将调用uesrfeign接口中的方法封装在userservice中并且使用了@service这样我就可以在其它地方直接注入userservice然后调用其中方法。

你会觉得以上代码跟官网的demo没啥区别但官方文档中并没有说明使用@requestline注解需要进行配置(事实上需要进行配置的)。

配置代码如下:

@bean
public contract usefeignannotations() {
    return new contract.default();
}

完成以上的配置就可以进行正常的调用了,该问题困扰我好几天了今天终于解决了(真不容易),希望该文章没有白写。

最后感谢让我在放弃的时候找到了思路。(调试中遇到的细节问题就不在此进行赘述了)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。