'Java後端精選技術:深入理解Feign'

Java 技術 Java架構人生 2019-09-12
"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

Java後端精選技術:深入理解Feign

其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

Java後端精選技術:深入理解Feign

其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。

Java後端精選技術:深入理解Feign

Client組件

其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.

首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

Java後端精選技術:深入理解Feign

其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。

Java後端精選技術:深入理解Feign

Client組件

其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.

首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:

Java後端精選技術:深入理解Feign

在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

Java後端精選技術:深入理解Feign

其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。

Java後端精選技術:深入理解Feign

Client組件

其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.

首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:

Java後端精選技術:深入理解Feign

在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:

Java後端精選技術:深入理解Feign

怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

Java後端精選技術:深入理解Feign

其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。

Java後端精選技術:深入理解Feign

Client組件

其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.

首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:

Java後端精選技術:深入理解Feign

在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:

Java後端精選技術:深入理解Feign

怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼

Java後端精選技術:深入理解Feign

從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.

在pom文件加上:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

Java後端精選技術:深入理解Feign

其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。

Java後端精選技術:深入理解Feign

Client組件

其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.

首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:

Java後端精選技術:深入理解Feign

在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:

Java後端精選技術:深入理解Feign

怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼

Java後端精選技術:深入理解Feign

從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.

在pom文件加上:

Java後端精選技術:深入理解Feign

同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

Java後端精選技術:深入理解Feign

其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。

Java後端精選技術:深入理解Feign

Client組件

其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.

首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:

Java後端精選技術:深入理解Feign

在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:

Java後端精選技術:深入理解Feign

怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼

Java後端精選技術:深入理解Feign

從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.

在pom文件加上:

Java後端精選技術:深入理解Feign

同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:

Java後端精選技術:深入理解Feign

feign的負載均衡是怎麼樣實現的呢?

通過上述的FeignRibbonClientAutoConfiguration類配置Client的類型(httpurlconnection,okhttp和httpclient)時候,可知最終向容器注入的是LoadBalancerFeignClient,即負載均衡客戶端。現在來看下LoadBalancerFeignClient的代碼:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

Java後端精選技術:深入理解Feign

其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。

Java後端精選技術:深入理解Feign

Client組件

其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.

首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:

Java後端精選技術:深入理解Feign

在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:

Java後端精選技術:深入理解Feign

怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼

Java後端精選技術:深入理解Feign

從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.

在pom文件加上:

Java後端精選技術:深入理解Feign

同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:

Java後端精選技術:深入理解Feign

feign的負載均衡是怎麼樣實現的呢?

通過上述的FeignRibbonClientAutoConfiguration類配置Client的類型(httpurlconnection,okhttp和httpclient)時候,可知最終向容器注入的是LoadBalancerFeignClient,即負載均衡客戶端。現在來看下LoadBalancerFeignClient的代碼:

Java後端精選技術:深入理解Feign

其中有個executeWithLoadBalancer()方法,即通過負載均衡的方式請求。

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

Java後端精選技術:深入理解Feign

其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。

Java後端精選技術:深入理解Feign

Client組件

其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.

首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:

Java後端精選技術:深入理解Feign

在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:

Java後端精選技術:深入理解Feign

怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼

Java後端精選技術:深入理解Feign

從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.

在pom文件加上:

Java後端精選技術:深入理解Feign

同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:

Java後端精選技術:深入理解Feign

feign的負載均衡是怎麼樣實現的呢?

通過上述的FeignRibbonClientAutoConfiguration類配置Client的類型(httpurlconnection,okhttp和httpclient)時候,可知最終向容器注入的是LoadBalancerFeignClient,即負載均衡客戶端。現在來看下LoadBalancerFeignClient的代碼:

Java後端精選技術:深入理解Feign

其中有個executeWithLoadBalancer()方法,即通過負載均衡的方式請求。

Java後端精選技術:深入理解Feign

其中服務在submit()方法上,點擊submit進入具體的方法,這個方法是LoadBalancerCommand的方法:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

Java後端精選技術:深入理解Feign

其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。

Java後端精選技術:深入理解Feign

Client組件

其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.

首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:

Java後端精選技術:深入理解Feign

在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:

Java後端精選技術:深入理解Feign

怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼

Java後端精選技術:深入理解Feign

從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.

在pom文件加上:

Java後端精選技術:深入理解Feign

同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:

Java後端精選技術:深入理解Feign

feign的負載均衡是怎麼樣實現的呢?

通過上述的FeignRibbonClientAutoConfiguration類配置Client的類型(httpurlconnection,okhttp和httpclient)時候,可知最終向容器注入的是LoadBalancerFeignClient,即負載均衡客戶端。現在來看下LoadBalancerFeignClient的代碼:

Java後端精選技術:深入理解Feign

