<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring Cloud OpenFeign 的 5 個優(yōu)化小技巧!

          共 3534字,需瀏覽 8分鐘

           ·

          2022-05-25 08:14

          作者 | 磊哥

          來源 | Java中文社群(ID:javacn666)

          轉(zhuǎn)載請聯(lián)系授權(quán)(微信ID:GG_Stone)

          OpenFeign 是 Spring 官方推出的一種聲明式服務(wù)調(diào)用和負(fù)載均衡組件。它的出現(xiàn)就是為了替代已經(jīng)進(jìn)入停更維護(hù)狀態(tài)的 Feign(Netflix Feign),同時它也是 Spring 官方的頂級開源項目。我們在日常的開發(fā)中使用它的頻率也很高,而 OpenFeign 有一些實(shí)用的小技巧,配置之后可以讓 OpenFeign 更好的運(yùn)行,所以本文我們就來盤點(diǎn)一下(也歡迎各位老鐵評論區(qū)留言補(bǔ)充)。

          1.超時優(yōu)化

          OpenFeign 底層內(nèi)置了 Ribbon 框架,并且使用了 Ribbon 的請求連接超時時間和請求處理超時時間作為其超時時間,而 Ribbon 默認(rèn)的請求連接超時時間和請求處理超時時間都是 1s,如下源碼所示:所有當(dāng)我們使用 OpenFeign 調(diào)用了服務(wù)接口超過 1s,就會出現(xiàn)以下錯誤:因為 1s 確實(shí)太短了,因此我們需要手動設(shè)置 OpenFeign 的超時時間以保證它能正確的處理業(yè)務(wù)。OpenFeign 的超時時間有以下兩種更改方法:

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

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

            1.1 設(shè)置Ribbon超時時間

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

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

            1.2 設(shè)置OpenFeign超時時間

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

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

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

            2.請求連接優(yōu)化

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

            2.1 引入Apache HttpClient依賴

            在項目的依賴管理文件 pom.xml 中添加以下配置:


            <dependency>
            ?<groupId>org.springframework.cloudgroupId>
            ?<artifactId>spring-cloud-starter-openfeignartifactId>
            dependency>

            <dependency>
            ?<groupId>io.github.openfeigngroupId>
            ?<artifactId>feign-httpclientartifactId>
            dependency>

            2.2 開啟Apache HttpClient使用

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

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

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

            3.數(shù)據(jù)壓縮

            OpenFeign 默認(rèn)不會開啟數(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?#?最小壓縮值標(biāo)準(zhǔn),當(dāng)數(shù)據(jù)大于?1024?才會進(jìn)行壓縮
            ?response:
            ???enabled:?true?#?開啟響應(yīng)數(shù)據(jù)壓縮功能

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

          4.負(fù)載均衡優(yōu)化

          OpenFeign 底層使用的是 Ribbon 做負(fù)載均衡的,查看源碼我們可以看到它默認(rèn)的負(fù)載均衡策略是輪詢策略,如下圖所示:然而除了輪詢策略之外,我們還有其他 6 種內(nèi)置的負(fù)載均衡策略可以選擇,這些負(fù)載均衡策略如下:

          1. 權(quán)重策略:WeightedResponseTimeRule,根據(jù)每個服務(wù)提供者的響應(yīng)時間分配一個權(quán)重,響應(yīng)時間越長,權(quán)重越小,被選中的可能性也就越低。它的實(shí)現(xiàn)原理是,剛開始使用輪詢策略并開啟一個計時器,每一段時間收集一次所有服務(wù)提供者的平均響應(yīng)時間,然后再給每個服務(wù)提供者附上一個權(quán)重,權(quán)重越高被選中的概率也越大。
          2. 最小連接數(shù)策略:BestAvailableRule,也叫最小并發(fā)數(shù)策略,它是遍歷服務(wù)提供者列表,選取連接數(shù)最小的?個服務(wù)實(shí)例。如果有相同的最小連接數(shù),那么會調(diào)用輪詢策略進(jìn)行選取。
          3. 區(qū)域敏感策略:ZoneAvoidanceRule,根據(jù)服務(wù)所在區(qū)域(zone)的性能和服務(wù)的可用性來選擇服務(wù)實(shí)例,在沒有區(qū)域的環(huán)境下,該策略和輪詢策略類似。
          4. 可用敏感性策略:AvailabilityFilteringRule,先過濾掉非健康的服務(wù)實(shí)例,然后再選擇連接數(shù)較小的服務(wù)實(shí)例。
          5. 隨機(jī)策略:RandomRule,從服務(wù)提供者的列表中隨機(jī)選擇一個服務(wù)實(shí)例。
          6. 重試策略:RetryRule,按照輪詢策略來獲取服務(wù),如果獲取的服務(wù)實(shí)例為 null 或已經(jīng)失效,則在指定的時間之內(nèi)不斷地進(jìn)行重試來獲取服務(wù),如果超過指定時間依然沒獲取到服務(wù)實(shí)例則返回 null。

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

          5.日志級別優(yōu)化

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

          • NONE:默認(rèn)的,不顯示任何日志。
          • BASIC:僅記錄請求方法、URL、響應(yīng)狀態(tài)碼及執(zhí)行時間。
          • HEADERS:除了 BASIC 中定義的信息之外,還有請求和響應(yīng)的頭信息。
          • FULL:除了 HEADERS 中定義的信息之外,還有請求和響應(yīng)的正文及元數(shù)據(jù)。

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

          logging:
          ??level:
          ????cn.myjszl.service:?debug

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

          總結(jié)

          OpenFeign 是 Spring 官方推出的一種聲明式服務(wù)調(diào)用和負(fù)載均衡組件,在生產(chǎn)環(huán)境中我們可以通過以下配置來優(yōu)化 OpenFeign 的運(yùn)行:

          1. 修改 OpenFeign 的超時時間,讓 OpenFeign 能夠正確的處理業(yè)務(wù);
          2. 通過配置專用的通信組件 Apache HttpClient 或 OKHttp,讓 OpenFeign 可以更好地對 HTTP 連接對象進(jìn)行重用和管理,以提高其性能;
          3. 開啟數(shù)據(jù)壓縮功能,可以提高寬帶利用率和加速數(shù)據(jù)傳輸速度;
          4. 使用合適的負(fù)載均衡策略來替換默認(rèn)的輪詢負(fù)載均衡策略,已獲得更好的執(zhí)行效率;
          5. 檢查生成環(huán)境中 OpenFeign 的日志級別,選擇合適的日志輸出級別,防止無效的日志輸出。

          參考 && 鳴謝

          juejin.cn/post/7010555899240513543

          是非審之于己,毀譽(yù)聽之于人,得失安之于數(shù)。

          公眾號:Java中文社群

          Java面試合集:https://gitee.com/mydb/interview


          往期推薦

          SpringCloud OpenFeign + Nacos正確打開方式!


          SpringCloud Ribbon中的7種負(fù)載均衡策略!


          SpringCloud Nacos + Ribbon 調(diào)用服務(wù)的 2 種方法!


          瀏覽 48
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  午夜操操 | 91靠比 | 粉嫩小泬无遮挡BBBB | 日逼福利视频 | 婷婷五月天丁香社区 |