溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?Cloud?OpenFeign優(yōu)化的技巧有哪些

發(fā)布時間:2022-05-25 10:15:36 來源:億速云 閱讀:431 作者:zzz 欄目:開發(fā)技術

這篇文章主要介紹了Spring Cloud OpenFeign優(yōu)化的技巧有哪些的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Spring Cloud OpenFeign優(yōu)化的技巧有哪些文章都會有所收獲,下面我們一起來看看吧。

    前言:

    OpenFeign 是 Spring 官方推出的一種聲明式服務調用和負載均衡組件。它的出現(xiàn)就是為了替代已經(jīng)進入停更維護狀態(tài)的 Feign(Netflix Feign),同時它也是 Spring 官方的頂級開源項目。我們在日常的開發(fā)中使用它的頻率也很高,而 OpenFeign 有一些實用的小技巧,配置之后可以讓 OpenFeign 更好的運行。

    一、超時優(yōu)化

    OpenFeign 底層內置了 Ribbon 框架,并且使用了 Ribbon 的請求連接超時時間和請求處理超時時間作為其超時時間,而 Ribbon 默認的請求連接超時時間和請求處理超時時間都是 1s,

    如下源碼所示:

    Spring?Cloud?OpenFeign優(yōu)化的技巧有哪些

    所有當我們使用 OpenFeign 調用了服務接口超過 1s,就會出現(xiàn)以下錯誤:

    Spring?Cloud?OpenFeign優(yōu)化的技巧有哪些

    因為 1s 確實太短了,因此我們需要手動設置 OpenFeign 的超時時間以保證它能正確的處理業(yè)務。OpenFeign 的超時時間有以下兩種更改方法:

    • 通過修改 Ribbon 的超時時間,被動的修改 OpenFeign 的超時時間。

    • 直接修改 OpenFeign 的超時時間(推薦使用)。

    1、設置Ribbon超時時間

    在項目配置文件 application.yml 中添加以下配置:

    ribbon:
    ReadTimeout: 5000 # 請求連接的超時時間
    ConnectionTimeout: 10000 # 請求處理的超時時間

    2、設置OpenFeign超時時間

    在項目配置文件 application.yml 中添加以下配置:

    feign:
    client:
     config:
       default: # 設置的全局超時時間
         connectTimeout: 2000 # 請求連接的超時時間
         readTimeout: 5000 # 請求處理的超時時間

    推薦使用此方式來設置 OpenFeign 的超時時間,因為這樣的(配置)語義更明確。

    二、請求連接優(yōu)化

    OpenFeign 底層通信組件默認使用 JDK 自帶的 URLConnection 對象進行 HTTP 請求的,因為沒有使用連接池,所以性能不是很好。我們可以將 OpenFeign 的通訊組件,手動替換成像 Apache HttpClient 或 OKHttp 這樣的專用通信組件,這些的專用通信組件自帶連接池可以更好地對 HTTP 連接對象進行重用與管理,同時也能大大的提升 HTTP 請求的效率。接下來我以 Apache HttpClient 為例,演示一下專用通訊組件的使用。

    1、引入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>

    2、開啟Apache HttpClient使用

    啟動 Apache HttpClient 組件,在項目配置文件 application.yml 中添加以下配置,:

    feign:
    client:
     httpclient: # 開啟 HttpClient
       enabled: true

    驗證 Apache HttpClient 配置是否生效,可以在 feign.SynchronousMethodHandler#executeAndDecode 方法上打斷點就可以看到了,如下圖所示:

    Spring?Cloud?OpenFeign優(yōu)化的技巧有哪些

    三、數(shù)據(jù)壓縮

    OpenFeign 默認不會開啟數(shù)據(jù)壓縮功能,但我們可以手動的開啟它的 Gzip 壓縮功能,這樣可以極大的提高寬帶利用率和加速數(shù)據(jù)的傳輸速度,在項目配置文件 application.yml 中添加以下配置:

    feign:
    compression:
     request:
       enabled: true # 開啟請求數(shù)據(jù)的壓縮功能
       mime-types: text/xml,application/xml, application/json # 壓縮類型
       min-request-size: 1024 # 最小壓縮值標準,當數(shù)據(jù)大于 1024 才會進行壓縮
     response:
       enabled: true # 開啟響應數(shù)據(jù)壓縮功能

    PS:如果服務消費端的 CPU 資源比較緊張的話,建議不要開啟數(shù)據(jù)的壓縮功能,因為數(shù)據(jù)壓縮和解壓都需要消耗 CPU 的資源,這樣反而會給 CPU 增加了額外的負擔,也會導致系統(tǒng)性能降低。

    四、負載均衡優(yōu)化

    OpenFeign 底層使用的是 Ribbon 做負載均衡的,查看源碼我們可以看到它默認的負載均衡策略是輪詢策略,如下圖所示:

    Spring?Cloud?OpenFeign優(yōu)化的技巧有哪些

    然而除了輪詢策略之外,我們還有其他 6 種內置的負載均衡策略可以選擇,這些負載均衡策略如下:

    • 權重策略:  WeightedResponseTimeRule,根據(jù)每個服務提供者的響應時間分配一個權重,響應時間越長,權重越小,被選中的可能性也就越低。它的實現(xiàn)原理是,剛開始使用輪詢策略并開啟一個計時器,每一段時間收集一次所有服務提供者的平均響應時間,然后再給每個服務提供者附上一個權重,權重越高被選中的概率也越大。

    • 最小連接數(shù)策略:  BestAvailableRule,也叫最小并發(fā)數(shù)策略,它是遍歷服務提供者列表,選取連接數(shù)最小的?個服務實例。如果有相同的最小連接數(shù),那么會調用輪詢策略進行選取。

    • 區(qū)域敏感策略:  ZoneAvoidanceRule,根據(jù)服務所在區(qū)域(zone)的性能和服務的可用性來選擇服務實例,在沒有區(qū)域的環(huán)境下,該策略和輪詢策略類似。

    • 可用敏感性策略:  AvailabilityFilteringRule,先過濾掉非健康的服務實例,然后再選擇連接數(shù)較小的服務實例。

    • 隨機策略:  RandomRule,從服務提供者的列表中隨機選擇一個服務實例。

    • 重試策略:  RetryRule,按照輪詢策略來獲取服務,如果獲取的服務實例為 null 或已經(jīng)失效,則在指定的時間之內不斷地進行重試來獲取服務,如果超過指定時間依然沒獲取到服務實例則返回 null。

    出于性能方面的考慮,我們可以選擇用權重策略或區(qū)域敏感策略來替代輪詢策略,因為這樣的執(zhí)行效率最高。

    五、日志級別優(yōu)化

    OpenFeign 提供了日志增強功能,它的日志級別有以下幾個:

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

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

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

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

    我們可以通過配置文件來設置日志級別,配置信息如下:

    logging:
      level:
        cn.myjszl.service: debug

    其中 cn.myjszl.service 為 OpenFeign 接口所在的包名。雖然 OpenFeign 默認是不輸出任何日志,但在開發(fā)階段可能會被修改,因此在生產(chǎn)環(huán)境中,我們應仔細檢查并設置合理的日志級別,以提高 OpenFeign 的運行效率。

    關于“Spring Cloud OpenFeign優(yōu)化的技巧有哪些”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Spring Cloud OpenFeign優(yōu)化的技巧有哪些”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

    AI