一、Feign介绍
1、什么是feign?
feign是springcloud提供的声明式的http客户端,工作在consumer端
feign支持springmvc注解
feign集成了ribbon也支持负载均衡
2、feign启动器
spring-cloud-starter-openfeign
二、feign入门案例
注意:@FeignClient("服务名") 服务名不支持下划线!否则会报错
1、创建feign_provider ... ...
2、创建feign_interface
1)pom.xml openfeign、springcloud_common
2)feign接口
package com.bjpowernode.xxx;
@FeignClient("服务名")
public interface UserFeign{
@RequestMapping("/getUserById/{id}") //请求的url
public User getUserById(@PathVariable("id") Integer id);
}
3、创建feign_consumer
1)pom.xml feign_interface
2)controller
public class ConsumerController {
@Autowired
private UserFeign userFeign;//代理类
}
3)app启动类
@EnableFeignClients
三、feign原理
1、将feign接口扫描到spring容器:
@EnableFeignClients开启feign注解扫描:FeignClientsRegistrar.registerFeignClients()扫描为@FeignClient标识的接口生成代理类,并把代理类交给spring容器管理;
2、为接口的方法创建RequestTemplate
当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplate(url,参数,httpMethod);
3、发出请求
发请求时会通过RequestTemplate创建Request对象,然后client(HttpClient、OkHttp、UrlConnect)使用Request对象发送请求
由于http每次需要三次握手四次分手,所以推荐使用http连接池:
优化:
client 默认使用的是DefaultClient 可以更换为HttpClient
在consumer引入http连接池依赖即可 效率更高
<!--http连接池-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
四、feign接口传参
1、?传参 @RequestParam("id")
2、restful传参 @PathVariable("id")
3、pojo传参 @RequestBody
五、feign优化
1、开启feign日志
feign:
client:
config:
default:
loggerLevel: full #开启feign的日志 前提:com.bjpowernode.feign包下的日志输出级别必须为debug
logging:
level:
com.bjpowernode.feign: debug
2、http连接池
<!--http连接池-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
3、gzip压缩
server:
port: 80
compression:
enabled: true #开启浏览器<----->consumer的gzip压缩
feign:
compression:
request:
enabled: true
response:
enabled: true #consumer<------>provider的gzip压缩
4、feign超时
#方式一:
ribbon: #设置所有服务的超时时间
ConnectionTimeout: 5000
ReadTimeout: 5000
#方式二:
feign:
client:
config:
feign-provider: #服务名 设置某个服务的超时时间
ConnectionTimeout: 5000
ReadTimeout: 5000