欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

分享Spring?Cloud?OpenFeign?的五個(gè)優(yōu)化技巧

 更新時(shí)間:2022年05月25日 08:48:38   作者:??JAVA小也????  
這篇文章主要分享的是Spring?Cloud?OpenFeign?的五個(gè)優(yōu)化技巧,OpenFeign?是?Spring?官方推出的一種聲明式服務(wù)調(diào)用和負(fù)載均衡組件,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下

前言:

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

一、超時(shí)優(yōu)化

OpenFeign 底層內(nèi)置了 Ribbon 框架,并且使用了 Ribbon 的請(qǐng)求連接超時(shí)時(shí)間和請(qǐng)求處理超時(shí)時(shí)間作為其超時(shí)時(shí)間,而 Ribbon 默認(rèn)的請(qǐng)求連接超時(shí)時(shí)間和請(qǐng)求處理超時(shí)時(shí)間都是 1s

如下源碼所示:

所有當(dāng)我們使用 OpenFeign 調(diào)用了服務(wù)接口超過(guò) 1s,就會(huì)出現(xiàn)以下錯(cuò)誤:

因?yàn)?1s 確實(shí)太短了,因此我們需要手動(dòng)設(shè)置 OpenFeign 的超時(shí)時(shí)間以保證它能正確的處理業(yè)務(wù)。

OpenFeign 的超時(shí)時(shí)間有以下兩種更改方法:

  • 通過(guò)修改 Ribbon 的超時(shí)時(shí)間,被動(dòng)的修改 OpenFeign 的超時(shí)時(shí)間。
  • 直接修改 OpenFeign 的超時(shí)時(shí)間(推薦使用)。

1、設(shè)置Ribbon超時(shí)時(shí)間

在項(xiàng)目配置文件 application.yml 中添加以下配置:

ribbon:
ReadTimeout: 5000 # 請(qǐng)求連接的超時(shí)時(shí)間
ConnectionTimeout: 10000 # 請(qǐng)求處理的超時(shí)時(shí)間

2、設(shè)置OpenFeign超時(shí)時(shí)間

在項(xiàng)目配置文件 application.yml 中添加以下配置:

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

推薦使用此方式來(lái)設(shè)置 OpenFeign 的超時(shí)時(shí)間,因?yàn)檫@樣的(配置)語(yǔ)義更明確。

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

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

1、引入Apache HttpClient依賴

在項(xiàng)目的依賴管理文件 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、開(kāi)啟Apache HttpClient使用

啟動(dòng) Apache HttpClient 組件,在項(xiàng)目配置文件 application.yml 中添加以下配置,:

feign:
client:
 httpclient: # 開(kāi)啟 HttpClient
   enabled: true

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

如下圖所示:

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

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

feign:
compression:
 request:
   enabled: true # 開(kāi)啟請(qǐng)求數(shù)據(jù)的壓縮功能
   mime-types: text/xml,application/xml, application/json # 壓縮類(lèi)型
   min-request-size: 1024 # 最小壓縮值標(biāo)準(zhǔn),當(dāng)數(shù)據(jù)大于 1024 才會(huì)進(jìn)行壓縮
 response:
   enabled: true # 開(kāi)啟響應(yīng)數(shù)據(jù)壓縮功能

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

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

OpenFeign 底層使用的是 Ribbon 做負(fù)載均衡的,查看源碼我們可以看到它默認(rèn)的負(fù)載均衡策略是輪詢策略,

如下圖所示:

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

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

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

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

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

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

我們可以通過(guò)配置文件來(lái)設(shè)置日志級(jí)別,配置信息如下:

logging:
  level:
    cn.myjszl.service: debug

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

總結(jié)

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

OpenFeign 的運(yùn)行:

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

到此這篇關(guān)于Spring Cloud OpenFeign 的五個(gè)優(yōu)化技巧的文章就介紹到這了,更多相關(guān)Spring Cloud OpenFeign 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springcloud之Feign、ribbon如何設(shè)置超時(shí)時(shí)間和重試機(jī)制

    springcloud之Feign、ribbon如何設(shè)置超時(shí)時(shí)間和重試機(jī)制

    這篇文章主要介紹了springcloud之Feign、ribbon如何設(shè)置超時(shí)時(shí)間和重試機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 關(guān)于MyBatis Plus中使用or和and問(wèn)題

    關(guān)于MyBatis Plus中使用or和and問(wèn)題

    這篇文章主要介紹了關(guān)于MyBatis Plus中使用or和and問(wèn)題,需要的朋友可以參考下
    2020-12-12
  • java生成隨機(jī)數(shù)的方法

    java生成隨機(jī)數(shù)的方法

    這篇文章主要介紹了java生成隨機(jī)數(shù)的方法,涉及java隨機(jī)數(shù)及字符串操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 詳解SpringBoot基于Dubbo和Seata的分布式事務(wù)解決方案

    詳解SpringBoot基于Dubbo和Seata的分布式事務(wù)解決方案

    這篇文章主要介紹了詳解SpringBoot基于Dubbo和Seata的分布式事務(wù)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java String類(lèi)的性質(zhì)與比較

    Java String類(lèi)的性質(zhì)與比較

    字符串廣泛應(yīng)用 在 Java 編程中,在 Java 中字符串屬于對(duì)象,Java 提供了 String 類(lèi)來(lái)創(chuàng)建和操作字符串,本文將為你帶來(lái)詳細(xì)介紹,感興趣的朋友繼續(xù)往下看吧
    2021-10-10
  • Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)的實(shí)例代碼

    Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)的實(shí)例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java實(shí)現(xiàn)英文猜詞游戲的示例代碼

    Java實(shí)現(xiàn)英文猜詞游戲的示例代碼

    這篇文章主要介紹了如何用Java編寫(xiě)一個(gè)英文猜詞游戲,可以用來(lái)背英語(yǔ)單詞。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-02-02
  • Java中時(shí)間API的基本使用教程

    Java中時(shí)間API的基本使用教程

    這篇文章主要介紹了Java中時(shí)間API的基本使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java多線程模擬電影售票過(guò)程

    Java多線程模擬電影售票過(guò)程

    這篇文章主要為大家詳細(xì)介紹了Java多線程模擬電影售票過(guò)程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • java map轉(zhuǎn)Multipart/form-data類(lèi)型body實(shí)例

    java map轉(zhuǎn)Multipart/form-data類(lèi)型body實(shí)例

    這篇文章主要介紹了java map轉(zhuǎn)Multipart/form-data類(lèi)型body實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05

最新評(píng)論