OpenFeign 是 Spring 官方推出的一種宣告式服務呼叫和負載均衡元件。它的出現就是為了替代已經進入停更維護狀態的 Feign(Netflix Feign),同時它也是 Spring 官方的頂級開源專案。我們在日常的開發中使用它的頻率也很高,而 OpenFeign 有一些實用的小技巧,設定之後可以讓 OpenFeign 更好的執行,所以本文我們就來盤點一下(也歡迎各位老鐵評論區留言補充)。
OpenFeign 底層內建了 Ribbon 框架,並且使用了 Ribbon 的請求連線超時時間和請求處理超時時間作為其超時時間,而 Ribbon 預設的請求連線超時時間和請求處理超時時間都是 1s,如下原始碼所示:
所有當我們使用 OpenFeign 呼叫了服務介面超過 1s,就會出現以下錯誤:
因為 1s 確實太短了,因此我們需要手動設定 OpenFeign 的超時時間以保證它能正確的處理業務。
OpenFeign 的超時時間有以下兩種更改方法:
通過修改 Ribbon 的超時時間,被動的修改 OpenFeign 的超時時間。
直接修改 OpenFeign 的超時時間(推薦使用)。
在專案組態檔 application.yml 中新增以下設定:
ribbon:
ReadTimeout: 5000 # 請求連線的超時時間
ConnectionTimeout: 10000 # 請求處理的超時時間
在專案組態檔 application.yml 中新增以下設定:
feign:
client:
config:
default: # 設定的全域性超時時間
connectTimeout: 2000 # 請求連線的超時時間
readTimeout: 5000 # 請求處理的超時時間
推薦使用此方式來設定 OpenFeign 的超時時間,因為這樣的(設定)語意更明確。
OpenFeign 底層通訊元件預設使用 JDK 自帶的 URLConnection 物件進行 HTTP 請求的,因為沒有使用連線池,所以效能不是很好。我們可以將 OpenFeign 的通訊元件,手動替換成像 Apache HttpClient 或 OKHttp 這樣的專用通訊元件,這些的專用通訊元件自帶連線池可以更好地對 HTTP 連線物件進行重用與管理,同時也能大大的提升 HTTP 請求的效率。接下來我以 Apache HttpClient 為例,演示一下專用通訊元件的使用。
在專案的依賴管理檔案 pom.xml 中新增以下設定:
<!-- 新增 openfeign 框架依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 新增 httpclient 框架依賴 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
啟動 Apache HttpClient 元件,在專案組態檔 application.yml 中新增以下設定,:
feign:
client:
httpclient: # 開啟 HttpClient
enabled: true
驗證 Apache HttpClient 設定是否生效,可以在 feign.SynchronousMethodHandler#executeAndDecode 方法上打斷點就可以看到了,如下圖所示:
OpenFeign 預設不會開啟資料壓縮功能,但我們可以手動的開啟它的 Gzip 壓縮功能,這樣可以極大的提高寬頻利用率和加速資料的傳輸速度,在專案組態檔 application.yml 中新增以下設定:
feign:
compression:
request:
enabled: true # 開啟請求資料的壓縮功能
mime-types: text/xml,application/xml, application/json # 壓縮型別
min-request-size: 1024 # 最小壓縮值標準,當資料大於 1024 才會進行壓縮
response:
enabled: true # 開啟響應資料壓縮功能
PS:如果服務消費端的 CPU 資源比較緊張的話,建議不要開啟資料的壓縮功能,因為資料壓縮和解壓都需要消耗 CPU 的資源,這樣反而會給 CPU 增加了額外的負擔,也會導致系統效能降低。
OpenFeign 底層使用的是 Ribbon 做負載均衡的,檢視原始碼我們可以看到它預設的負載均衡策略是輪詢策略,如下圖所示:
然而除了輪詢策略之外,我們還有其他 6 種內建的負載均衡策略可以選擇,這些負載均衡策略如下:
出於效能方面的考慮,我們可以選擇用權重策略或區域敏感策略來替代輪詢策略,因為這樣的執行效率最高。
OpenFeign 提供了紀錄檔增強功能,它的紀錄檔級別有以下幾個:
我們可以通過組態檔來設定紀錄檔級別,設定資訊如下:
logging:
level:
cn.myjszl.service: debug
其中 cn.myjszl.service 為 OpenFeign 介面所在的包名。雖然 OpenFeign 預設是不輸出任何紀錄檔,但在開發階段可能會被修改,因此在生產環境中,我們應仔細檢查並設定合理的紀錄檔級別,以提高 OpenFeign 的執行效率。
OpenFeign 是 Spring 官方推出的一種宣告式服務呼叫和負載均衡元件,在生產環境中我們可以通過以下設定來優化 OpenFeign 的執行:
juejin.cn/post/7010555899240513543
是非審之於己,譭譽聽之於人,得失安之於數。
公眾號:Java中文社群
Java面試合集:https://gitee.com/mydb/interview