springcloud 系列--瞭解一下 OpenFeign

寫在前面

思考的過程往往比直接得到結論更加重要

Feign

對於 feign,無疑就是整合了 ribbon + hystrix,然後封裝爲對開發使用起來更加友好的 jar。因此本質上,feign 是 ribbon + hystrix. 因此,在學習 Feign 之前,建議先把 ribbon, hystrix 學習一下。

儘管,Feign 只做了封裝加強,但是有幾個問題還是值得思考的

1、feign 如何完成對註解 @FeignClient 的加載的

@EnableFeignClient 註解導入了 FeignClientsRegistrar 類, FeignClientsRegistrar 實現了 ImportBeanDefinitionRegistrar 接口,完成了對 @FeignClient 類的加載。

2、Fegin 一般是接口,它是如何完成動態代理的?

2.1、未啓用 Hystrix

爲每個 @FeignClient 注入的 Feign 配置類 FeignClientFactoryBean,實現了 FactoryBean。在 getObject()時,創建 ReflectiveFeign.FeignInvocationHandler。 FeignInvocationHandler 對應的就是被 @FeignClient 註解標註的類。方法則對應 SynchronousMethodHandler。 當在調用時 Feign 方法時,會被 FeignInvocationHandler 代理。

FeignInvocationHandler 創建流程如下
在這裏插入圖片描述

Feign 動態代理執行流程如下
在這裏插入圖片描述

2.2、啓用 Hystrix

當 feign.hystrix.enable=true 時,此時會被 @FeignClient 會被 HystrixInvocationHandler 代理,先走 Hystrix 的邏輯,然後再走 SynchronousMethodHandler 的邏輯。

3、把大多數人難住的 OpenFeign 文件上傳

網上大部分的關於 openFeign 文件上傳的文章,可能都會教你這麼做:

  1. 引入對應的jar
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form</artifactId>
    <version>3.8.0</version>
</dependency>

實際上,這個不需要再引入,因爲 openFeign 已經引入了該依賴

  1. 裝入 SpringFormEncoder
@Configuration
public class ServiceClientConfig {
    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(messageConverters));
    }
}

實際上,SpringFormEncoder 不需要再裝入,openFeign 已經裝入該 Encoder。


正確的編碼,如下

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    String upload(@RequestPart(name = "file") MultipartFile file);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章