SpringCloud OpenFeign與Ribbon客戶端配置詳解
一、前言
OpenFeign為微服務(wù)架構(gòu)下服務(wù)之間的調(diào)用提供了解決方案,OpenFeign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP請(qǐng)求訪問遠(yuǎn)程服務(wù),就像調(diào)用本地方法一樣的,開發(fā)者完全感知不到這是在調(diào)用遠(yuǎn)程方法,更感知不到在訪問HTTP請(qǐng)求。但是如果請(qǐng)求連接超時(shí)、處理請(qǐng)求超時(shí)怎么辦,如果我們放任不管聽之任之勢(shì)必造成服務(wù)雪崩,客戶電話打爆投訴,背鍋的又會(huì)是誰呢?所以本篇文章我們來探究一下超時(shí)處理:
二、OpenFeign與Ribbon配置
這里的例子可以在本專欄里面找到,也可以自己手動(dòng)試試。
1、OpenFeign默認(rèn)處理請(qǐng)求超時(shí)時(shí)間
1.1、模擬處理請(qǐng)求0.5秒
@Override public String feign(String str) { try { // 模擬處理請(qǐng)求超時(shí) Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } return "Hello " + str + ":"; }
用postman請(qǐng)求看下feign調(diào)用結(jié)果:
可以看到正常執(zhí)行并返回了結(jié)果。 我們繼續(xù)看下面的一組實(shí)驗(yàn):
1.2、模擬處理請(qǐng)求1秒
@Override public String feign(String str) { try { // 模擬處理請(qǐng)求超時(shí)熔斷 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return "Hello " + str + ":"; }
用postman請(qǐng)求看下feign調(diào)用結(jié)果:
響應(yīng)結(jié)果是“網(wǎng)絡(luò)繁忙,請(qǐng)稍后再試試?。?!” ,可見請(qǐng)求超時(shí)了會(huì)降級(jí)處理。所以O(shè)penFeign默認(rèn)處理請(qǐng)求操作超時(shí)時(shí)間為1秒。這個(gè)時(shí)間確實(shí)是快了點(diǎn)!
2、Ribbon配置
2.1、配置請(qǐng)求處理超時(shí)5秒
ribbon:
eureka:
enabled: false #由于使用Nacos,而不是Eureka
eager-load:
enabled: true #饑餓加載,系統(tǒng)啟動(dòng)時(shí)創(chuàng)建好ribbon客戶端而不是在使用時(shí)去創(chuàng)建
ConnectTimeout: 5000 #單位ms,請(qǐng)求連接超時(shí)時(shí)間 那這里1分鐘
ReadTimeout: 5000 #單位ms,請(qǐng)求處理的超時(shí)時(shí)間
OkToRetryOnAllOperations: false #對(duì)所有操作請(qǐng)求都進(jìn)行重試
MaxAutoRetriesNextServer: 0 #切換實(shí)例的重試次數(shù)
MaxAutoRetries: 0 #對(duì)當(dāng)前實(shí)例的重試次數(shù)
ServerListRefreshInterval: 2000 #從源刷新服務(wù)器列表的間隔
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
用postman請(qǐng)求看下feign調(diào)用結(jié)果:
可見Ribbon中配置的超時(shí)時(shí)間5秒相對(duì)于模擬睡眠時(shí)間1秒較長(zhǎng),睡眠時(shí)間過了處理完請(qǐng)求,返回正常結(jié)果。
2.2、模擬請(qǐng)求處理5秒
@Override public String feign(String str) { try { // 模擬處理請(qǐng)求超時(shí)熔斷 Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return "Hello " + str + ":"; }
用postman請(qǐng)求看下feign調(diào)用結(jié)果:
響應(yīng)結(jié)果是“網(wǎng)絡(luò)繁忙,請(qǐng)稍后再試試?。?!” ,可見請(qǐng)求超時(shí)了會(huì)降級(jí)處理。所以處理請(qǐng)求操作不能時(shí)間不能超過Ribbon配置的處理請(qǐng)求超時(shí)時(shí)間,否則會(huì)被降級(jí)處理(自己定義降級(jí)處理)!
3、OpenFeign配置
3.1、配置請(qǐng)求處理超時(shí)6秒
用postman請(qǐng)求看下feign調(diào)用結(jié)果:feign:
sentinel:
enabled: true
# 設(shè)置 feign 超時(shí)時(shí)間,優(yōu)先級(jí)高于ribbon配置
client:
config:
# default 設(shè)置的全局超時(shí)時(shí)間,指定服務(wù)名稱可以設(shè)置單個(gè)服務(wù)的超時(shí)時(shí)間
default:
connectTimeout: 6000
readTimeout: 6000
可見雖然Ribbon中配置的超時(shí)時(shí)間5秒,但是feign配置的處理請(qǐng)求超時(shí)時(shí)間為6秒,相對(duì)于模擬睡眠時(shí)間5秒大于ribbon配置時(shí)間小于feign配置時(shí)間并且處理完請(qǐng)求,返回正常結(jié)果。那么feign的配置覆蓋了ribbon配置的超時(shí)時(shí)間,feign的配置優(yōu)先級(jí)高于ribbon的。
3.2、OpenFeign配置對(duì)全部服務(wù)有效
feign:
hystrix:
# Feign啟用斷路器,默認(rèn)為FALSE
enabled: true
client:
config:
# 針對(duì)所有的服務(wù)
default:
# Feign的連接建立超時(shí)時(shí)間,默認(rèn)為10秒
connectTimeout: 5000
# Feign的請(qǐng)求處理超時(shí)時(shí)間,默認(rèn)為60秒
readTimeout: 5000
# 日志級(jí)別
loggerLevel: full
# 錯(cuò)誤解碼器
errorDecoder: com.example.SimpleErrorDecoder
# 重試策略
retryer: com.example.SimpleRetryer
# 攔截器配置(和@Bean的方式二選一)
requestInterceptors:
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
# 是否對(duì)404錯(cuò)誤碼解碼
# 處理邏輯詳見feign.SynchronousMethodHandler#executeAndDecode
decode404: false
# 編碼器
encoder: com.example.SimpleEncoder
# 解碼器
decoder: com.example.SimpleDecoder
# 契約
contract: com.example.SimpleContract
注意config下的default。
3.3、針對(duì)某個(gè)服務(wù)
feign:
hystrix:
# Feign啟用斷路器,默認(rèn)為FALSE
enabled: true
client:
config:
# 針對(duì)某個(gè)服務(wù)
ceam-wx:
# Feign的連接建立超時(shí)時(shí)間,默認(rèn)為10秒
connectTimeout: 5000
# Feign的請(qǐng)求處理超時(shí)時(shí)間,默認(rèn)為60秒
readTimeout: 5000
# 日志級(jí)別
loggerLevel: full
# 錯(cuò)誤解碼器
errorDecoder: com.example.SimpleErrorDecoder
# 重試策略
retryer: com.example.SimpleRetryer
# 攔截器配置(和@Bean的方式二選一)
requestInterceptors:
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
# 是否對(duì)404錯(cuò)誤碼解碼
# 處理邏輯詳見feign.SynchronousMethodHandler#executeAndDecode
decode404: false
# 編碼器
encoder: com.example.SimpleEncoder
# 解碼器
decoder: com.example.SimpleDecoder
# 契約
contract: com.example.SimpleContract
注意config下的ceam-wx(服務(wù)名)。
到此這篇關(guān)于SpringCloud OpenFeign與Ribbon客戶端配置詳解的文章就介紹到這了,更多相關(guān)SpringCloud OpenFeign與Ribbon內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot關(guān)于List集合的校驗(yàn)方式
這篇文章主要介紹了SpringBoot關(guān)于List集合的校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(圖文)
這篇文章主要介紹了Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(圖文),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12詳解如何使用ModelMapper庫進(jìn)行對(duì)象之間的屬性映射
這篇文章主要介紹了如何使用ModelMapper庫進(jìn)行對(duì)象之間的屬性映射實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Java 8新時(shí)間日期庫java.time的使用示例
這篇文章主要給你大家介紹了關(guān)于Java 8新時(shí)間日期庫java.time的使用示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07