1 Feign常用配置
搭載著Spring Cloud的順風(fēng)車,F(xiàn)eign正以席卷之勢成為使用Spring架構(gòu)的大大小小互聯(lián)網(wǎng)公司發(fā)起HTTP調(diào)用的首選框架猎莲。基于接口的聲明式定義辅肾、客戶端負載均衡锻拘、斷路器和后備方法(fallback)是Feign相對上一代HTTP調(diào)用框架(比如Spring Template,Apache HttpClient)的四大優(yōu)勢纯路。
類似于Retrofit和OkHttp的關(guān)系或油,F(xiàn)eign實際上是對普通HTTP客戶端的一層封裝,其目的是降低集成成本驰唬、提升可靠性顶岸。Feign支持三種HTTP客戶端腔彰,包括JDK自帶的HttpURLConnection、Apache HttpClient和Square OkHttp辖佣,默認使用Apache HttpClient霹抛。
- HttpURLConnection:不支持線程池,一般不會選用卷谈。
- HttpClient:相比OkHttp杯拐,HttpClient并沒有明顯的優(yōu)勢,可能是因為使用更廣泛世蔗,所以被Feign選為默認實現(xiàn)端逼。從5.0版本開始才支持HTTP/2。
- OkHttp:開發(fā)Android應(yīng)用的首選HTTP客戶端污淋,支持HTTP/2顶滩,通過設(shè)置
feign.okhttp.enabled=true
啟用。
Feign提供了兩大類配置屬性來配置上述三種HTTP客戶端寸爆,feign.client.*
和feign.httpclient.*
礁鲁,前者支持按實例進行配置(注解-1),后者全局共享一套配置赁豆,包含線程池配置仅醇,但只影響HttpClient和OkHttp,不影響HttpURLConnection魔种,具體關(guān)系見下表析二。
注解-1:所謂按實例進行配置,就是指每個FeignClient實例都可以通過
feign.client.<feignClientName>.*
來單獨進行配置务嫡,注意首字母小寫甲抖。而feign.client.default.*
表示默認配置。
HTTP客戶端 | 連接超時時間 | 請求超時時間 | 線程存活時間 | 線程池最大連接數(shù)(全局) | 線程池最大連接數(shù)(單個HOST) |
---|---|---|---|---|---|
HttpURLConnection | feign.client.<code>[default|<feignClientName>].connect-timeout</code> 默認值:10秒 |
feign.client.<code>[default|<feignClientName>].read-timeout</code> 默認值:60秒 |
N/A | N/A | N/A |
HttpClient | feign.httpclient.connection-timeout 默認值:2秒 |
默認值:-1(RequestConfig.Builder.socketTimeout) | feign.httpclient.time-to-live 默認值:900秒 |
feign.httpclient.max-connections 默認值:200 |
feign.httpclient.max-connections-per-route 默認值:50 |
OkHttp | feign.httpclient.connection-timeout 默認值:2秒 |
feign.client.<code>[default|<feignClientName>].read-timeout</code> 默認值:10秒 |
feign.httpclient.time-to-live 默認值:900秒 |
feign.httpclient.max-connections 默認值:200 |
N/A |
從上表可以看到心铃,F(xiàn)eign提供了兩個連接超時配置准谚,HttpURLConnection使用feign.client.[default|<feignClientName>].connect-timeout
,而HttpClient和OkHttp則使用feign.httpclient.connection-timeout
去扣,這一點要尤其注意柱衔。
2 啟用Hystrix
通過設(shè)置feign.hystrix.enabled=true
可以啟用Feign的斷路器支持(基于Hystrix)。跟Feign一樣愉棱,Hystrix也支持按實例進行配置唆铐,詳細配置屬性參見官方文檔。
由于Hystrix默認的請求超時時間為1秒奔滑,很容易觸發(fā)超時異常艾岂,所以往往需要調(diào)大。調(diào)大超時時間有兩種方式朋其,
- 第一種方式王浴,通過
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
設(shè)置默認超時時間脆炎,影響所有請求。 - 第二種方式氓辣,如果你不想改變所有請求的超時時間秒裕,那么可以通過
hystrix.command.<HystrixCommandKey>.execution.isolation.thread.timeoutInMilliseconds
單獨設(shè)置某個Hystrix Command的超時時間。那么問題來了钞啸,F(xiàn)eign下面几蜻,這個Hystrix Command Key到底是什么呢,是和Feign Client Name一樣嗎体斩?答案是否定的梭稚。Feign下面,一個Hystrix Command對應(yīng)的是Feign Client的一個方法硕勿,因此Hystrix Command Key的定義為<FeignClientName>#<methodName>(<arg1ClassName>,<arg2ClassName>...)
哨毁,注意首字母大寫,詳見SetterFactory.Default#create()
方法源武。
3 小結(jié)
不管是Spring還是Spring Cloud,由于整個生態(tài)過于龐大想幻,因此即便是官方文檔粱栖,也只能勉強覆蓋各個組件的大體框架,一旦深入細節(jié)就只能靠開發(fā)者自己研讀源碼來尋找答案脏毯。就像Linus Torvalds說的闹究,Talk is cheap. Show me the code.