SpringCloud OpenFeign 踩坑总结

目录

一、OpenFeign的基本使用

1、配置依赖

2、编写接口

3、服务调用者添加启用注解

4、在服务调用者里调用

[二、踩坑一:401 认证错误](#二、踩坑一:401 认证错误)

[三、踩坑二:403 请求方式错误](#三、踩坑二:403 请求方式错误)

四、踩坑三:List不能正常传参


一、OpenFeign的基本使用

1、配置依赖

XML 复制代码
         <!--OpenFeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>


        <!--web服务器依赖  可选-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

2、编写接口

一般OpenFeign的调用逻辑是:服务提供者编写好restful访问接口,如:

java 复制代码
    @GetMapping("/pub/x")
    public String test() {
        return "OK";
    }

    @GetMapping("/publicList")
    public R<List<SysUser>> queryPublicList(@RequestParam List<String> ids, 
    @RequestHeader("Authorization") String token) {
        return R.ok(sysUserService.queryPublicList(ids));
    }

注:服务提供者不需要引入OpenFeign

服务调用者了书写Feign的接口, 如:

java 复制代码
@FeignClient(name = ServerNameConstants.SYSTEM_SERVER, path = "/sysUsers")
public interface SysUserFeign {
    @GetMapping("/publicList")
    R<List<SysUserDto>> queryPublicList(@RequestParam("ids") List<String> ids, @RequestHeader("Authorization") String token);

    @GetMapping("/pub/x")
    String test();
}

只得注意的是:feign接口应与提供者的controller接口完全对应。

3、服务调用者添加启用注解

在服务调用者的启动类上添加注解:

java 复制代码
@EnableFeignClients

4、在服务调用者里调用

在组件里引用:

java 复制代码
    @Autowired
    private SysUserFeign sysUserFeign;
java 复制代码
R<List<SysUserDto>> res = sysUserFeign.queryPublicList(Collections.singletonList(String.valueOf(ids)), token);
java 复制代码
sysUserFeign.test()

这样调用就可以在服务器通过restful http请求的方式ribbon负载均衡访问到对应接口了。

二、踩坑一:401 认证错误

由于我的微服务配置了Oauth2来进行权限访问,直接访问认证后才能访问的接口会报401未授权。

最终,我的解决方法是通过在接口上加上@RequestHeader("Authorization") String token来解决问题:每次调用feign接口时我都将访问携带的请求头给他加上,这样成功解决了认证问题。

三、踩坑二:403 请求方式错误

在我刚解决401后,服务器又报403请求方式错误,这不搞心态吗。解决方案:Feign接口会将接口转换成http形式,这就要我们注意接口上的@RequestParam、@RequestBody这些参数不能少,准确使用。

四、踩坑三:List<Long>不能正常传参

原本的服务提供者需要的参数为 @RequestParam List<Long> ids,但在服务调用者调用此feign接口时出现情况如下:

传入的List数据将接口参数变为这样:

http://my-server/xxxx?ids=100\&ids=101\&ids=102

这个问题就很离谱,理论上应该是这个格式:

http://my-server/xxxx?ids=100,101,102

最终,我的解决方案是将List<Long>直接改为List<String>

feign传参时也只传长度为1的List参数合并参数:

java 复制代码
    for (MGPltTenderComment comment : comments) {
            if (ids.toString().equals("")) {
                ids = new StringBuilder(myId);
            } else {
                ids.append(",").append(myId);
            }
        }

        R<List<SysUserDto>> res =      sysUserFeign.queryPublicList(Collections.singletonList(String.valueOf(ids)), token);

关键:Collections.singletonList(String.valueOf(ids))

至此,总结完毕,问题也全部解决!

相关推荐
星栈9 小时前
多租户隔离,我选择"倒退"后开发速度直接翻了 3 倍
后端
Filwaod9 小时前
Java面试现场:从Redis缓存到分布式事务,水货程序员李四的‘表演‘
java·jvm·spring boot·redis·mysql·面试·多线程
Filwaod9 小时前
互联网大厂Java面试实战:从Spring Boot到AI智能客服,水货程序员李四的翻车现场
spring boot·redis·mysql·spring cloud·微服务·ai·java面试
敖正炀9 小时前
手写简易 MyBatis 框架(mini-mybatis)—— 完善版架构设计与核心实现
后端·mybatis
掘金者阿豪10 小时前
R3play让听歌不再费劲,想咋就咋!
后端
铁皮哥10 小时前
【后端开发】@Resource 和 @Autowired 到底有什么区别?为什么现在更推荐构造方法注入?
java·ide·spring boot·tomcat·log4j·idea·intellij idea
众创岛10 小时前
web自动化中的日志模块
java·前端·自动化
EthanYuan10 小时前
🦴不是MCP害了我,是这个阻塞害了我啊
后端
焦糖玛奇朵婷10 小时前
终于搞清楚了,扭蛋机小程序这么厉害❗
java·服务器·前端·程序人生·小程序