Spring Cloud Feign 组成和配置

### 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的三板斧**
**第一步:加依赖**
```pom

org.springframework.cloud
spring-cloud-starter-openfeign

```
**第二步:写注解**
```java
@EnableFeignClients //在启动类上加
```
**第三步:写配置**
```yml

```
****
### 如何给Feign添加日志级别

#### 细粒度
**方式一:代码实现**
第一步:添加Feign配置类,可以添加在主类下,但是不用添加`@Configuration`。如果添加了`@Configuration`而且又放在了主类之下,那么就会所有Feign客户端实例共享,同Ribbon配置类一样父子上下文加载冲突;如果一定添加`@Configuration`,就放在主类加载之外的包。建议还是不用加`@Configuration`。
```java
public class FeignConfig {
@Bean
public Logger.Level Logger() {
return Logger.Level.FULL;
}
}
```
第二步:给`@FeignClient`添加配置类
```java
//@FeignClient configuration = GoodsFeignConfig.class 细粒度配置,指定配置类
@FeignClient(name = "goods", configuration = FeignConfig.class)
```
第四步:写配置
```yml
logging:
level:
com.xxx.xxx.FeignAPI: DEBUG #需要将FeignClient接口全路径写上# 开启日志 格式为logging.level.+Feign客户端路径
```
**方式二:配置属性实现**
```yml
feign:
client:
config:
#想要调用的微服务名称
server-1:
loggerLevel: FULL
```
#### 全局配置
**方式一:代码实现**
~~添加了`@Configuration`放在了主类之下,那么就会所有Feign客户端实例共享,同Ribbon配置类一样父子上下文加载冲突;让父子上下文ComponentScan重叠(强烈不建议)~~
**唯一正确方式**
```java
//在启动类上为@EnableFeignClients注解添加defaultConfiguration配置
@EnableFeignClients(defaultConfiguration = FeignConfig.class)
```
**方式二:配置属性实现**
```yml
feign:
client:
config:
#将调用的微服务名称改成default就配置成全局的了
default:
loggerLevel: FULL
```

### Feign支持的配置项
#### 代码方式

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

#### 配置属性
```yml
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压缩,以提高通信效率,配置方式如下:**
```yml
# 配置请求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`注解,需注意父子上下文,线上修改需要重打包,发布 |
| 属性配置 | 易上手
配置更加直观
线上修改无需重新打包,发布
**优先级更高** | 极端场景下没有代码配置更加灵活 |

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

[赵小胖个人博客](https://zc.happyloves.cn:4443/wordpress/)

原文地址:https://www.cnblogs.com/Sky0914/p/11657725.html

时间: 2024-10-24 05:55:21

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

笔记:Spring Cloud Feign 其他配置

请求压缩 Spring Cloud Feign 支持对请求与响应进行GZIP压缩,以减少通信过程中的性能损耗,我们只需要通过下面二个参数设置,就能开启请求与响应的压缩功能,yml配置格式如下: feign: compression: request: enabled: true response: enabled: true 同时,我们还能对请求压缩做一些更细致的设置,比如指定压缩的请求数据类型,并设置了请求压缩的大小下限,只有超过这个大小的请求才会对其进行压缩,示例如下: feign: com

笔记:Spring Cloud Feign Ribbon 配置

由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参数. 全局配置 全局配置的方法非常简单,我们可以i直接使用 ribbon.<key>=<value>的方式来设置 ribbon 的各项默认参数,比如,修改默认的客户端调用超时时间示例如下,使用 yml 格式配置: ribbon: ConnectionTimeout: 500 ReadT

笔记:Spring Cloud Feign Hystrix 配置

在 Spring Cloud Feign 中,除了引入了用户客户端负载均衡的 Spring Cloud Ribbon 之外,还引入了服务保护与容错的工具 Hystrix,默认情况下,Spring Cloud Feign 会为将所有 Feign客户端的方法都封装到 Hystrix 命令中进行服务保护,需要注意的是 Ribbon 的超时与 Hystrix 的超时是二个概念,需要让 Hystrix 的超时时间大于 Ribbon 的超时时间,否则 Hystrix 命令超时后,该命令直接熔断,重试机制就没

微服务架构之spring cloud feign

在spring cloud ribbon中我们用RestTemplate实现了服务调用,可以看到我们还是需要配置服务名称,调用的方法 等等,其实spring cloud提供了更优雅的服务调用方式,就是这篇文章要讲解的spring cloud feign,feign内部已经集成了ribbon,所以不用再单独引用,只需要引用spring cloud feign即可. (一) 版本说明 a) Spring boot 2.0.6.RELEASE b) Spring cloud Finchley.SR2

Spring cloud Feign 深度学习与应用

简介 Spring Cloud Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单.Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数.格式.地址等信息.Feign会完全代理HTTP请求,开发时只需要像调用方法一样调用它就可以完成服务请求及相关处理.开源地址:https://github.com/OpenFeign/feign.Feign整合了Ribbon负载和Hystrix熔断,可以不再需要显式地

使用Spring Cloud Feign

使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务 在spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client, Spring的RestTemplate.但是,用起来最方便.最优雅的还是要属Feign了. Feign简介 Feign是一种声明式.模板化的HT

Spring Cloud之——Config(配置中心)

Spring Cloud Config(配置中心) 大家好,有一段时间没有写技术博客了.由于工作上的事情,这方面很难分配时间.近几年随着服务化的兴起,一批服务化的框架应运而生,像dubbo,thrift,spring-cloud等.在国内使用dubbo的公司非常多,dubbo也是java程序员面试时必备知识点,而且它的官方文档写的非常清晰易懂,这都使得dubbo的普及非常容易.thrift是apache贡献的,似乎也流行了一段时间,小编对这个框架不是很了解.随后spring-cloud一经推出,

spring cloud深入学习(七)-----配置中心git示例

随着线上项目变的日益庞大,每个项目都散落着各种配置文件,如果采用分布式的开发模式,需要的配置文件随着服务增加而不断增多.某一个基础服务信息变更,都会引起一系列的更新和重启,运维苦不堪言也容易出错.配置中心便是解决此类问题的灵丹妙药. 市面上开源的配置中心有很多,BAT每家都出过,360的QConf.淘宝的diamond.百度的disconf都是解决这类问题.国外也有很多开源的配置中心Apache的Apache Commons Configuration.owner.cfg4j等等.这些开源的软件

spring cloud 注册中心 instance_id 配置

spring cloud 注册中心 instance_id 配置 consul 注册发现中心 instance_id 配置 ip + 端口 一般网上推荐的配置都是 ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} ${random.value} 每次再重启后都会生成一个随机数 会造成每次重启后会在 consul 上重新注册注册上一