Spring Cloud Gateway 路由性能優(yōu)化

滿足基本要求的業(yè)務網(wǎng)關(guān)

Spring Cloud Gateway 是 Spring Cloud 生態(tài)系統(tǒng)中的一個 API 網(wǎng)關(guān)逾冬,基于 Spring Boot 和 Spring WebFlux 框架構(gòu)建,提供了一個基于路由的毙沾、非阻塞式的 API 網(wǎng)關(guān)解決方案仇哆。

下面是 Spring Cloud Gateway 網(wǎng)關(guān)的優(yōu)劣勢分析:

優(yōu)勢

  1. 非阻塞式異步編程模型:Spring Cloud Gateway 是基于 Spring WebFlux 框架構(gòu)建的迫肖,使用了 Reactive Stream 的異步編程模型柏腻,能夠提供更高的并發(fā)能力和更低的延遲冯挎。
  2. 基于路由的請求處理:Spring Cloud Gateway 的核心功能是基于路由的請求處理,能夠?qū)⒉煌恼埱舐酚傻讲煌暮蠖朔丈厦Ф冢⑻峁┴S富的路由配置選項。
  3. 高度可擴展:Spring Cloud Gateway 提供了豐富的擴展點和插件機制切距,可以自定義路由朽缎、請求轉(zhuǎn)發(fā)、限流等功能谜悟。
  4. 集成 Spring Cloud 生態(tài)系統(tǒng):Spring Cloud Gateway 能夠無縫集成 Spring Cloud 的各種組件话肖,如 Eureka、Ribbon葡幸、Hystrix最筒、Zipkin 等,提供全面的服務治理和監(jiān)控能力蔚叨。

劣勢

  1. 學習成本高:Spring Cloud Gateway 采用了基于函數(shù)式編程的 Reactive Stream 異步編程模型床蜘,需要對相關(guān)概念、框架和 API 有一定的理解和掌握才能使用和定制蔑水。
  2. 性能瓶頸:Spring Cloud Gateway 的性能瓶頸主要集中在 CPU 和內(nèi)存上邢锯,處理高并發(fā)請求時需要保證機器資源充足。
  3. 無法完全替代傳統(tǒng) API 網(wǎng)關(guān):Spring Cloud Gateway 雖然提供了基于路由的請求處理能力搀别,但無法完全替代傳統(tǒng)的 API 網(wǎng)關(guān)丹擎,如 Nginx 和 Kong 等,因為一些傳統(tǒng) API 網(wǎng)關(guān)的功能,如高級的負載均衡蒂培、緩存和安全性等再愈,還未完全支持。

綜上所述护戳,Spring Cloud Gateway 是一款強大的 API 網(wǎng)關(guān)解決方案翎冲,能夠提供高并發(fā)、低延遲灸异、可擴展府适、易集成的優(yōu)勢,但需要承擔一定的學習成本肺樟,并面臨一些性能和功能上的限制檐春。

業(yè)務量達到一定量級后性能不足

上面已經(jīng)提到,Spring Cloud Gateway 無法替代傳統(tǒng)網(wǎng)關(guān),其原因也是因為是JVM。

JVM優(yōu)劣勢

優(yōu)勢

跨平臺性

JVM 提供了一種統(tǒng)一的么伯、跨平臺的執(zhí)行環(huán)境疟暖,使得基于 JVM 的編程語言具有跨平臺性。只要有支持 JVM 的平臺田柔,就可以運行基于 JVM 的應用程序俐巴,不需要針對不同的平臺進行編譯和部署。

垃圾回收

JVM 提供了自動的垃圾回收機制硬爆,可以自動管理內(nèi)存欣舵,避免了程序員手動管理內(nèi)存所帶來的諸多問題,如內(nèi)存泄漏和野指針等缀磕。

高效的即時編譯

JVM 采用即時編譯技術(shù)缘圈,可以將 Java 代碼在運行時動態(tài)編譯成本地機器碼,從而提高了程序的執(zhí)行效率袜蚕。

劣勢

啟動時間較長

基于 JVM 的應用程序啟動時間相比于一些其他的編程語言糟把,如 Go、Node.js 等牲剃,要長一些遣疯,因為需要先啟動 JVM,再加載應用程序和類庫凿傅。

內(nèi)存占用較大

JVM 的內(nèi)存占用較大缠犀,因為 JVM 需要加載和管理大量的類和對象,并且需要維護一些額外的信息狭归,如堆棧和異常信息等夭坪。

并發(fā)性能問題

在高并發(fā)場景下,JVM 存在一些并發(fā)性能問題过椎,如鎖競爭室梅、線程上下文切換等。雖然 Java 語言提供了一些并發(fā)編程技術(shù),如鎖亡鼠、原子操作等赏殃,但使用不當容易引發(fā)性能問題。

由于需要較多的內(nèi)存以及啟動時間較長等問題,被很多程序員所吐槽间涵。換句話說同等級的應用仁热,JVM可能需要更多的資源。但是我相信 Java 會越來越強大,會將這些劣勢慢慢優(yōu)化掉勾哩。

