Feign的组成

接口
作用
默认值
Feign.Builder
Feign的入口
Feign.Builder
Client
Feign底层用什么去请求
和Ribbon配合时:LoadBalancerFeignClient
不和Ribbon配合时:Fgien.Client.Default
Contract
契约,注解支持
SpringMVCContract
Encoder
解码器,用于将独享转换成HTTP请求消息体
SpringEncoder
Decoder
编码器,将相应消息体转成对象
ResponseEntityDecoder
Logger
日志管理器
Slf4jLogger
RequestInterceptor
用于为每个请求添加通用逻辑(拦截器,例子:比如想给每个请求都带上heared)

Feign的日记级别

日志级别
打印内容
NONE(默认)
不记录任何日志
BASIC
仅记录请求方法,URL,响应状态代码以及执行时间(适合生产环境)
HEADERS
记录BASIC级别的基础上,记录请求和响应的header
FULL
记录请求和弦ineader,body和元数据

首先如何整合Feign

遵循SpringBoot的三板斧第一步:加依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

第二步:写注解

@EnableFeignClients //在启动类上加

第三步:写配置

如何给Feign添加日志级别

细粒度

方式一:代码实现第一步:添加Feign配置类,可以添加在主类下,但是不用添加@Configuration。如果添加了@Configuration而且又放在了主类之下,那么就会所有Feign客户端实例共享,同Ribbon配置类一样父子上下文加载冲突;如果一定添加@Configuration,就放在主类加载之外的包。建议还是不用加@Configuration

public class FeignConfig {
@Bean
public Logger.Level Logger() {
return Logger.Level.FULL;
}
}

第二步:给@FeignClient添加配置类

//@FeignClient configuration = GoodsFeignConfig.class 细粒度配置,指定配置类
@FeignClient(name = "goods", configuration = FeignConfig.class)

第四步:写配置

logging:
level:
com.xxx.xxx.FeignAPI: DEBUG #需要将FeignClient接口全路径写上# 开启日志 格式为logging.level. Feign客户端路径

方式二:配置属性实现

feign:
client:
config:
#想要调用的微服务名称
server-1:
loggerLevel: FULL

全局配置

方式一:代码实现添加了@Configuration放在了主类之下,那么就会所有Feign客户端实例共享,同Ribbon配置类一样父子上下文加载冲突;让父子上下文ComponentScan重叠(强烈不建议)唯一正确方式

//在启动类上为@EnableFeignClients注解添加defaultConfiguration配置
@EnableFeignClients(defaultConfiguration = FeignConfig.class)

方式二:配置属性实现

feign:
client:
config:
#将调用的微服务名称改成default就配置成全局的了
default:
loggerLevel: FULL

Feign支持的配置项

代码方式

配置项
作用
Logger.Level
指定日志级别
Retryer
指定重试策略
ErrorDecoder
指定错误解码器
Request.Options
超时时间
Collection
拦截器
SetterFactory
用于设置Hystrix的配置属性,Fgien整合Hystrix才会用

配置属性

feign:
client:
config:
feignName:
connectTimeout: 5000 # 相当于Request.Optionsn 连接超时时间
readTimeout: 5000 # 相当于Request.Options 读取超时时间
loggerLevel: full # 配置Feign的日志级别,相当于代码配置方式中的Logger
errorDecoder: com.example.SimpleErrorDecoder # Feign的错误解码器,相当于代码配置方式中的ErrorDecoder
retryer: com.example.SimpleRetryer # 配置重试,相当于代码配置方式中的Retryer
requestInterceptors: # 配置拦截器,相当于代码配置方式中的RequestInterceptor
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
# 是否对404错误解码
decode404: false
encode: com.example.SimpleEncoder
decoder: com.example.SimpleDecoder
contract: com.example.SimpleContract

Feign还支持对请求和响应进行GZIP压缩,以提高通信效率,配置方式如下:

# 配置请求GZIP压缩
feign.compression.request.enabled=true
# 配置响应GZIP压缩
feign.compression.response.enabled=true
# 配置压缩支持的MIME TYPE
feign.compression.request.mime-types=text/xml,application/xml,application/json
# 配置压缩数据大小的下限
feign.compression.request.min-request-size=2048

Ribbon配置 VS Feign配置

粒度
Ribbon
Feign
代码局部
@RibbonClient(configuration=RibbonConfig.class)RibbonConfig类必须加@Configuration,且必须放在父上下文无法扫到的包下
@FeignClient(configuration=FeignConfig.class)FeignConfig类的@Configuration可以不加(可选),如果有,必须放在父上下文无法扫到的包下
代码全局
@RibbonClients(defaultConfigurtion=RibbonConfig.class)
@EnableFeignClients(defaultConfiguration = FeignConfig.class)
...
配置属性局部
.ribbon.NFLoadBalancerClassName
...
feign.client.config..loggerLevel
...
配置属性全局
feign.client.config.default.loggerLevel

Feign 代码方式 VS 配置属性方式

配置方式
有点
缺点
代码配置
基于代码,更加灵活
如果Feign的配置类加了@Configuration注解,需注意父子上下文,线上修改需要重打包,发布
属性配置
易上手
配置更加直观
线上修改无需重新打包,发布
优先级更高
极端场景下没有代码配置更加灵活

优先级:细粒度属性配置 > 细粒度代码配置 > 全局属性配置 > 全局代码配置

赵小胖个人博客

Spring Cloud Feign 组成和配置的更多相关文章

  1. spring cloud feign的各种配置的使用

    在上一节我们完成了feign的基本使用,学会了feign如何去调用其他微服务,这次我们来完成feign的一些自定义配置. 实现功能:     1.全局修改feign的配置和单独修改feign客户端的配 ...

  2. 笔记:Spring Cloud Feign Ribbon 配置

    由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...

  3. 笔记:Spring Cloud Feign Hystrix 配置

    在 Spring Cloud Feign 中,除了引入了用户客户端负载均衡的 Spring Cloud Ribbon 之外,还引入了服务保护与容错的工具 Hystrix,默认情况下,Spring Cl ...

  4. 笔记:Spring Cloud Feign 其他配置

    请求压缩 Spring Cloud Feign 支持对请求与响应进行GZIP压缩,以减少通信过程中的性能损耗,我们只需要通过下面二个参数设置,就能开启请求与响应的压缩功能,yml配置格式如下: fei ...

  5. Spring Cloud Feign Ribbon 配置

    由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...

  6. Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,输出异常

    Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,出现请求异常时,会进入熔断处理,但是不会抛出异常信息. 经过以下配置,可以抛出异常: 将原有ErrorEncoder ...

  7. Spring Cloud Feign 自定义配置(重试、拦截与错误码处理) 实践

    Spring Cloud Feign 自定义配置(重试.拦截与错误码处理) 实践 目录 Spring Cloud Feign 自定义配置(重试.拦截与错误码处理) 实践 引子 FeignClient的 ...

  8. 笔记:Spring Cloud Feign 声明式服务调用

    在实际开发中,对于服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以我们通常会针对各个微服务自行封装一些客户端类来包装这些依赖服务的调用,Spring Cloud Feign 在此基础上做了进 ...

  9. Spring Boot + Spring Cloud 实现权限管理系统 配置中心(Config、Bus)

    技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每个项目都散落着各种配置文件,且随着服务的增加而不断增多.此时,往往某一个基础服务信息变更,都会导致一系列服务的更新和重启, ...

随机推荐

  1. 【Mongodb】mongoDB与mongoose---Scheme和Collections对应问题

    mongodb是一个基于分布式文件存储的文档型数据库 MongoDB 是一个介于关系数据库和非关系数据库之间的产品 MongoDB 最大的特点是他支持的查询语言非常强大,而且还支持对数据建立索引 官方 ...

  2. 许家印67亿买下FF恒大是要雪中送炭吗?

    从大环境来看,当下新能源汽车已经是备受投资者青睐的领域.据不完全统计,当下国内已经有300余家电动汽车企业.而蔚来.小鹏.威马等动辄都融资上百亿元,显现出火爆的发展趋势.甚至就连董明珠董大姐也有着自己 ...

  3. log4j中%5p的含义

    因为日志级别分别有error,warn,info,debug,fatal5种,有些是5个字母的,有些是4个字母的,如果直接写%p就会对不齐,%-5p的意思是日志级别输出左对齐,右边以空格填充,%5p的 ...

  4. element ui 自定义异步验证

    之前提到过,axios是一个异步请求,但是很多时候我们都需要同步请求,比如在element的表单验证中需要验证一个用户名是否存在的时候,异步请求好像就不太好用了.前边博客中提到过,这种情况可以用es6 ...

  5. day40-进程-生产者消费者模型进阶

    #1.队列的数据是安全的,因为队列内置了一把锁,大家都来抢占资源的时候,A在操作数据的时候,B就无法操作该数据. # 下面代码有两个生产者和三个消费者,包子吃完之后,接着放的两个None被marry和 ...

  6. linux进程(一)

    回顾:CentOS6的启动过程开机自检->找硬盘->操作系统->内核->进程->登录 Systemd借鉴了很多launchd的思想,他的重要特性如下:1.同SysVini ...

  7. DAG Optimal Coin Change

    题目描述 In a 10-dollar shop, everything is worthy 10 dollars or less. In order to serve customers more ...

  8. redis的集群:

    集群策略:主从复制哨兵集群 参考:https://blog.csdn.net/q649381130/article/details/79931791 集群又分为如下:客户端分片基于代理的分片路由查询参 ...

  9. ABB机器人故障处理指南

    ABB工业机器人常见故障处理 1. 开机示教器显示如下   1) 如果机器人开机,示教器一直显示connecting to the robot controller,如上图(robotware版本是白 ...

  10. java课java方法动手动脑

    动手动脑: import java.util.Scanner; public class Random { public static void main(String[] args) {       ...