扯淡:
【上一章】简单介绍了Feign的基本使用,其配置都是Feign的默认配置,本节将介绍如何自定义 Feign 的配置。包含 java 配置和 properties 配置。参考官网。
springboot、springcloud、docker学习目录:【传送门】
官网:
springcloud openfeign:
https://spring.io/projects/spring-cloud-openfeign
feign github:
https://github.com/OpenFeign/feign
Feign 的配置:
1、默认配置:
包含译码器、编码器、日志框架契约等。Contract 使用的是SpringMVC的契约,所以我们可以在feign的客户端中使用SpringMVC的注解。
2、其他配置:
Netiflix 默认是没有为Feign提供这些配置,但是在创建Feign客户端的时候仍然会从应用的上下文中寻找这些配置。
自定义配置—Java配置:
1、新建springcloud_user_feign_configuration_java模块:
复制 springcloud_user_feign 改名、父子pom、导入项目。
2、创建配置类:
/**
* @Auther: xf
* @Date: 2018/12/23 19:28
* @Description: Feign 的配置
*/
@Configuration
public class MyFeignConfiguration {
/**
* 契约 不配置则 使用 spring mvc 的契约
*/
@Bean
public Contract feignContract() {
return new feign.Contract.Default();
}
/**
* Feign 日志
* 级别:NONE BASIC HEADERS FULL
*/
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
@Bean
public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor("user", "password");
}
}
注意:配置类需要放到工程现有可以扫描到的包之外,与Ribbon的java配置相同。
3、Feign 客户端引入配置类:
/**
* @Auther: xf
* @Date: 2018/12/23 10:58
* @Description: 文章微服务接口
* FeignClient:指定从哪个服务中调用 api 服务名称不可以包含下划线
*/
@FeignClient(name = "springcloud-article", configuration = MyFeignConfiguration.class )
public interface FeignArticleClient {
/**
* 文章列表
* MyFeignConfiguration 中契约已经改为 Feign 的
* 参看 :https://github.com/OpenFeign/feign
*/
//@GetMapping("/article/list")
@RequestLine("GET /article/list")
public ApiResult list();
@RequestLine("GET /article/{id}")
public ApiResult getInfo(@Param(value = "id") String id);
/**
* 根据id查询文章信息
* @PathVariable(value = "id") 必须指定value参数,不然报错
*/
// @GetMapping("/article/{id}")
// public ApiResult getInfo(@PathVariable(value = "id") String id);
}
由于配置类中改变了契约,使用的是Feign的契约。SpringMVC注解不可以使用。
参考Feign 的GitHub:https://github.com/OpenFeign/feign
4、测试:
启动Eureka、文章微服务、FeignJavaUserApplication。
请求:http://127.0.0.1:8081/feign/findArticleById/1
自定义配置—properties:
1、新建springcloud_user_feign_configuration_properties模块:
复制 springcloud_user_feign 改名、父子pom、导入项目。
2、application.yml:
2.1、指定 feignclient 的名称
2.2、不指定feignclient名称,使用default作用所有feignclient
大概意思:如果你同时配置了@Configuration 和 properties,那么properties 优先级高,也可以使用 feign.client.default-to-properties=false 改变。
# feign 的配置
feign:
client:
config:
springcloud-article:
connectTimeout: 5000
readTimeout: 5000
# 日志级别
loggerLevel: full
# errorDecoder: com.example.SimpleErrorDecoder
# retryer: com.example.SimpleRetryer
# requestInterceptors:
# - com.example.FooRequestInterceptor
# - com.example.BarRequestInterceptor
# decode404: false
# encoder: com.example.SimpleEncoder
# decoder: com.example.SimpleDecoder
# contract: com.example.SimpleContract
# feign 的公共配置 配置所有的 FeignClient 不需要指定feign 的名称, 使用default
#feign:
# client:
# config:
# default:
# connectTimeout: 5000
# readTimeout: 5000
# loggerLevel: basic
Feign 日志:
1、官网介绍
为每一个Feign客户端创建一个日志记录器,其名称默认为feign客户端的全类名。Feign 打印日志只会返回 DEBUG 级别的日志。
2、日志级别指定
2.1、java配置方式中添加:
springcloud_user_feign_configuration_java模块中FeignClient配置类中已添加。
2.2、properties 配置方式:
springcloud_user_feign_configuration_properties模块中application.yml 已指定。
3、application.yml 中添加:
# feign 的日志
logging:
level:
# Feign 客户端全类名
com.coolron.user.client.FeignArticleClient: DEBUG
4、测试:
启动Eureka、文章微服务、客户端微服务,请求接口。
java 配置 和 properties 配置的模块控制台都可以打印日志:
可以看到控制台有 DEBUG 级别的日志。
5、若项目中使用logback-spring.xml,而不是在配置文件中配置日志级别。
# logback-spring.xml
<logger name="com.coolron.user.client.FeignArticleClient" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
总结:
1、可以使用@Configuration(java配置)或 properties(配置文件)覆盖Feign的默认配置。
2、properties 配置优先级高于 java 配置。
3、Feign 的日志配置,只返回 DEBUG 级别日志。
代码地址:
https://gitee.com/cpla026/springcloud/tree/master/springcloud_parent/springcloud_user_feign_configuration_java
https://gitee.com/cpla026/springcloud/tree/master/springcloud_parent/springcloud_user_feign_configuration_properties
个人学习分享
更多 springboot、springcloud、docker 文章,关注微信公众号吧: