发布时间:2023-02-14 13:30
在前面的文章:
- 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.RELEASEspring-boot.version>
<spring-cloud.version>Hoxton.SR9spring-cloud.version>
<spring-cloud-alibaba.version>2.2.6.RELEASEspring-cloud-alibaba.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring-boot.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring-cloud-alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
我们使用feign最核心的是要构造一个FeignClient,里面包含了一系列的组件:Encoder、Decoder、Logger、Contract。
Encoder编码器,当我们调用接口时,如果传递的参数是一个对象,Feign需要对这个对象进行encode编码,做JSON序列化;即:Encoder负责将Java对象转换为JSON字符串。
Decoder解码器,当接口收到一个JSON对象后,Feign需要对这个对象进行decode解码,即:Decoder负责将JSON字符串转换成JavaBean对象。
一般来说Feign的@FeignClient注解需要和spring web mvc支持的@PathVariable、@RequestMapping、@RequestParam等注解结合起来使用,但是Feign本身是不支持Spring Web Mvc注解的,所以需要有一个契约组件(Contract
),负责解释Spring MVC的注解,让Feign可以和Spring MVC注解结合起来使用。
Logger为打印Feign接口请求调用日志的日志组件,默认为Slf4jLogger。
- Decoder:ResponseEntityDecoder
- Encoder:SpringEncoder
- Contract:SpringMvcContract
- Logger:Slf4jLogger
根据SpringBoot自动装配的特性,找到@FeignClient
注解所在的jar包 --> spring-cloud-openfeign-core
中的XxxAutoConfiguration类 或 XxxConfiguration类。
又上述这些组件都是被FeignClient所使用,找到FeignClientsConfiguration
类;