一、前言
在前面的文章:
- SpringCloud之Feign实现声明式客户端负载均衡详细案例
- SpringCloud之OpenFeign实现服务间请求头数据传递(OpenFeign拦截器RequestInterceptor的使用)
- SpringCloud之OpenFeign的常用配置(超时、数据压缩、日志)
我们聊了以下内容:
- OpenFeign的概述、为什么会使用Feign代替Ribbon?
- Feign和OpenFeign的区别?
- 详细的OpenFeign实现声明式客户端负载均衡案例
- OpenFeign中拦截器RequestInterceptor的使用
- OpenFeign的一些常用配置(超时、数据压缩、日志输出)
本文我们继续讨论OpenFeign有哪些核心组件?
PS:本文基于的SpringCloud版本
<properties>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
二、核心组件
我们使用feign最核心的是要构造一个FeignClient,里面包含了一系列的组件:Encoder、Decoder、Logger、Contract。
1、Encoder
Encoder编码器,当我们调用接口时,如果传递的参数是一个对象,Feign需要对这个对象进行encode编码,做JSON序列化;即:Encoder负责将Java对象转换为JSON字符串。
2、Decoder
Decoder解码器,当接口收到一个JSON对象后,Feign需要对这个对象进行decode解码,即:Decoder负责将JSON字符串转换成JavaBean对象。
3、Contract
一般来说Feign的@FeignClient注解需要和spring web mvc支持的@PathVariable、@RequestMapping、@RequestParam等注解结合起来使用,但是Feign本身是不支持Spring Web Mvc注解的,所以需要有一个契约组件(Contract ),负责解释Spring MVC的注解,让Feign可以和Spring MVC注解结合起来使用。
4、Logger
Logger为打印Feign接口请求调用日志的日志组件,默认为Slf4jLogger。
5、默认组件
- Decoder:ResponseEntityDecoder
- Encoder:SpringEncoder
- Contract:SpringMvcContract
- Logger:Slf4jLogger
1)为什么默认是这些?
根据SpringBoot自动装配的特性,找到@FeignClient 注解所在的jar包 --> spring-cloud-openfeign-core 中的XxxAutoConfiguration类 或 XxxConfiguration类。
又上述这些组件都是被FeignClient所使用,找到FeignClientsConfiguration 类;
<1> 默认的Eecoder:
<2> 默认的Decoder:
<3> 默认的Contract:
|