作者:Wei Xin,Higress Committer,南京航空航天大學分布式系統實驗室。
導讀:本文將和大家一起回顧Spring Cloud Gateway是如何滿足HTTP請求響應轉換需求場景的,並介紹在這個場景下使用Higress雲原生閘道器的方案,同時對比一下兩者的效能差異。
在 Spring Cloud Gateway 中(以下簡稱 SCG),當我們需要對 HTTP 請求或響應進行更改時,SCG 提供了許多內建的 GatewayFilters滿足我們對這個應用場景的需求,比如 AddRequestHeader、AddRequestParameter、DedupeResponseHeader、MapRequestHeader、ModifyRequestBody 等。
請考慮以下簡單用例:
新增請求標頭 x-first,該值取自請求路徑,例如來自 response-headers?testkey=測試值"response-headers";將請求頭中 x-first 的值對映到 x-second;新增請求查詢引數 k1=v1;重複的響應標頭 x-dedupe 將被剔除。 在 SCG 中使用 GatewayFilter,我們可以這樣配置它:
# application.yaml:spring: cloud: gateway: routes: -id: test_route uri: lb://httpbin-svc predicates: -path=//** filters: -addrequestheader=x-first, maprequestheader=x-first, x-second - addrequestparameter=k1, v1 - deduperesponseheader=x-dedupe, retain_first
相信有SCG使用經驗的同學一定對以上配置很熟悉,所以本文將重點介紹另一種能力乙個以卓越的效能滿足這些需求的解決方案——使用 Higress 雲原生閘道器的 Transformer 外掛程式。 在相同的吞吐量級別 (QPS) 下,我們開啟和關閉 Higress Transformer 外掛程式和 SCG 對應的閘道器過濾器,用於計算兩者的 CPU 和記憶體資源成本。
測試,我們得出的結論是:
如果 Higress 未開啟 transformer 外掛程式,SCG 未開啟 GatewayFilters,則 SCG 的 CPU 和記憶體資源開銷約為 330, 4.88次;如果為 Higress 開啟了 Transformer 外掛程式,並為 SCG 開啟了對應的 GatewayFilters,則 SCG 的 CPU 和記憶體資源開銷約為 298, 3.19次。
可以看出,Higress Transformer 與 SCG GatewayFilter 相比具有相當不錯的效能!
接下來,我們將進一步介紹上面提到的 Higress Cloud Native Gateway 和 Higress Transformer 外掛程式。
higress它是基於阿里巴巴內部Envoy Gateway實踐沉澱,以開源Istio+Envoy為核心構建的下一代雲原生閘道器,實現了流量閘道器+微服務閘道器+安全閘道器合二為一的高整合能力,深度融合了Dubbo、Nacos、Sentinel等微服務技術棧,可以幫助使用者在不妥協的情況下大幅降低閘道器的部署和運維成本能力在標準上全面支援 Ingress 和 Gateway API,並積極擁抱雲原生下的標準 API 規範此外,Higress Controller 還支援 nginx ingress 的平滑遷移,幫助使用者零成本快速遷移到 Higress。
Higress 提供了一套 Wasm (WebAssembly) SDK,使開發人員可以輕鬆使用 C++、Golang 和 Rust 開發 WASM 外掛程式以增強閘道器能力。 下面將介紹Higress Transformer外掛程式的基本功能,最後簡要講解Transformer外掛程式的核心邏輯。
Higress Transformer 外掛程式支援對請求響應頭、請求查詢引數和請求響應體引數進行刪除、重新命名、替換、新增、追加、對映和重複資料刪除。
接下來,我們將重現開頭提到的 SCG GatewayFilter 的簡單用例,演示如何使用外掛程式(以下可以使用 Higress 控制台輕鬆部署,當然也可以使用 k8s yaml manifests)。
1.首先,根據官方檔案快速安裝 Higress,結果如下:
$ kubectl -n higress-system get deployname ready up-to-date **ailable agehigress-console 1/1 1 1 1dhigress-console-grafana 1/1 1 1 1dhigress-console-prometheus 1/1 1 1 1dhigress-controller 1/1 1 1 1dhigress-gateway 1/1 1 1 1d
2.通過 higress 控制台新增網域名稱 (foo.)bar.com)、路由配置 (FOO),並將流量傳送到後端的 httpbin服務業:
3.在 foo 路由中新增乙個 transformer 外掛程式(該外掛程式目前沒有推送到官方註冊中心,可以先使用 docker。io/weixinx/transformer:v0.1.0,或者去**倉庫自己搭建):
注意:為了能夠同時完成請求和響應的轉換,我們需要為 foo 路由新增另乙個 transformer 外掛程式,命名為 transformer-resp,用於處理響應方向。
4.新增轉換器配置並啟用外掛程式:
新增請求標頭 x-first,該值取自請求路徑,例如來自 response-headers?testkey=測試值"response-headers";將請求頭中 x-first 的值對映到 x-second;新增請求查詢引數 k1=v1;重複的響應標頭 x-dedupe 將被剔除。
transformer:type: request 指定轉換器型別rules: 指定轉換規則- operate: add 指定轉換操作型別 headers: 指定頭部轉換規則 - key: x-first value: $1 正規表示式捕獲組 $1, 支援 re2 語法 path pattern: ( w+)[querys: 指定查詢引數 轉換規則 - key.] : k1 value: v1- operate: map headers: -key: x-first value: x-second--- transformer-resp:型別:響應規則:- 操作:重複資料刪除標頭:-key:x-重複資料刪除值:首先保留
5.傳送測試請求:
驗證請求方向是否轉換為 $curl -v -h"host: foo.bar.com" "console.higress.io/get"...http/1.1 200 ok..."headers":,新增查詢引數k1=v1"url": ""} 驗證響應方向是否$curl -v -h"host: foo.bar.com" \"console.higress.io/response-headers?x-dedupe=1&x-dedupe=2&x-dedupe=3"...http/1.1 200 OK< x-dedupe:1 保留響應標頭 x-dedupe 的第乙個值。
需要注意的是:
如上例所示,如果需要同時處理請求和響應轉換,則需要在對應的路由中新增兩個 Transformer 外掛程式,乙個用於請求方向,乙個用於響應方向(優化中)。請求正文支援以下內容型別:application json、application x-www-form-urlencoded 和 multipart form-data;響應正文僅支援應用程式 json;有關更多資訊,請參閱外掛程式文件。本節將簡要講解 Higress Transformer 外掛程式的核心邏輯,希望能為有興趣優化外掛程式或做二次開發的同學提供一些幫助。
首先,外掛程式** 位於 Higress 倉庫的 Plugins Wasm-Go Extensions Transformer 目錄下,使用 Higress 提供的 Wasm SDK(有關如何開發 wasm 外掛程式的詳細資訊,請參閱官方文件。
外掛程式transformerconfig的配置模型:
模型以外掛程式配置的形式向使用者公開:type transformerconfig struct、type transformrule struct、type param struct
其中,Transformer 有兩種實現方式(requestTransformer 和 responseTransformer 作為介面),主要實現三種介面方法:TransformHeaders、Transformer Queries 和 TransformBody:
type transformer interface ) error ..var _ transformer = (*requesttransformer)(nil)var _ transformer = (*responsetransformer)(nil)
由於標頭和查詢引數以鍵值的形式存在,因此 kvhandler 對兩者使用統一的處理邏輯由於請求和響應支援不同的內容型別,因此正文分別由 requestbodyHandler(kvhandler、JSONHANDLER 組合)和 responsebodyHandler(JSONHANDLER)處理。 綜上所述,在修改外掛程式的邏輯時,可以修改 kvhandler 和 jsonhandler,其中 jsonhandler 依賴於 gjson和 sjson工具庫。
目前處理程式中的轉換順序是硬編碼的(remove ->rename ->replace ->add ->append ->map ->dedupe),我們計畫對此進行優化,歡迎有興趣的同學參與
本文帶大家了解 Higress Transformer 外掛程式,對比一下與 Spring Cloud Gateway 的效能,並在文章末尾講解外掛程式的核心邏輯,希望能幫助大家從 Spring Cloud Gateway 遷移到 Higress!
如果你覺得 higress 有幫助,請前往 github: higress為我們加星標!期待在 Higress 社群中見到您
相關鏈結:
1] spring cloud gateway
2] scg gatewayfilter factories
#gatewayfilter-factories
3] Higress Transformer 外掛程式。
4] Higress 官方文件。
5] higress wasm sdk
6] Higress 快速入門。
docs/user/quickstart
7] httpbin
8] 開發 Higress Wasm 外掛程式。
docs/user/wasm-go
9] gjson
10] sjson
11] higress ** 儲存庫。
12] transformer demo
13] 效能比較配置。