Spring Cloud Gateway 路由原理

之所以上面簡單說了一下JVM的優(yōu)劣勢,是因為JAVA做網(wǎng)關(guān)或者中間件抗蠢,確實需要高的CPU和內(nèi)存資源。下面我簡單減少一下Spring Cloud Gateway路由的原理思劳,相信等我介紹完之后迅矛,大家就會發(fā)現(xiàn)其路由的性能瓶頸在哪了。

讓我們打開編譯器潜叛,找到RoutePredicateHandlerMapping#getHandlerInternal 這個方法的源碼秽褒。我已經(jīng)將源碼摘出來了。

route1.png
route2.png

從上面查找路由的方法中,我們就可以發(fā)現(xiàn)其性能瓶頸在逐條遍歷上威兜,如果當前有幾千個API销斟,可能看不出性能差距,當有上萬條API時椒舵,該方法的性能可能會大幅度降低蚂踊。拋去遍歷的時間復雜度 O(n) ,同時還要去每個路由內(nèi)去做條件過濾,才能找到符合條件的路由返回笔宿,進行下一步操作悴势。這樣即使我們有更高的內(nèi)存以及性能更好的CPU也沒辦法發(fā)揮出其硬件的實力。因為從根本上措伐,Spring Cloud Gateway的路由策略就限制了瓶頸。

Spring Cloud Gateway 路由優(yōu)化思路

我們知道了其性能瓶頸所在,下一步就是如何去優(yōu)化军俊。 由于之前研究了很多的網(wǎng)關(guān)侥加,比如Kong,Zuul,APISIX, 發(fā)現(xiàn)APISIX所使用的的路由算法非常的高效且穩(wěn)定。他所使用的的算法就是我上一篇提到的基數(shù)樹粪躬。如果感興趣可以去復習一下担败。我們也可以模仿APISIX,將Path的路由提取出來以基數(shù)樹的數(shù)據(jù)結(jié)構(gòu)保存,保存其他前置路由過濾方法镰官。大致的流程圖如下:

diagram-flow.jpg

這樣我們不僅可以更搞笑的利用內(nèi)存(基數(shù)樹需要更多的內(nèi)存去存儲節(jié)點) ,并且提高了查詢的時間復雜度提前,由O(n)變?yōu)?O(m),其中m是鍵的長度泳唠。這樣查找的效率不會隨著API的增多更降低。從而提高路由效率。

優(yōu)化路由后性能對比

在這里我使用了Jmeter工具在本地電腦上進行了簡單的3分鐘壓測拓哺。 我本地電腦的配置是

CPU RAM
i3-10100F( 3.6GHz) 4核8線程 64G

直接壓測原應用

test1.png

壓測原生Spring Cloud Gateway

test2.png
jvm1.png

壓測優(yōu)化后的Spring Cloud Gateway

test3.png
jvm2.png

小結(jié)

由此可見,當使用基數(shù)樹做URL Path的路由查找的數(shù)據(jù)結(jié)構(gòu)的時候士鸥,成倍的提高了Spring Cloud Gateway 的吞吐量。并且我們通過Jconsole 觀察其運行狀態(tài)后烤礁,后者更無論是垃圾回收和CPU的使用率都是更優(yōu)讼积。 后續(xù)我會詳細講解優(yōu)化細節(jié)脚仔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市玻侥,隨后出現(xiàn)的幾起案子决摧,更是在濱河造成了極大的恐慌凑兰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姑食,死亡現(xiàn)場離奇詭異,居然都是意外死亡音半,警方通過查閱死者的電腦和手機则拷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門曹鸠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人彻桃,你說我怎么就攤上這事坛善×诰欤” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵肆饶,是天一觀的道長改衩。 經(jīng)常有香客問我,道長驯镊,這世上最難降的妖魔是什么葫督? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任竭鞍,我火速辦了婚禮,結(jié)果婚禮上候衍,老公的妹妹穿的比我還像新娘笼蛛。我一直安慰自己,他們只是感情好蛉鹿,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布滨砍。 她就那樣靜靜地躺著,像睡著了一般妖异。 火紅的嫁衣襯著肌膚如雪惋戏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天他膳,我揣著相機與錄音响逢,去河邊找鬼。 笑死棕孙,一個胖子當著我的面吹牛舔亭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蟀俊,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼钦铺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肢预?” 一聲冷哼從身側(cè)響起矛洞,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烫映,沒想到半個月后沼本,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡锭沟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年抽兆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片族淮。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡郊丛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞧筛,到底是詐尸還是另有隱情,我是刑警寧澤导盅,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布较幌,位于F島的核電站,受9級特大地震影響白翻,放射性物質(zhì)發(fā)生泄漏乍炉。R本人自食惡果不足惜绢片,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望底循。 院中可真熱鬧,春花似錦熙涤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽等舔。三九已至,卻和暖如春慌植,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝶柿。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留只锭,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓蜻展,卻偏偏與公主長得像邀摆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子栋盹,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容