什麼是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的配置文件,代碼如下:
其配置文件如下:
什麼是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的配置文件,代碼如下:
其配置文件如下:
查看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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:
其中有個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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:
其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。
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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:
其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。
Client組件
其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.
首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:
在缺失配置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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:
其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。
Client組件
其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.
首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:
在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:
怎麼在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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:
其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。
Client組件
其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.
首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:
在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:
怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼
從代碼@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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:
其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。
Client組件
其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.
首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:
在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:
怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼
從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.
在pom文件加上:
同理,如果想要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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:
其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。
Client組件
其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.
首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:
在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:
怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼
從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.
在pom文件加上:
同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:
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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:
其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。
Client組件
其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.
首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:
在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:
怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼
從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.
在pom文件加上:
同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:
feign的負載均衡是怎麼樣實現的呢?
通過上述的FeignRibbonClientAutoConfiguration類配置Client的類型(httpurlconnection,okhttp和httpclient)時候,可知最終向容器注入的是LoadBalancerFeignClient,即負載均衡客戶端。現在來看下LoadBalancerFeignClient的代碼:
其中有個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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:
其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。
Client組件
其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.
首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:
在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:
怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼
從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.
在pom文件加上:
同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:
feign的負載均衡是怎麼樣實現的呢?
通過上述的FeignRibbonClientAutoConfiguration類配置Client的類型(httpurlconnection,okhttp和httpclient)時候,可知最終向容器注入的是LoadBalancerFeignClient,即負載均衡客戶端。現在來看下LoadBalancerFeignClient的代碼:
其中有個executeWithLoadBalancer()方法,即通過負載均衡的方式請求。
其中服務在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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:
其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。
Client組件
其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.
首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:
在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:
怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼
從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.
在pom文件加上:
同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:
feign的負載均衡是怎麼樣實現的呢?
通過上述的FeignRibbonClientAutoConfiguration類配置Client的類型(httpurlconnection,okhttp和httpclient)時候,可知最終向容器注入的是LoadBalancerFeignClient,即負載均衡客戶端。現在來看下LoadBalancerFeignClient的代碼:
其中有個executeWithLoadBalancer()方法,即通過負載均衡的方式請求。
其中服務在submit()方法上,點擊submit進入具體的方法,這個方法是LoadBalancerCommand的方法:
上述代碼中有個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的配置文件,代碼如下:
其配置文件如下:
查看FeignClient的源碼,其代碼如下:
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
代碼如下:
重寫配置:
你可以重寫FeignClientsConfiguration中的bean,從而達到自定義配置的目的,比如FeignClientsConfiguration的默認重試次數為Retryer.NEVER_RETRY,即不重試,那麼希望做到重寫,代碼如下:
在上述代碼更改了該FeignClient的重試次數,重試間隔為100ms,最大重試時間為1s,重試次數為5次。
Feign的工作原理
feign是一個偽客戶端,即它不做任何的請求處理。Feign通過處理註解生成request,從而實現簡化HTTP API開發的目的,即開發人員可以使用註解的方式定製request api模板,在發送http request請求之前,feign通過處理註解的方式替換掉request模板中的參數,這種實現方式顯得更為直接、可理解。
通過包掃描注入FeignClient的bean,該源碼在FeignClientsRegistrar類: 首先在啟動配置上檢查是否有@EnableFeignClients註解,如果有該註解,則開啟包掃描,掃描被@FeignClient註解接口。代碼如下:
掃描到FeignClient後,將信息取出,以bean的形式注入到ioc容器中,源碼如下:
注入bean之後,通過jdk的代理,當請求Feign Client的方法時會被攔截,代碼在ReflectiveFeign類,代碼如下:
在SynchronousMethodHandler類進行攔截處理,當被攔截會根據參數生成RequestTemplate對象,該對象就是http請求的模板,代碼如下:
其中有個executeAndDecode()方法,該方法是通RequestTemplate生成Request請求對象,然後根據用client獲取response。
Client組件
其中Client組件是一個非常重要的組件,Feign最終發送request請求以及接收response響應,都是由Client組件完成的,其中Client的實現類,只要有Client.Default,該類由HttpURLConnnection實現網絡請求,另外還支持HttpClient、Okhttp.
首先來看以下在FeignRibbonClient的自動配置類,FeignRibbonClientAutoConfiguration ,主要在工程啟動的時候注入一些bean,其代碼如下:
在缺失配置feignClient的情況下,會自動注入new Client.Default(),跟蹤Client.Default()源碼,它使用的網絡請求框架為HttpURLConnection,代碼如下:
怎麼在feign中使用HttpClient,查看FeignRibbonClientAutoConfiguration的源碼
從代碼@ConditionalOnClass(ApacheHttpClient.class)註解可知道,只需要在pom文件加上HttpClient的classpath就行了,另外需要在配置文件上加上feign.httpclient.enabled為true,從 @ConditionalOnProperty註解可知,這個可以不寫,在默認的情況下就為true.
在pom文件加上:
同理,如果想要feign使用Okhttp,則只需要在pom文件上加上feign-okhttp的依賴:
feign的負載均衡是怎麼樣實現的呢?
通過上述的FeignRibbonClientAutoConfiguration類配置Client的類型(httpurlconnection,okhttp和httpclient)時候,可知最終向容器注入的是LoadBalancerFeignClient,即負載均衡客戶端。現在來看下LoadBalancerFeignClient的代碼:
其中有個executeWithLoadBalancer()方法,即通過負載均衡的方式請求。
其中服務在submit()方法上,點擊submit進入具體的方法,這個方法是LoadBalancerCommand的方法:
上述代碼中有個selectServe(),該方法是選擇服務的進行負載均衡的方法,代碼如下:
最終負載均衡交給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
作者:方誌朋