在前面的文章我们写过一篇Spring Cloud Alibaba 怎么做服务调用,当时说的Spring Cloud 内建两种实现方法,分别是 @LoadBalanced RestTemplate 以及 OpenFeign。那么今天我们就来聊一聊OpenFeign。
一、OpenFeign是什么
OpenFeign是一个声明式的web服务客户端,它让编写web服务客户端变的非常容易,只需要创建一个接口并在接口上添加注解即可。openFeign的前身是Feign,后者目前已经停更了,openFeign是SpringCloud在Feign的基础上支持了Spring MVC的注解,并通过动态代理的方式产生实现类来做负载均衡并进行调用其他服务。
Feign目的就是为了使编写Java Http客户端变的更加容易。我们在使用Ribbon+RestTemplate时做服务调用时,如果被调用的服务参数比较复杂,我们在构造url时就会非常麻烦,而通过feign的话,我们只需要写一个接口,加上Spring MVC的注解,就可以实现服务调用,大大简化了我们的代码,并且增加了代码的统一性,可读性。
Feign默认集成了Ribbon客户端,我们在使用Feign做服务调用的时候会自动加上负载均衡,所以所有针对Ribbon的配置在Feign上依然是有效地。同时我们也可以脱离Ribbon来做调用。
二、OpenFeign的组成
接口 | 作用 | 默认值 |
---|---|---|
Feign Builder | Feign的入口 | Feign Builder |
Client | Feign底层用什么去请求 | 和 Ribbon配合时:Load BalancerFeignClient 不和 Ribbon配合时 :feign Client Default |
Contract | 契约,注解支持 | SpringMvcContract |
Encoder | 编码器,用于将对象转换成HTTP请求消息体 | SpringEncoder |
Decoder | 解码器,将响应消息体转换成对象 | ResponseEntity Decoder |
三、OpenFeign怎么用
jar包引入
我们在micro-consumer
模块的pom文件中增加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
加注解
启动类上增加@EnableFeignClients
注解
增加接口
这里我们给要引用的服务增加一个接口,这里我给接口命名为MicroProviderFeign
,这里我们使用Spring MVC的注解来配置接口
服务调用
我们修改之前用RestTemplate做的服务调用,引入上面增加的接口,然后调用接口方法
测试OK!
四、OpenFeign的配置
Feign默认支持两种配置方式,java代码配置与属性方式配置。因为两种方式支持的配置项不完全一样,这里我分配给两种方式列一个表格,来展示它支持的配置项。优先级 属性方式 > 代码配置
代码方式
配置项 | 作用 |
---|---|
Logger.Level | 指定日志级别 |
Retryer | 指定重试策略 |
ErrorDecoder | 指定错误解码器 |
Request.Options | 超时时间 |
Collection | 拦截器 |
SetterFactory | 用于设置Hystrix的配置属性,Feign整合Hystrix才会用 |
属性方式
这里我直接把官网的yaml粘贴过来
feign:
client:
config:
feignName:
connectTimeout: 5000 #连接超时时间
readTimeout: 5000 #读取超时时间
loggerLevel: full #日志级别
errorDecoder: com.example.SimpleErrorDecoder #错误解码器
retryer: com.example.SimpleRetryer #重试策略
requestInterceptors:
- com.example.FooRequestInterceptor #拦截器
decode404: false #是否对404错误码解码
encoder: com.example.SimpleEncoder #编码器
decoder: com.example.SimpleDecoder #解码器
contract: com.example.SimpleContract #契约
五、OpenFeign日志配置
Feign默认是不打印日志的,我们可以通过代码方式或者属性方式来配置日志级别
Logger.Level的值
值 | 描述 |
---|---|
NONE | 不打印日志(默认) |
BASIC | 只打印请求方法、RUL、状态码和执行时间(推荐生产环境使用) |
HEADERS | 打印请求/响应头的基本信息 |
FULL | 打印所有信息 |
代码方式配置
修改FeignClient接口的日志级别为DEBUG,只有在接口的日志级别为DEBUG时才会生效
logging.level.com.gideon.consumer.feign.MicroProviderFeign=DEBUG
增加Feign的配置类
测试
属性方式
修改application.properties
logging.level.com.gideon.consumer.feign.MicroProviderFeign=DEBUG
feign.client.config.default.logger-level=basic
测试
这里我配置的是basic,可以看到只是输出了method
url
status code
execution time
六、OpenFeign客户端配置
feign默认使用的UrlConnection去发送请求,但是他同时还支持OkHttpClient
和 ApacheHttpClient
,并且后两个客户端是支持连接池的,所以Feign的性能也会得到优化。这里我们配置下ApacheHttpClient
加依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
写配置
#feign修改为httpclient客户端
feign.httpclient.enabled=true
#feign连接池最大连接数
feign.httpclient.max-connections=100
#feign连接池单个路径的最大连接数
feign.httpclient.max-connections-per-route=20
七、OpenFeign配置最佳实践
- 尽量使用属性配置,属性方式实现不了的情况下再考虑用代码配置
- 在同一个微服务内尽量保持单一性,比如统一使用属性配置,不要两种方式混合使用,增加定位代码的复杂性