OpenFeign進階

一呼盆、什么是Feign

Feign是聲明式Web服務客戶端,它使編寫Web服務客戶端更加容易盾剩。Feign不做任何請求處理雷激,通過處理注解相關信息生成Request替蔬,并對調用返回的數(shù)據(jù)進行解碼,從而實現(xiàn)簡化HTTP API的開發(fā)屎暇。

二承桥、Feign和Openfeign的區(qū)別

Feign最早是由Netflix公司進行維護的,后來Netflix不再對其進行維護根悼,最終Feign由社區(qū)進行維護凶异,更名為Openfeign并將原項目遷移至新的倉庫。

Feign集成了Ribbon挤巡、RestTemplate實現(xiàn)了負載均衡的執(zhí)行Http調用剩彬,只不過對原有的方式(Ribbon+RestTemplate)進行了封裝,開發(fā)者不必手動使用RestTemplate調服務矿卑,而是定義一個接口喉恋,在這個接口中標注一個注解即可完成服務調用,這樣更加符合面向接口編程的宗旨母廷,簡化了開發(fā)轻黑。

三、常用負載均衡策略

  • 隨機(Random)算法:在實例列表中隨機選擇某個實例琴昆。

  • 輪詢(RoundRobin)算法:按順序選擇實例氓鄙。

  • 最少連接數(shù)(Least Connections)算法:每次取連接數(shù)最少的實例。

  • 一致性哈希(Consistent Hashing)算法:基于一致性哈希算法總是將相同參數(shù)的請求落在同一個實例上业舍。

  • 權重隨機(Weigthd Random):隨機取一個數(shù)抖拦,根據(jù)這個數(shù)屬于哪個范圍選擇對應的實例。

四勤讽、Openfeign如何負載均衡

一般而言蟋座,我們生產者注冊多個服務拗踢,消費者調用時需要使用負載均衡從中選取一個健康并且可用的生產者服務脚牍。因為Openfeign內部集成Ribbon,所以也支持此特性巢墅。Openfeign默認的負載均衡策略是輪詢調用诸狭。

五、Ribbon負載均衡原理

我們以前接觸的nginx的負載均衡是服務端的負載均衡君纫,而Ribbon為客戶端提供負載均衡驯遇,其內部提供了一個負載均衡器ILoadBalance。

LoadBalancerClient在初始化的時候蓄髓,會通過ILoadBalance向Eureka注冊中心獲取服務注冊列表叉庐,并且每10s一次向EurekaClient發(fā)送“ping”,來判斷服務的可用性会喝,如果服務的可用性發(fā)生了改變或者服務數(shù)量和之前的不一致陡叠,則從注冊中心更新或者重新拉取玩郊。LoadBalancerClient有了這些服務注冊列表,就可以根據(jù)具體的IRule來進行負載均衡枉阵,來獲取調用的服務译红。

六、Ribbon負載均衡方式

6.1 隨機策略RandomRule
隨機策略RandomRule

核心代碼:

int index = rand.nextInt(serverCount); // 使用jdk內部的Random類隨機獲取索引值index
server = upList.get(index); // 得到服務器實例
6.2 RoundRobinRule輪詢策略

表示每次都取下一個服務器兴溜,如果失敗會繼續(xù)向下嘗試獲取10次

RoundRobinRule輪詢策略
RoundRobinRule輪詢策略
6.3 WeightedResponseTimeRule加權策略
WeightedResponseTimeRule加權策略

開始的時候還沒有權重列表侦厚,采用父類的輪詢方式,有一個默認每30秒更新一次權重列表的定時任務拙徽,該定時任務會根據(jù)實例的響應時間來更新權重列表刨沦,choose方法做的事情就是,用一個(0,1)的隨機double數(shù)乘以最大的權重得到randomWeight膘怕,然后遍歷權重列表已卷,找出第一個比randomWeight大的實例下標,然后返回該實例淳蔼。

6.4 BestAvailableRule策略用來選取最少并發(fā)量請求的服務器
BestAvailableRule

七侧蘸、Openfeign更改負載均衡策略(默認輪詢)

