Feign
Posted mty072788
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Feign相关的知识,希望对你有一定的参考价值。
Feign远程调用
- 导包 springboot-cloud-starter-openfeign
- 启动类加注解 @EnableFeignClients
- 写 feign 接口并注入spring。 feign接口的方法 与 被调用服务的 controller的方法一致(访问方式、访问路径、返回值类型、接收参数)
点击查看代码
@feign("要调用的服务名")
public interface userFeign()
@GetMapping("/user/id")
User queryById(@PathVariable("id") Long id);
Feign优化使用
引依赖: feign-httpclient
- 日志级别尽量用 BASIC
- 使用HttpClient或OKHttp替代默认的URLConnection
2.1. 引依赖 feign-httpclient
2.2. 写配置
点击查看代码
httpclient:
enable: ture #开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
配置日志级别
- 写配置
点击查看代码
public interface FeignLogLeverConfiguration
@Bean
// Logger 是 feign 包下的,别导错了
public Logger.Lever feignLogLever()
return Logger.Lever.BASIC;
feign最佳使用方式
所谓最佳使用方式,就是使用该技术的过程中,体验最好的一种使用方式
直接把 feign的client单独抽取出来作为独立的模块,并把接口有关的pojo、feign的配置都放到这个模块中,可提供给所有消费者使用。
例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包,即可直接使用。
注意:单独把feign抽取为独立模块后, 消费方的 @EnableFeignClients 与 要扫描的 feignClient不在 同一个包或者其子包下,所以无法扫描使用 要调用的 feignClient
此时,应在启动类注解 @EnableFeignClients 加属性 basePackages即可。 例:@EnableFeignClients(basePackages = "com.wyz.feign.clients")
feign的使用注意
参考技术A 首先feign接口处和被调用的controller接口无法相同。1:如果controller的接口有@RequestParm制定了参数名称,那么feign那里也要加入这个注解的属性,并且名字也要取的相同。
2:feign处必须有@RequestParm注解(针对get请求),controller处不一定需要该注解
3:如果想使用get请求传输pojo对象,就使用@SpringQueryMap注解,这个注解会帮我们解析传入的对象的参数然后拼接到url(这里不懂等会讲原理)
4:@SpringQueryMap只能使用一次,使用多次,后面参数接收的值都是填充第一个参数的值。
传入的值为4月1号和4月22号,
然后尝试将传入的参数改为@SpringQueryMap DatesVo datesVo,并不能解析复杂对象,因为feign的本质是对httpClientTemplate对象的封装,所以我们的url很难拼接一个复杂对象上去,或者无法解析复杂对象。
6:由于get的参数大小有限制,所以当传输的对象复杂时,推荐使用@RequestBody和post请求解决。
以上是关于Feign的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud http客户端Feign -- Feign替代RestTemplate