Fizz Gateway 官方入門教程 —— 快速聚合多接口

#背景介紹

先看一張圖,頁面一共調用了 20 多個後端接口,頁面出現了明顯的卡頓,而且每 6 個請求一組,只有前一組返回後才執行下一組。看到請求是 pending 狀態,很容易以爲是後端接口的問題,有經驗的同學可能一眼看出這是瀏覽器的併發限制導致的,而非後端接口問題。

https://upload-images.jianshu.io/upload_images/5924885-b3f957f32efb70a2.jpeg" img-data="{"format":"jpeg","size":127784,"height":851,"width":1047}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>主流瀏覽器一般對同一個服務器的併發連接個數都是有限制的,</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-e3685fc52b8362d0.jpeg" img-data="{"format":"jpeg","size":51699,"height":698,"width":1502}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>瀏覽器爲什麼要請求併發數限制?</p><p>1. 對操作系統端口資源考慮 PC 總端口數爲 65536,那麼一個 TCP(http 也是 tcp)鏈接就佔用一個端口。操作系統通常會對總端口一半開放對外請求,以防端口數量不被迅速消耗殆盡。</p><p>2. 過多併發導致頻繁切換產生性能問題 一個線程對應處理一個 http 請求,那麼如果併發數量巨大的話會導致線程頻繁切換。而線程的上下文切換有時候並不是輕量級的資源。這導致得不償失,所以請求控制器裏面會產生一個鏈接池,以複用之前的鏈接。所以我們可以看作同域名下鏈接池最大爲 4~8 個,如果鏈接池全部被使用會阻塞後面請求任務,等待有空閒鏈接時執行後續任務。</p><p>3. 避免同一客服端併發大量請求超過服務端的併發閾值 在服務端通常都對同一個客戶端來源設置併發閥值避免惡意攻擊,如果瀏覽器不對同一域名做併發限制可能會導致超過服務端的併發閥值被 BAN 掉。</p><p>4. 客戶端良知機制 爲了防止兩個應用搶佔資源時候導致強勢一方無限制的獲取資源導致弱勢一方永遠阻塞狀態。</p><h2>#服務編排適用場景</h2><p>服務編排主要基於現有的業務微服務使用在線配置的方式快速的生成一個聚合接口。</p><p>舉例說明:</p><p>訂單詳情頁面需要展示訂單信息、商品信息和用戶信息。可通過配置的方式生成一個接口先後調用底層微服務的訂單詳情接口、商品信息接口和用戶信息接口,再從這 3 個接口的返回結果裏提取需要的字段返回給前端頁面。</p><p>Fizz 網關的服務編排的適用場景:</p><h3>#前端場景</h3><p>1、一個頁面調用多個接口時,可以編排好返回聚合結果,提高頁面數據的加載速度</p><p>2、移動設備計算能力有限,可以把數據計算或業務處理邏輯放到服務端完成,加快頁面響應</p><h3>#後端場景</h3><p>1、替換應用層的聚合接口,減少應用層的膠水代碼</p><p>2、快速生成透傳數據類型的接口</p><p>3、數據轉換和映射</p><h2>#快速聚合接口</h2><p>上面問題可通過 Fizz 網關的服務編排的聚合功能解決,簡單說就是把前端頁面要調用的多個接口改爲由 Fizz 網關調用,然後把各接口的結果聚合後返回給前端。這樣前端只需調用一個簡單的聚合接口就可以了。</p><h2>#資料準備</h2><h3>#Fizz 網關安裝</h3><p>可參考: https://www.fizzgate.com/fizz/guide/installation</p><h3>#echo 接口</h3><p>後端接口通過一個延時的 echo 接口模擬,模擬前端頁面調用 10 個接口</p><p>http://127.0.0.1:8080/echo?latency=1000&echo = 接口 1</p><p>http://127.0.0.1:8080/echo?latency=1000&echo = 接口 2</p><p>...</p><p>http://127.0.0.1:8080/echo?latency=1000&echo = 接口 10</p><p>echo 接口源碼:fizz-examples-rest-api</p><h3>#聚合接口</h3><ol><li><p>聚合接口路徑:/fast-aggr/aggregate</p></li><li><p>請求方法:POST</p></li><li><p>入參格式:(格式可根據需要自行調整)</p></li></ol><p>{
"params1": {
"latency": 1000,
"echo": "接口1"
},
"params2": {
"latency": 1000,
"echo": "接口2"
},
// ... 省略
"params10": {
"latency": 1000,
"echo": "接口10"
}
}
</p><ol><li>返回結果:(格式可根據需要自行調整)</li></ol><p>{
"result1": "接口1",
"result2": "接口2",
// ... 省略
"result3": "接口10"
}
</p><h3>#新增接口</h3><p>菜單位置:服務編輯 -> 接口列表,點擊新增</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-f3fe148282f47582.jpeg" img-data="{"format":"jpeg","size":33745,"height":598,"width":1069}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><h3>#配置輸入</h3><p>在配置輸入 tab 可以定義接口的入參和請求頭等信息,如果不配置入參或請求頭,網關會原樣接收調用方傳過來的所有入參或請求頭,但不會對接收到的參數做任何校驗。在本例子中我們使用約定的入參格式,就不定義入參數了,全留空。</p><h3>#配置步驟</h3><p>因爲要併發調用 10 個接口,只需新增 1 個步驟,然後在步驟裏新增 10 個 request, 服務選擇我們預先準備好的 fizz-examples-rest-api 服務。入參我們使用 * 星號來透傳前端傳過來的參數,在這裏使用了引用值的方式來引用入參,相關引用值的使用方式可參考文檔:數據轉換使用文檔 。配置響應部分留空,網關會原樣接收接口的返回結果。 按此方式我們分別配置好 10 個接口。</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-d5d5964d8413dda5.jpeg" img-data="{"format":"jpeg","size":65951,"height":830,"width":1351}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-3bfc749f7b2c28a0.jpeg" img-data="{"format":"jpeg","size":71911,"height":821,"width":1341}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><h3>#配置輸出</h3><p>配置要返回給前端的響應報文,這裏直接引用步驟裏的結果</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-f817fb1714fea72a.jpeg" img-data="{"format":"jpeg","size":79385,"height":858,"width":1347}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><h2>#測試</h2><p>配置完接口後,點擊測試</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-ed53c5f6f17a68e0.jpeg" img-data="{"format":"jpeg","size":61528,"height":842,"width":1191}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><h2>#訪問正式接口</h2><p>接口配置好後需要發佈並配置路由纔可以對公網開放。菜單:編排審覈 --> 我的申請,點擊新增提交發布申請單。審覈通過後即可發佈。</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-44ea8b5750f60550.jpeg" img-data="{"format":"jpeg","size":148284,"height":1708,"width":2524}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>發佈後配置路由,菜單:網關管理 --> 路由管理</p><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/5924885-9affd721d58a2748.jpeg" img-data="{"format":"jpeg","size":184132,"height":1650,"width":2520}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>正式接口訪問 URL: http://[網關 IP]:8600/proxy/fast-aggr/aggregate</p><p>前端頁面由原來調用多個接口改爲調用一個聚合接口即可,大大降低了網絡 IO 帶來的延時,提高頁面訪問速度。</p><h2>#Fizz 網關介紹</h2><p>Fizz Gateway 是一個基於 Java 開發的微服務聚合網關,能夠實現熱服務編排聚合、自動授權選擇、線上服務腳本編碼、在線測試、高性能路由、API 審覈管理、回調管理等目的,擁有強大的自定義插件系統可以自行擴展,並且提供友好的圖形化配置界面,能夠快速幫助企業進行 API 服務治理、減少中間層膠水代碼以及降低編碼投入、提高 API 服務的穩定性和安全性。</p><p>官網:https://www.fizzgate.com</p><p>GitHub: https://github.com/wehotel/fizz-gateway-community</p><p>碼雲:https://gitee.com/fizzgate/fizz-gateway</p><p>入門教程:https://www.fizzgate.com/fizz/guide/GettingStarted/</p>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章