其中有個executeWithLoadBalancer()方法,即通過負載均衡的方式請求。

Java後端精選技術:深入理解Feign

其中服務在submit()方法上,點擊submit進入具體的方法,這個方法是LoadBalancerCommand的方法:

Java後端精選技術:深入理解Feign

上述代碼中有個selectServe(),該方法是選擇服務的進行負載均衡的方法,代碼如下:

"

什麼是Feign

Feign是由Retrofit,JAXRS-2.0和WebSocket啟發的一個java到http客戶端綁定。 Feign的主要目標是將Java Http Clients變得簡單。Feign的源碼地址:https://github.com/OpenFeign/feign


寫一個Feign

在我之前的博文有寫到如何用Feign去消費服務,簡單的實現一個Feign客戶端,首先通過@FeignClient,客戶端,其中value為調用其他服務的名稱,FeignConfig.class為FeignClient的配置文件,代碼如下:

Java後端精選技術:深入理解Feign

其配置文件如下:

Java後端精選技術:深入理解Feign

查看FeignClient的源碼,其代碼如下:

Java後端精選技術:深入理解Feign

feign 用於聲明具有該接口的REST客戶端的接口的註釋應該是創建(例如用於自動連接到另一個組件。 如果功能區可用,那將是 用於負載平衡後端請求,並且可以配置負載平衡器 使用與偽裝客戶端相同名稱(即值)@RibbonClient 。

其中value()和name()一樣,是被調用的 service的名稱。 url(),直接填寫硬編碼的url,decode404()即404是否被解碼,還是拋異常;configuration(),標明FeignClient的配置類,默認的配置類為FeignClientsConfiguration類,可以覆蓋Decoder、Encoder和Contract等信息,進行自定義配置。fallback(),填寫熔斷器的信息類。


FeignClient的配置

默認的配置類為FeignClientsConfiguration,這個類在spring-cloud-netflix-core的jar包下,打開這個類,可以發現它是一個配置類,注入了很多的相關配置的bean,包括feignRetryer、FeignLoggerFactory、FormattingConversionService等,其中還包括了Decoder、Encoder、Contract,如果這三個bean在沒有注入的情況下,會自動注入默認的配置。

  • Decoder feignDecoder: ResponseEntityDecoder(這是對SpringDecoder的封裝)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.Builder

代碼如下:

Java後端精選技術:深入理解Feign

重寫配置:

你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:

Java後端精選技術:深入理解Feign

在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。


Feign的工作原理

feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。

通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:

Java後端精選技術:深入理解Feign

掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:

Java後端精選技術:深入理解Feign

Java後端精選技術:深入理解Feign

注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:

Java後端精選技術:深入理解Feign

在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:

Java後端精選技術:深入理解Feign

其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。

Java後端精選技術:深入理解Feign

Client組件

其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.

首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:

Java後端精選技術:深入理解Feign

在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:

Java後端精選技術:深入理解Feign

怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼

Java後端精選技術:深入理解Feign

從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.

在pom文件加上:

Java後端精選技術:深入理解Feign

同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:

Java後端精選技術:深入理解Feign

feign的負載均衡是怎麼樣實現的呢?

通過上述的FeignRibbonClientAutoConfiguration類配置Client的類型(httpurlconnection,okhttp和httpclient)時候,可知最終向容器注入的是LoadBalancerFeignClient,即負載均衡客戶端。現在來看下LoadBalancerFeignClient的代碼:

Java後端精選技術:深入理解Feign

其中有個executeWithLoadBalancer()方法,即通過負載均衡的方式請求。

Java後端精選技術:深入理解Feign

其中服務在submit()方法上,點擊submit進入具體的方法,這個方法是LoadBalancerCommand的方法:

Java後端精選技術:深入理解Feign

上述代碼中有個selectServe(),該方法是選擇服務的進行負載均衡的方法,代碼如下:

Java後端精選技術:深入理解Feign

最終負載均衡交給loadBalancerContext來處理,即之前講述的Ribbon,在這裡不再重複。

總結

總到來說,Feign的源碼實現的過程如下:

  • 首先通過@EnableFeignCleints註解開啟FeignCleint
  • 根據Feign的規則實現接口,並加@FeignCleint註解
  • 程序啟動後,會進行包掃描,掃描所有的@ FeignCleint的註解的類,並將這些信息注入到ioc容器中。
  • 當接口的方法被調用,通過jdk的代理,來生成具體的RequesTemplate
  • RequesTemplate在生成Request
  • Request交給Client去處理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp
  • 最後Client被封裝到LoadBalanceClient類,這個類結合類Ribbon做到了負載均衡。


原文地址:https://dwz.cn/iXjQZJdr
作者:方誌朋
"

相關推薦

推薦中...