【Spring Cloud】詳解Feign經常使用配置

1 Feign經常使用配置

搭載着Spring Cloud的順風車,Feign正以席捲之勢成爲使用Spring架構的大大小小互聯網公司發起HTTP調用的首選框架。基於接口的聲明式定義、客戶端負載均衡、斷路器和後備方法(fallback)是Feign相對上一代HTTP調用框架(好比Spring Template,Apache HttpClient)的四大優點。html

相似於Retrofit和OkHttp的關係,Feign其實是對普通HTTP客戶端的一層封裝,其目的是下降集成成本、提高可靠性。Feign支持三種HTTP客戶端,包括JDK自帶的HttpURLConnection、Apache HttpClient和Square OkHttp,默認使用Apache HttpClient。git

  • HttpURLConnection:不支持線程池,通常不會選用。
  • HttpClient:相比OkHttp,HttpClient並無明顯的優點,多是由於使用更普遍,因此被Feign選爲默認實現。從5.0版本開始才支持HTTP/2。
  • OkHttp:開發Android應用的首選HTTP客戶端,支持HTTP/2,經過設置feign.okhttp.enabled=true啓用。

Feign提供了兩大類配置屬性來配置上述三種HTTP客戶端,feign.client.*feign.httpclient.*,前者支持按實例進行配置(註解-1),後者全局共享一套配置,包含線程池配置,但隻影響HttpClient和OkHttp,不影響HttpURLConnection,具體關係見下表。github

註解-1:所謂按實例進行配置,就是指每一個FeignClient實例均可以經過 feign.client.<feignClientName>.*來單獨進行配置,注意首字母小寫。而 feign.client.default.*表示默認配置。
HTTP客戶端 鏈接超時時間 請求超時時間 線程存活時間 線程池最大鏈接數(全局) 線程池最大鏈接數(單個HOST)
HttpURLConnection feign.client.[default|<feignClientName>].connect-timeout<br/>默認值:10秒 feign.client.[default|<feignClientName>].read-timeout<br/>默認值:60秒 N/A N/A N/A
HttpClient feign.httpclient.connection-timeout<br/>默認值:2秒 默認值:-1(RequestConfig.Builder.socketTimeout) feign.httpclient.time-to-live<br/>默認值:900秒 feign.httpclient.max-connections<br/>默認值:200 feign.httpclient.max-connections-per-route<br/>默認值:50
OkHttp feign.httpclient.connection-timeout<br/>默認值:2秒 feign.client.[default|<feignClientName>].read-timeout<br/>默認值:10秒 feign.httpclient.time-to-live<br/>默認值:900秒 feign.httpclient.max-connections<br/>默認值:200 N/A

從上表能夠看到,Feign提供了兩個鏈接超時配置,HttpURLConnection使用feign.client.[default|<feignClientName>].connect-timeout,而HttpClient和OkHttp則使用feign.httpclient.connection-timeout,這一點要尤爲注意。spring

2 啓用Hystrix

經過設置feign.hystrix.enabled=true能夠啓用Feign的斷路器支持(基於Hystrix)。跟Feign同樣,Hystrix也支持按實例進行配置,詳細配置屬性參見官方文檔架構

因爲Hystrix默認的請求超時時間爲1秒,很容易觸發超時異常,因此每每須要調大。調大超時時間有兩種方式,負載均衡

  • 第一種方式,經過hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds設置默認超時時間,影響全部請求。
  • 第二種方式,若是你不想改變全部請求的超時時間,那麼能夠經過hystrix.command.<HystrixCommandKey>.execution.isolation.thread.timeoutInMilliseconds單獨設置某個Hystrix Command的超時時間。那麼問題來了,Feign下面,這個Hystrix Command Key究竟是什麼呢,是和Feign Client Name同樣嗎?答案是否認的。Feign下面,一個Hystrix Command對應的是Feign Client的一個方法,所以Hystrix Command Key的定義爲<FeignClientName>#<methodName>(<arg1ClassName>,<arg2ClassName>...),注意首字母大寫,詳見SetterFactory.Default#create()方法。

3 小結

不論是Spring仍是Spring Cloud,因爲整個生態過於龐大,所以即使是官方文檔,也只能勉強覆蓋各個組件的大致框架,一旦深刻細節就只能靠開發者本身研讀源碼來尋找答案。就像Linus Torvalds說的,Talk is cheap. Show me the code.框架

quote-talk-is-cheap-show-me-the-code-linus-torvalds.jpg

4 參考

相關文章
相關標籤/搜索