7.1 方式一:使用已經(jīng)提供的
@Bean
public IRule ribbonRule() {
return new BestAvailableRule();//最小請求數(shù)
}
7.2 方式二:使用自定義的

通過底層源碼我們發(fā)現(xiàn),這些策略都繼承了AbstractLoadBalancerRule抽象類鹉梨,所以我們寫自定義負載均衡策略讳癌,只需要2步

第一步:編寫類繼承AbstractLoadBanlancerRule抽象類,實現(xiàn)choose方法存皂。

第二步:注入類實例

@Bean
public IRule ribbonRule() {
return new 自定義的類();//自定義負載策略類
}

八晌坤、Openfeign網(wǎng)絡通信方式

如果不做特殊配置,OpenFeign默認使用jdk自帶的HttpURLConnection旦袋,我們知道HttpURLConnection沒有連接池骤菠、性能和效率比較低,如果采用默認疤孕,很可能會遇到性能問題導致系統(tǒng)故障商乎。因此我們可以將其改為okhttp或者httpclient。

8.1 Feign中http client
8.1.1 Apache HttpClient

可以采用Apache HttpClient祭阀,properties文件中增加下面配置

feign.httpclient.enabled=true

pom文件中增加依賴

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
    <version>9.3.1</version>
</dependency>
8.1.2 OkHttpClient

也可以采用OkHttpClient鹉戚,properties文件中增加下面配置

feign.okhttp.enabled=true

pom文件中增加依賴

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
    <version>10.2.0</version>
</dependency>
8.2 Ribbon中的Http Client

通過OpenFeign作為注冊中心的客戶端時,默認使用Ribbon做負載均衡专控,Ribbon默認也是用jdk自帶的HttpURLConnection抹凳,需要給Ribbon也設置一個Http client,比如使用okhttp伦腐,在properties文件中增加下面配置赢底。

ribbon.okhttp.enabled=true

九、Openfeign日志級別

OpenFeign的日志級別有

  • NONE: 默認的,不顯示任何日志幸冻。

  • BASIC: 僅記錄請求方法嗅剖、URL、響應狀態(tài)碼以及執(zhí)行時間嘁扼。

  • HEADERS:除了BASIC 中自定義的信息外信粮,還有請求和響應的信息頭。

  • FULL: 除了HEADERS中定義的信息外趁啸, 還有請求和響應的正文以及元數(shù)據(jù)强缘。

自己寫一個配置類

@Configuration
public class OpenFeignLogConfig {
  @Bean
  Logger.Level feignLoggerLeave(){
    return Logger.Level.FULL;
  }
}

配置文件

logging:
  level:
  *[feign日志以什么級別監(jiān)控哪個接口]:
  com.king.springcloud.service.OrderFeignService: debug

十、OpenFeign超時時間

10.1 全局超時時間

OpenFeign可以設置超時時間不傅,簡單粗暴旅掂,設置一個全局的超時時間,如下

feign.client.config.default.connectTimeout=2000
feign.client.config.default.readTimeout=60000

如果不配置超時時間访娶,默認是連接超時10s商虐,讀超時60s,在源碼feign.Request的內部類Options中定義崖疤。

10.2 單服務設置超時時間

需要對serviceC單獨設置一個超時時間秘车,代碼如下

feign.client.config.serviceC.connectTimeout=2000
feign.client.config.serviceC.readTimeout=60000

這個時間會覆蓋全局默認的超時時間。

十一劫哼、Ribbon超時時間

作為負載均衡叮趴,Ribbon超時時間也是可以配置的,可以在properties增加下面配置

ribbon.ConnectTimeout=2000
ribbon.ReadTimeout=11000

有文章講ribbon配置的超時時間必須要滿足接口響應時間权烧,其實不然眯亦,配置feign的超時時間就足夠了,因為它可以覆蓋掉ribbon的超時時間般码。

十二妻率、開啟熔斷

可以在properties增加下面配置

feign.hystrix.enabled=true

十三、開啟重試

13.1 OpenFeign開啟重試

