spring cloud openfeign踩坑记
以下内容起源自项目过程中使用openfeign无法连接目标服务端口后查询使用过的主要解决方案,如有其它建议,请评论告知
1.openfeign是什么?
OpenFeign 是 SpringCloud在Feign 的基础上支持了SpringMVC的注解,如@RequestMapping、@PostMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
2.openfeign与feign的区别
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。使用Feign非常简单—创建一个接口,并在接口上添加一些注解,代码就完成了。Feign具备可插拔的注解、支持多种注解,例如Feign自带的注解或者JAX-RS注解等`。
OpenFeign 是 SpringCloud在Feign 的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类`,实现类中做负载均衡并调用其他服务。
目前版本主要采用openfeign结合springboot框架进行微服务开发
3.openfeign的使用
在springboot项目中,openfeign的使用非常简单,定义一个调用接口,接口下定义服务提供方的API接口获取方法并配合相应注解即可
即接口+注解方式,注意需要在启动类上添加@Enable注解
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.1.3</version>
</dependency>
4.问题发现及解决过程
项目为微服务项目,目的是调用服务提供方的邮件发送接口,由于服务提供方定义的API为post方式同时采用x-www-form-urlencoded接收文本,使用过程中出现400/401等问题,以下为解决过程
1.检查目标服务API
首先检查了目标服务方提供的API是否能够单独访问,检查代码基本常识性问题比如依赖是否正确
2.替换调用client
实际上这一步属于对Openfeign性能参数的调整优化,当时解决问题时查看其他博客搬来使用,并不能解决核心问题
Feign 在默认情况下使用的是 JDK 原生的 URLConnection 发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用 HTTP 的 persistence connection。可以用 Apache 的 HttpClient 替换 Feign 原始的 HTTP Client,通过设置连接池、超时时间等对服务之间的调用调优。 Spring Cloud 从 Brixton.SR5 版本开始支持这种替换
添加依赖后在配置文件中定义即可
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>11.8</version>
</dependency>
3.openfeign版本问题导致的字段重复
在debug的过程中发现,调用请求时出现重复字段比如content-length,因此定义feign的配置类进行拦截去重,注意使用配置类需要在接口中进行配置
4.请求方法中注解使用问题
由于需要上传表单进行调用,最初采用@RequestParm注解将多个参数进行传入,但是发现参数中包含正斜杠/,无法解析编码
因此将多个参数封装为一个实体类后调整为@RequstBody即可实现功能
这里要注意的是查询其他博客时推荐采用@QueryMap,@SpringQueryMap均不适用本例,无法实现功能
以上为排坑的全部过程,对以下博客文章作者表示感谢,参考到了非常有价值的博客:
https://issavior.blog.csdn.net/article/details/125493986?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-1-125493986-blog-122118499.t5_layer_eslanding_D_0&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-1-125493986-blog-122118499.t5_layer_eslanding_D_0&utm_relevant_index=1
https://blog.csdn.net/qq_40814565/article/details/124989317
https://blog.csdn.net/qq_36256590/article/details/122588124
https://blog.csdn.net/wo18237095579/article/details/83377938
https://blog.csdn.net/qq_43437874/article/details/122235580
https://www.proyy.com/6968046250545381390.html
本文来自博客园,作者:面向机器编程,转载请注明原文链接:https://www.cnblogs.com/face-to-machine-program/articles/16750242.html