Dubbo 跨语言调用神兽:dubbo-go-pixiu
Pixiu 是什么
?
在回答 Pixiu 是什么之前,我們簡單解釋一下 Dubbo 是什么。Dubbo 是一個開源的高性能 RPC 框架,有著豐富的服務(wù)治理能力以及優(yōu)秀的擴(kuò)展能力。Dubbo 更擴(kuò)展出 Dubbo-go?,為用戶提供了 Golang 的 Dubbo 解決方案,打通了兩種語言之間的隔閡,使 Dubbo 更加貼近云原生。
Dubbo-go 作為 Golang 服務(wù),實現(xiàn)與 Dubbo 服務(wù)之間的相互調(diào)用。然而,在日常使用場景中,用戶往往有把 Dubbo 服務(wù)以 RESTful 風(fēng)格向外暴露的需求同時也要兼顧內(nèi)部 Dubbo 調(diào)用。為了解決這種場景,作為 Dubbo API 網(wǎng)關(guān)的 Pixiu? (中文: 貔貅, 曾用名 dubbo-go-proxy) 便應(yīng)運而生。之所以采用 Pixiu 這個名稱,是因為 Java 同類產(chǎn)品 Zuul 的意象是一個西方怪獸,Pixiu 作為一個國產(chǎn)產(chǎn)品,就用了我們中國的一個類似的神獸貔貅作為項目名稱。也同時表達(dá)了 Dubbo 社區(qū)希望擴(kuò)展出一整套云原生生態(tài)鏈的決心。
?
目前 Dubbo 多語言生態(tài),發(fā)展最好的自然是 Java,其次是 Golang,其他語言都差強(qiáng)人意。dubbo-go-pixiu 項目是一個基于 dubbo-go 發(fā)展起來的項目,目前接口協(xié)議層支持的是七層的 HTTP 請求調(diào)用,計劃在未來的 0.5 版本中支持 gRPC 請求調(diào)用,其另外一個使命是作為一種新的 dubbo 多語言解決方案。
?
為什么使用 Pixiu
?
Pixiu 是基于 Dubbogo 的云原生、高性能、可擴(kuò)展的微服務(wù) API 網(wǎng)關(guān)。作為一款網(wǎng)關(guān)產(chǎn)品,Pixiu 幫助用戶輕松創(chuàng)建、發(fā)布、維護(hù)、監(jiān)控和保護(hù)任意規(guī)模的 API ,接受和處理成千上萬個并發(fā) API 調(diào)用,包括流量管理、 CORS 支持、授權(quán)和訪問控制、限制、監(jiān)控,以及 API 版本管理。除此以外,作為 Dubbo 的衍生產(chǎn)品,Pixiu可以幫助 Dubbo 用戶進(jìn)行協(xié)議轉(zhuǎn)換,實現(xiàn)跨系統(tǒng)、跨協(xié)議的服務(wù)能力互通。
?
Pixiu 的整體設(shè)計遵守以下原則:
?
?
Pixiu 的特性及核心功能
?
- 為 RESTful API 和 Dubbo API 提供支持
?
非 RESTful 風(fēng)格的 API 和 Dubbo 協(xié)議的服務(wù)往往需要修改才可以以 RESTful API 風(fēng)格對外開放。Pixiu 提供協(xié)議轉(zhuǎn)換功能,通過 Pixiu,開發(fā)者可以將自己的 HTTP API 或 Dubbo API 通過配置,以 RESTful API 風(fēng)格對外開放。v0.2.1 版本已支持基于泛化調(diào)用的 HTTP 至 Dubbo 的協(xié)議轉(zhuǎn)換以及 HTTP 協(xié)議的轉(zhuǎn)發(fā)。在后續(xù)的版本,社區(qū)將會增加對 gRPC 和 http2 協(xié)議的支持。
?
- 面向用戶的配置方式
?
一般的網(wǎng)關(guān)的配置往往繁瑣且復(fù)雜。Pixiu,目標(biāo)作為一款易用的網(wǎng)關(guān)產(chǎn)品,在設(shè)計上擁有三層配置層級,Gateway 層全局配置, API resource 層配置以及 HTTP verbs 方法層配置。通過三個不同層級的配置,既可以實現(xiàn)深度的定制,亦支持統(tǒng)一的默認(rèn)配置;同時,支持本地的配置文件,亦可使用統(tǒng)一配置服務(wù)器。另外,還提供控制臺模塊,通過控制臺模塊,支持配置的熱更新。Pixiu 配套配套的控制臺界面也在同步開發(fā)中。
?
- 通用功能的集成
?
重試、熔斷、流量控制、訪問控制等通用功能不再需要在每個后端服務(wù)上重復(fù)實現(xiàn)。使用 Pixiu,通過配置 filter ,開發(fā)者可以進(jìn)行全局的控制,亦可以根據(jù) API 配置各自的規(guī)則。因此開發(fā)者可以專注于業(yè)務(wù)邏輯和服務(wù),而不是將時間用在維護(hù)基礎(chǔ)設(shè)施上。
?
- 可擴(kuò)展
?
不同的使用場景有著各自獨特的需求。為滿足不同用戶的定制化需求,Pixiu 使用了插件模式。開發(fā)者可以通過編寫 go plugin,將自身特有的業(yè)務(wù)邏輯以 filter 形式內(nèi)嵌至 Pixiu 網(wǎng)關(guān)中,實現(xiàn)諸如企業(yè)登錄鑒權(quán)等功能。
圖 1: Pixiu 核心功能列表
?
Pixiu 的架構(gòu)設(shè)計
貔貅: 即 dubbo-go-pixiu,由四個主要模塊:Listener、Router、Filters 和 Clients 組成;
Dubbo Cluster: Dubbo 服務(wù)所在集群,包含一個或多個 Dubbo Services;
Other Cluster: Dubbo 以外的服務(wù)所在集群,現(xiàn)支持 HTTP 服務(wù),未來將拓展支持 gRPC 等其他服務(wù);
Registry Center: 注冊中心,維護(hù)每個業(yè)務(wù)服務(wù)的調(diào)用地址信息;
Metadata Center: 元數(shù)據(jù)中心,維護(hù)每個業(yè)務(wù)服務(wù)的配置信息以及存儲 Pixiu 本身的配置信息。
作為 Dubbo 所衍生的 API 網(wǎng)關(guān),Pixiu 使用 Golang 搭建,主要因為: 1. Golang 的 G-M-P,net poller 等特性使 Golang 非常適合構(gòu)建IO密集型應(yīng)用;2. 使用 Golang 可以直接引入 Dubbo-go 中的一些組建,簡化開發(fā)。
?
整個Pixiu大致可以拆分為四個主要模塊:Listener、Router、Filters 和 Client。
?
1、Listener
?
在 Pixiu 中,Listener 代表外部可以訪問Pixiu的方式。通過配置指定協(xié)議類型,地址,端口等屬性,暴露 Gateway?,F(xiàn)階段暫支持 HTTP 協(xié)議,未來將會加入 gRPC。
?
?
2、Router
?
Router 是 Pixiu 的路由組件。根據(jù)配置文件,Pixiu 將對外暴露的 URLs 以樹的形勢存儲于內(nèi)存中,當(dāng)請求到了 router 組件時,即會根據(jù) URL 及 HTTP 方法查找到對應(yīng)的后端服務(wù)及其 API 配置,并將信息封裝于請求中,為后續(xù) filter,及 client 的調(diào)用提供足夠的內(nèi)容。
?
現(xiàn)階段,Router 提供以下功能:
- 支持請求一對一轉(zhuǎn)發(fā)路由配置或 wildcard 路由配置。
- 支持 HTTP 請求的轉(zhuǎn)發(fā)到后端 HTTP 服務(wù)。
- 支持 HTTP 請求轉(zhuǎn)化為 dubbo 泛化調(diào)用請求。
3、Filters
?
Filter 是 Pixiu 實現(xiàn)額外功能及其擴(kuò)展性的主要組件。其實現(xiàn)類似于 Dubbo-go 中的 filter,根據(jù)配置中 filter 的指定,生成調(diào)用鏈,從而在調(diào)用后端服務(wù)前,將各 filter 中的邏輯運行一遍,實現(xiàn)節(jié)流,日志等功能。
?
用戶如果需要客制化的 filter,可通過編寫 go-plugin 實現(xiàn)。在配置中,可通過類似如下配置,加載 .so文件,并在 API config 中指定使用的 plugin group,plugin name 實現(xiàn)。
?
?
4、Client
?
Client 負(fù)責(zé)調(diào)用具體服務(wù)?,F(xiàn)階段,Pixiu 支持 HTTP 與 Dubbo 的后端服務(wù)。社區(qū)將逐漸增加 gRPC 等其他 Client 以滿足不同的協(xié)議。
?
HTTP client 的實現(xiàn)相對簡單,根據(jù) Router 中獲取的后端服務(wù)信息,通過 Golang 官方包 net/http 生成請求并調(diào)用。
?
Dubbo client 的實現(xiàn)對比 HTTP client 會稍微復(fù)雜,其基礎(chǔ)為 Dubbo 服務(wù)的泛化調(diào)用。泛化調(diào)用技術(shù)是 Dubbo 提供的一個很基礎(chǔ)的功能只需要知道調(diào)用的方法名、參數(shù)類型和返回值類型,即可發(fā)起服務(wù)調(diào)用??蛻舳藢Ψ?wù)端的泛化調(diào)用既可以通過注冊中心發(fā)現(xiàn)服務(wù),也可以直連服務(wù)端,實現(xiàn)對服務(wù)的動態(tài)調(diào)用。
如下面代碼所示,Pixiu 通過動態(tài)配置 referenceConfig,然后通過 GetRPCService 生成 Dubbo 的 Generic Client(泛化調(diào)用客戶端)進(jìn)行下一步的調(diào)用。
?
?
實際上,在泛化調(diào)用的客戶端中,實際執(zhí)行泛化調(diào)用的關(guān)鍵步驟是 Dubbo-go 中的 generic_filter (如下代碼片段)。在調(diào)用 generic_filter 的 Invoke 時,約定 invocation 參數(shù)列表第一個為方法名,第二個為參數(shù)類型列表,第三個為參數(shù)值列表。generic_filter 將用戶請求的參數(shù)值列表轉(zhuǎn)化為統(tǒng)一格式的 map(代碼中的 struct2MapAll ),將類( golang 中為 struct )的正反序列化操作變成 map 的正反序列化操作。這使得無需 POJO 描述通過硬編碼注入 hessain 庫,從而完成 Dubbo 服務(wù)的泛化調(diào)用。
?
?
總結(jié)
?
通過上面的四個模塊以及注冊中心的簡單介紹不難發(fā)現(xiàn),當(dāng)請求通過 listener 被 Pixiu 接收后,請求被傳入 router 中。router 根據(jù)接口的配置,從原請求中找到目標(biāo)后端服務(wù)連同相關(guān)API配置下發(fā)到 filter 組件。filter 組件根據(jù)原請求、 API 配置等信息順序執(zhí)行,最終請求到達(dá) client, 通過 client 調(diào)用后端服務(wù)。
?
Pixiu的未來
?
Pixiu 作為網(wǎng)關(guān)產(chǎn)品外,其衍生項目也會在我們的未來計劃中,主要目的是提供更好的可用性。例如,由于 Golang 語言缺乏原生的注解, 因此 Dubbo-go 需要通過配置文件方式生成服務(wù)的元數(shù)據(jù)寫入注冊中心。開課啦教育公司相關(guān)同學(xué)寫了一個掃描代碼的工具 _https://github.com/jack15083/dubbo-go-proxy-tool_,在每個 RPC 服務(wù)方法前加上對應(yīng)的注釋,從而在服務(wù)啟動前通過掃描注釋生成元數(shù)據(jù)。Pixiu 也計劃在未來的版本上通過提供 package,允許服務(wù)通過注釋借助 _https://github.com/MarcGrol/golangAnnotations _生成 API 配置并注冊到 Pixiu 上。
Pixiu 目前的定位是一個七層協(xié)議網(wǎng)關(guān),其最初版本是被定義成一個 Dubbo 的服務(wù)網(wǎng)關(guān)。作為云時代的產(chǎn)品,Pixiu 的發(fā)展方向必然是面向云原生的?,F(xiàn)在的版本為0.2.1, 已經(jīng)實現(xiàn)基本的 Dubbo/Http 服務(wù)代理和部分的網(wǎng)關(guān)通用功能。目前正在開發(fā)中的 0.4 及其后續(xù)版本支持 gRPC 和 Spring Cloud 服務(wù)調(diào)用, 后續(xù)還將提供 MQ 服務(wù)支持。另外,社區(qū)將繼續(xù)優(yōu)化配置方式,降低用戶的使用難度,繼續(xù)優(yōu)化官方的 filter,使 Pixiu 可以在官方層面實現(xiàn)更多的網(wǎng)關(guān)通用功能。
?
在未來的一年內(nèi),社區(qū)計劃支持 xDS API,將 Pixiu 演化為 Dubbo mesh 的 sidecar。其最終目的就是:在現(xiàn)有的 dubbo mesh 形態(tài)中演化出 Proxy Service Mesh 形態(tài)?;谶@個形態(tài),Js、Python、PHP、Ruby 和 Perl 等腳本語言程序除了收獲 dubbo mesh 原有的技術(shù)紅利之外,大概率還能收獲性能上的提升。
?
Pixiu 在 Dubbo Mesh 中的終極目的是:把東西向和南北向數(shù)據(jù)面流量逐步統(tǒng)一 Pixiu 中的同時,讓它逐步具備 Application Runtime 的能力,作為 Dubbo 多語言生態(tài)的關(guān)鍵解決方案。
?
dubbogo 社區(qū)【釘釘群號23331795】與 dubbogo 同在。
?
馮振宇,Apache Dubbo Committer,目前負(fù)責(zé)管理香港一家消費品公司的IT部門整個團(tuán)隊。2020 年夏天 偶然看到了介紹 dubbogo 的文章后加入了 dubbogo 社區(qū),目前在主導(dǎo) Pixiu 0.4.0 版本的開發(fā)。
_
點擊https://developer.aliyun.com/community/cloudnative,了解更多云原生內(nèi)容!
原文鏈接:https://developer.aliyun.com/article/785345?
版權(quán)聲明:本文內(nèi)容由阿里云實名注冊用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進(jìn)行舉報,一經(jīng)查實,本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。總結(jié)
以上是生活随笔為你收集整理的Dubbo 跨语言调用神兽:dubbo-go-pixiu的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实时数仓入门训练营:实时数仓助力互联网实
- 下一篇: 产品解读 | 敏捷版数据库场景 一站式快