OpenFeign默認是不支持重試的板祝,可以在源代碼FeignClientsConfiguration中feignRetryer中看出

@Bean
@ConditionalOnMissingBeanpublic
Retryer feignRetryer { return Retryer.NEVER_RETRY;}

要開啟重試宫静,我們可以自定義Retryer,比如下面這行代碼

Retryer retryer = new Retryer.Default(100, 1000, 2);

表示每間隔100ms扔字,最大間隔1000ms重試一次囊嘉,最大重試次數(shù)是1,因為第三個參數(shù)包含了第一次請求革为。

13.2 Ribbon重試
13.2.1 拉取服務列表

Ribbon默認從服務端拉取列表的時間間隔是30s,這個對優(yōu)雅發(fā)布很不友好舵鳞,一般我們會把這個時間改短震檩,如下改成3s

myService.ribbon.ServerListRefreshInterval=3

其中myService是你的目的地微服務的名稱

13.2.2 重試

Ribbon重試有不少需要注意的地方,這里分享4個。

1抛虏、同一實例最大重試次數(shù)博其,不包括首次調用,配置如下

serviceC.ribbon.MaxAutoRetries=1

這個次數(shù)不包括首次調用迂猴,配置了1慕淡,重試策略會先嘗試在失敗的實例上重試一次,如果失敗沸毁,請求下一個實例峰髓。

2、同一個服務其他實例的最大重試次數(shù)息尺,這里不包括第一次調用的實例携兵。默認值為1

serviceC.ribbon.MaxAutoRetriesNextServer=1

3、是否對所有操作都重試搂誉,如果改為true徐紧,則對所有操作請求都進行重試,包括post,建議采用默認配置false

serviceC.ribbon.OkToRetryOnAllOperations=false

4炭懊、對指定的http狀態(tài)碼進行重試

serviceC.retryableStatusCodes=404,408,502,500

十四并级、使用OpenFeign做http客戶端

即使不用注冊中心,使用OpenFeign做普通http客戶端也是很方便的侮腹,但是有三點需要注意:

  • 不用配置ribbon相關參數(shù)死遭。
  • 使用RestTemplate調用時,不考慮負載均衡凯旋。
  • 使用過程中OpenFeign要組裝出自己的一套請求呀潭,跟直接使用http客戶端比,會有一定開銷至非。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末钠署,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子荒椭,更是在濱河造成了極大的恐慌谐鼎,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趣惠,死亡現(xiàn)場離奇詭異狸棍,居然都是意外死亡,警方通過查閱死者的電腦和手機味悄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門草戈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侍瑟,你說我怎么就攤上這事唐片”” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵费韭,是天一觀的道長茧球。 經(jīng)常有香客問我,道長星持,這世上最難降的妖魔是什么抢埋? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮督暂,結果婚禮上揪垄,老公的妹妹穿的比我還像新娘。我一直安慰自己损痰,他們只是感情好福侈,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卢未,像睡著了一般肪凛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辽社,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天伟墙,我揣著相機與錄音,去河邊找鬼滴铅。 笑死戳葵,一個胖子當著我的面吹牛,可吹牛的內容都是我干的汉匙。 我是一名探鬼主播拱烁,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼噩翠!你這毒婦竟也來了戏自?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伤锚,失蹤者是張志新(化名)和其女友劉穎擅笔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屯援,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡猛们,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了狞洋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弯淘。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖徘铝,靈堂內的尸體忽然破棺而出耳胎,到底是詐尸還是另有隱情惯吕,我是刑警寧澤惕它,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布怕午,位于F島的核電站,受9級特大地震影響淹魄,放射性物質發(fā)生泄漏郁惜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一甲锡、第九天 我趴在偏房一處隱蔽的房頂上張望兆蕉。 院中可真熱鬧,春花似錦缤沦、人聲如沸虎韵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽包蓝。三九已至,卻和暖如春企量,著一層夾襖步出監(jiān)牢的瞬間测萎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工届巩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硅瞧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓恕汇,卻偏偏與公主長得像腕唧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瘾英,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容