说明:SpringCloud系列笔者自学系列,学习来源是周立的博客 http://www.itmuch.com/ 。而此处转载其博客只是为了方便自己以后的学习。
本篇来源 http://www.itmuch.com/spring-cloud/finchley-10/
上一节( 跟我学Spring Cloud(Finchley版)-09-Feign )讲了Feign的入门姿势并深入对比了RestTemplate,本节来深入探讨Feign的高级特性。总的来说,Feign是一个相对简单的组件,但细节还是比较多的,一不小心就可能入坑,注意点我会以WARINING的形式标记出来,便于读者查阅。
Feign配置自定义【细粒度配置】
方式一、代码配置方式
Spring Cloud Netflix provides the following beans by default for feign (BeanType
beanName: ClassName
):
-
Decoder
feignDecoder:ResponseEntityDecoder
(which wraps aSpringDecoder
) -
Encoder
feignEncoder:SpringEncoder
-
Logger
feignLogger:Slf4jLogger
-
Contract
feignContract:SpringMvcContract
-
Feign.Builder
feignBuilder:HystrixFeign.Builder
-
Client
feignClient: if Ribbon is enabled it is aLoadBalancerFeignClient
, otherwise the default feign client is used.
The OkHttpClient and ApacheHttpClient feign clients can be used by setting feign.okhttp.enabled
orfeign.httpclient.enabled
to true
, respectively, and having them on the classpath.
Spring Cloud Netflix does not provide the following beans by default for feign, but still looks up beans of these types from the application context to create the feign client:
Logger.Level
Retryer
ErrorDecoder
Request.Options
Collection<RequestInterceptor>
SetterFactory
代码示例:自定义日志级别
默认Feign是不打印任何日志的,下面我们来开启Feign的日志,Feign有四种日志级别:
- NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
- BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。
- HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
- FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据。
插科打诨 & 恶意揣测
跟我学Spring Cloud(Finchley版)-09-Feign说过,Feign的性能中等,可能官方对自己的性能也是知道的,索性全部关闭日志了,哈哈
-
将前文的Feign Client修改为如下:
"microservice-provider-user", configuration = UserFeignConfig.class) (name = public interface UserFeignClient { "/users/{id}") ( User findById(@PathVariable("id") Long id); } /** * 该Feign Client的配置类,注意: * 1. 该类可以独立出去; * 2. 该类上也可添加@Configuration声明是一个配置类; * 配置类上也可添加@Configuration注解,声明这是一个配置类; * 但此时千万别将该放置在主应用程序上下文@ComponentScan所扫描的包中, * 否则,该配置将会被所有Feign Client共享,无法实现细粒度配置! * 个人建议:像我一样,不加@Configuration注解 * * @author zhouli */ class UserFeignConfig { public Logger.Level logger() { return Logger.Level.FULL; } }
如代码所示,使用注解
@FeignClient
的configuration
属性,指定一个类,即可实现Feign配置自定义。TIPS
- 本例简单起见,直接弄了个外部类作为配置类
UserFeignConfig
,读者也可将该类独立出去作为一个public class
。
WARNING
- 配置类上也可添加
@Configuraiton
注解,声明这是一个配置类;但此时千万别将该放置在主应用程序上下文@ComponentScan
所扫描的包中,否则,该配置将会被所有Feign Client共享(相当于变成了通用配置,其实本质还是Spring父子上下文扫描包重叠导致的问题),无法实现细粒度配置! - 个人建议:像我一样,不加@Configuration注解,省得进坑。
联想记忆
还记得Ribbon如何使用Java代码自定义配置吗?Ribbon使用Java代码自定义配置时也必须防止配置类在
@ComponentScan
上下文内,详见: 跟我学Spring Cloud(Finchley版)-08-Ribbon深入 - 本例简单起见,直接弄了个外部类作为配置类
-
在
application.yml
中添加以下内容,将该Feign接口的日志级别设置为DEBUG:logging: level: com.itmuch.cloud.study.user.feign.UserFeignClient: debug
-
此时,当该Feign Client的方法被调用时,将会打印类似如下的日志:
2019-01-10 22:14:10.611 DEBUG 26321 --- [nio-8010-exec-2] c.i.c.study.user.feign.UserFeignClient : [UserFeignClient#findById] ---> GET http://microservice-provider-user/users/1 HTTP/1.1 2019-01-10 22:14:10.611 DEBUG 26321 --- [nio-8010-exec-2] c.i.c.study.user.feign.UserFeignClient : [UserFeignClient#findById] ---> END HTTP (0-byte body) 2019-01-10 22:14:10.623 DEBUG 26321 --- [nio-8010-exec-2] c.i.c.study.user.feign.UserFeignClient : [UserFeignClient#findById] <--- HTTP/1.1 200 (11ms) 2019-01-10 22:14:10.623 DEBUG 26321 --- [nio-8010-exec-2] c.i.c.study.user.feign.UserFeignClient : [UserFeignClient#findById] content-type: application/json;charset=UTF-8 2019-01-10 22:14:10.623 DEBUG 26321 --- [nio-8010-exec-2] c.i.c.study.user.feign.UserFeignClient : [UserFeignClient#findById] date: Thu, 10 Jan 2019 14:14:10 GMT 2019-01-10 22:14:10.623 DEBUG 26321 --- [nio-8010-exec-2] c.i.c.study.user.feign.UserFeignClient : [UserFeignClient#findById] transfer-encoding: chunked 2019-01-10 22:14:10.623 DEBUG 26321 --- [nio-8010-exec-2] c.i.c.study.user.feign.UserFeignClient : [UserFeignClient#findById] 2019-01-10 22:14:10.624 DEBUG 26321 --- [nio-8010-exec-2] c.i.c.study.user.feign.UserFeignClient : [UserFeignClient#findById] {"id":1,"username":"account1","name":"张三","age":20,"balance":100.00} 2019-01-10 22:14:10.624 DEBUG 26321 --- [nio-8010-exec-2] c.i.c.study.user.feign.UserFeignClient : [UserFeignClient#findById] <--- END HTTP (72-byte body)
配套代码
方法二、属性配置方式【Edgware开始提供】
从Spring Cloud Edgware开始,Feign支持使用属性自定义Feign。对于一个指定名称的Feign Client(例如该Feign Client的名称为feignName
),Feign支持如下配置项:
feign: client: config: feignName: connectTimeout: 5000 # 相当于Request.Options readTimeout: 5000 # 相当于Request.Options # 配置Feign的日志级别,相当于代码配置方式中的Logger loggerLevel: full # Feign的错误解码器,相当于代码配置方式中的ErrorDecoder errorDecoder: com.example.SimpleErrorDecoder # 配置重试,相当于代码配置方式中的Retryer retryer: com.example.SimpleRetryer # 配置拦截器,相当于代码配置方式中的RequestInterceptor requestInterceptors: - com.example.FooRequestInterceptor - com.example.BarRequestInterceptor decode404: false |
TIPS
个人并不建议配置retryer,Spring Cloud Camden以及之后的版本中,Spring Cloud关闭了Feign的重试,而是使用Ribbon的重试。如果自己再定义Feign的重试后,那么可能会造成重试特性的混乱。笔者已在https://github.com/spring-cloud/spring-cloud-netflix/issues/2330 提出该问题。
代码示例:自定义日志级别
要想用属性配置方式来达到上面Java代码方式的效果,只需在application.yml
中添加如下内容即可:
feign: client: config: microservice-provider-user: loggerLevel: full logging: level: com.itmuch.cloud.study.user.feign.UserFeignClient: debug |
配套代码
Feign配置自定义【通用配置】
上面讨论了如何配置特定名称的Feign Client,那么如果想为所有的Feign Client都进行配置,该怎么办呢?我们知道,@EnableFeignClients
注解上有个defaultConfiguration
属性,我们可以将默认配置写成一个类,然后用defaultConfiguration
来引用,例如:
(defaultConfiguration = DefaultRibbonConfig.class)
|
如果想使用配置属性的方式,只需使用类似如下的写法即可。
feign: client: config: default: connectTimeout: 5000 readTimeout: 5000 loggerLevel: basic |
配置优先级
如果你不小心又使用了Java代码配置Feign,同时又使用了配置属性配置Feign,那么使用配置属性的优先级更高。配置属性配置的方式将会覆盖Java代码配置。如果你想修改代码配置方式的优先级,可使用如下属性:feign.client.default-to-properties=false
。
压缩
一些场景下,我们可能需要对请求或响应进行压缩,此时可使用以下属性启用Feign的压缩功能。
feign.compression.request.enabled=true feign.compression.response.enabled=true |
对于请求的压缩,Feign还提供了更为详细的设置,例如:
feign.compression.request.enabled=true feign.compression.request.mime-types=text/xml,application/xml,application/json feign.compression.request.min-request-size=2048 |
其中,feign.compression.request.mime-types
用于支持的媒体类型列表,默认是text/xml、application/xml以及application/json。
feign.compression.request.min-request-size
用于设置请求的最小阈值,默认是2048。
继承
比较重要,业界对继承特性看法非常不一样,喜欢的特别喜欢,讨厌的特别讨厌(例如我)。将以番外形式体现,并对比两者优缺点,以及最佳实践,明天或后天更新,敬请期待。
其他特性
Feign其他特性我已经写了很多了,知识体系已经完备了。懒得再在这个系列里凑字数,这不是我的风格,直接贴地址吧:
- 生产技巧:Feign如何控制Hystrix的启停、超时、熔断?
- 使用Feign实现Form表单提交
- 如何使用Feign构造多参数的请求
- Spring Cloud中,Feign常见问题总结
- Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?
- 使用Spring Cloud Feign上传文件
相关文章
- 跟我学Spring Cloud(Finchley版)-15-Hystrix监控详解
- 使用Spring Cloud Feign上传文件
- 跟我学Spring Cloud(Finchley版)-11-Feign常见问题总结
- 跟我学Spring Cloud(Finchley版)-13-通用方式使用Hystrix
- 跟我学Spring Cloud(Finchley版)-14-Feign使用Hystrix
相关推荐
包含翻译后的API文档:spring-cloud-openfeign-core-3.1.1-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.springframework.cloud:spring-cloud-openfeign-core:3.1.1; 标签:cloud、spring、...
在本项目"spring-cloud-user-feign.zip"中,我们探讨的是如何在Spring Cloud框架下实现服务间的调用,特别是利用Feign客户端进行微服务通信。这个压缩包包含了四个关键组件,分别是: 1. spring-cloud-gateways:这...
包含翻译后的API文档:spring-cloud-openfeign-core-3.1.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.cloud:spring-cloud-openfeign-core:3.1.1; 标签:cloud、spring、openfeign、core...
在本项目"SpringCloud-2.0-order-Feign-8005.zip"中,主要探讨了如何在Spring Cloud 2.0环境下利用Feign客户端实现服务间的调用,并达到与`@LoadBalanced`注解类似的效果,即负载均衡。Spring Cloud是基于Spring ...
包含翻译后的API文档:spring-cloud-openfeign-core-3.0.4-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.cloud:spring-cloud-openfeign-core:3.0.4; 标签:springframework、cloud、spring...
在"springcloud-eureka-feign-mybatis-seata"项目中,开发者可以学习如何整合这些技术来创建一个完整的分布式事务示例。通过Eureka,服务能够被发现和调用;借助Feign,跨服务调用变得简单;MyBatis负责与数据库交互...
本文将深入探讨如何在Spring Cloud Alibaba框架下整合Nacos和Feign,实现高效、便捷的服务治理。 首先,Nacos是阿里巴巴开源的一款集成了服务发现和服务配置功能的工具。它不仅能够帮助我们管理微服务实例,还提供...
【SpringCloud】springcloud-app-parent是一个SpringCloud的练习实践项目,集成了nacos,eureka, feign,springcloud-gateway,springcloud-config,rabbitmq,ka... (Springcloud app parent is a SpringCloud practice ...
然后,"SpringCloud-2.0-order-hystrix-feign-8012"展示了如何使用Feign和Hystrix进行服务间调用。Feign是一个声明式Web服务客户端,使得编写Web服务客户端就像编写Java接口一样简单。在Order服务中,我们可以定义一...
本压缩包"springcloud-learning-master.zip"是一个关于SpringCloud学习的资源合集,包含了一系列的例子和教程,适合想要深入理解和掌握SpringCloud技术的开发者。 首先,我们要了解SpringCloud的基础概念。Spring...
本压缩包“springcloud-learning-master.zip”提供了一套完整的SpringCloud学习资料,包括Eureka、Ribbon、Nacos、SpringCloud以及Feign等多个组件的实践教程。 1. **Eureka**:Eureka是Spring Cloud Netflix项目的...
在Spring Cloud框架中,"springcloud-ribbon-feign-hystrix-zuul-config"这个标题涉及到四个关键组件:Ribbon、Feign、Hystrix和Zuul,以及配置管理Config。这些组件都是构建分布式系统时常用的服务发现、客户端负载...
springcloud整合openFeign,包括feign的基本使用、传参、指定特定的服务器、负载均衡等使用方法。...springcloud-feign-api springcloud-feign-consumer springcloud-feign-provider springcloud-feign-providerV2
包含翻译后的API文档:feign-form-spring-3.8.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:io.github.openfeign.form:feign-form-spring:3.8.0; 标签:openfeign、spring、github、form、feign、jar包、java...
标题 "springcloud2-hystrix-feign-zuul.zip" 提示了我们这是一组关于Spring Cloud 2的实现,具体涉及Hystrix、Feign和Zuul组件的实践项目。Spring Cloud 是一个用于构建分布式系统的服务发现、配置管理和微服务连接...
本篇文章将深入剖析名为"spring-cloud-examples-master"的开发实例包,旨在帮助读者理解并掌握Spring Cloud的核心概念和技术。 首先,Spring Cloud是基于Spring Boot的微服务解决方案,它为开发者提供了在分布式...
10. ** Sleuth 和 Zipkin**: Sleuth 是一个分布式追踪解决方案,它为 Spring Cloud 应用程序提供了分布式日志跟踪的能力。Zipkin 是一个收集和可视化这些追踪数据的工具,帮助我们理解微服务架构中的请求流程和性能...
本资源“SpringCloud-Learning-master.zip”是程序猿DD关于SpringCloud的学习资料,包含了源码及截至2018年11月10日的最新更新。下面,我们将深入探讨SpringCloud的关键知识点。 一、SpringCloud基础概念 1. **...