做者 | 李志信 於雨
來源|阿里巴巴雲原生公衆號java
自從 2011 年 Dubbo 開源以後,被大量中小公司採用,一直是國內最受歡迎的 RPC 框架。2014 年,因爲阿里內部組織架構調整,Dubbo 暫停維護了一段時間,以後隨着 Spring Cloud 的面世,兩個體系在融合中一塊兒助推了微服務的火熱。git
不過這世界變化快,自從以 docker 爲表明的的容器技術和以 K8s 爲表明的容器編排技術登上舞臺以後,雲原生時代到來了。在雲原生時代,不可變的基礎設施給原有的中間件帶來了不可變的中間件基礎設施:gRPC 統一了底層通訊層;protobuf 統一了序列化協議;以 envoy + istio 爲表明的 service mesh 逐漸統一了服務的控制面與數據面。程序員
dubbogo 的自然使命是:Bridging the gap between Java and Go。保持 Go 應用與 Java 應用互聯互通的同時,藉助 Go 語言(事實上的第一雲原生語言)的優點擁抱雲原生時代。dubbogo 社區 2020 年勠力打造三支箭:github
用一句話歸納 dubbogo 3.0 便是:新通訊協議、新序列化協議、新應用註冊模型以及新的服務治理能力!本文主要着重討論 dubbogo 3.0 的新通訊協議和應用級服務註冊發現模型。docker
知己知彼,方能進步。dubbogo 3.0 的通訊層改進主要借鑑了 gRPC。編程
gRPC 協議,簡單來講就是 http2 協議的基礎之上,增長了特定的協議 header:「grpc-」 開頭的 header 字段,採用特定的打解包工具(protobuf)對數據進行序列化,從而實現 RPC 調用。網絡
衆所周知,gRPC 幾乎沒有服務治理能力,而阿里雲現有 dubbo 框架兼具 RPC 和服務治理能力,總體實力不遜於 gRPC。但在「你們都用 gRPC」 這樣的背景之下,dubbogo 3.0 的新通訊協議就必須完美兼容 gRPC,對開發者已部署的服務徹底兼容,並在此基礎之上延續已有 dubbo 協議和服務治理能力,進而推出一系列新策略:好比 mesh 支持、應用級服務註冊等。架構
目前已有的 dubbo 2.7 協議已經儘量實現了 gRPC 的支持。開發者能夠經過 protoc-gen-dubbo 工具將 pb IDL 協議轉換爲框架支持的 stub,再借助底層 gRPC conn 的 RPC 過程,將已有的服務治理能力自上而下傳遞給 gRPC,所以實現了 gRPC 服務的支持。app
dubbo-go v1.5.x 也支持 gRPC 的 Stream 調用。和 unary RPC 相似,經過產生框架支持的 stub,在底層 gRPC stream 調用的基礎之上,將流式 RPC 的能力和併入框架。但因爲 dubbo v2.7.x / dubbo-go v1.5.x 自己並不支持流式調用,因此沒有對 gRPC stream 調用的進行上層服務治理支持。負載均衡
開發者所面臨的問題就是:咱們在使用 dubbo-go2.7 進行 grpc 協議傳輸的時候,或多或少不是那麼放心。
而即將推出的 dubbo-go 3.0 協議將從根源解決這個問題。
筆者認爲,一款服務框架對於第三方協議的支持可分爲三個程度:應用層次、協議層次、傳輸層次。
一款框架若是在一個協議的 sdk 之上封裝接口,能夠認爲它處於應用層次支持,這樣的框架須要遵循下層 sdk 的接口,可擴展性較差。
處於協議層次的框架,從配置層到服務治理層均由本框架提供,而在此之下的協議層到網絡傳輸層均使用某個固定的通訊協議,這樣的框架能夠解決服務治理的問題,但框架自己沒法與第三方協議徹底適配,若是不適配就會出現對第三方協議支持的削弱,好比上面說到的 dubbo-go 1.5 對 stream rpc 支持的缺陷。
若是想進一步支持更多的第三方協議,須要從傳輸層下手,真正瞭解第三方協議的具體字段、所依賴的底層協議(好比 HTTP2)的幀模型和數據流,再開發出與第三方協議徹底一致的數據交互模塊,做爲本框架的底層。這樣作的好處是最大程度賦予了協議的可擴展性,能夠在兼容已有協議的基礎之上,可選地增長開發者須要的字段,從而實現已有協議沒法實現的功能,就好比 dubbogo 3.0 將支持的反壓策略。
gRPC 一次基於 HTTP2 的 unary rpc 調用傳輸主要流程以下:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n;
其中包含 gRPC 調用信息的 HTTP2 Header 幀以下圖:
另外,在 gRPC 的 stream 調用中,可在 server 端回傳的過程當中發送屢次 Data,調用結束後再發送 Header 終止 RPC 過程,並彙報狀態信息。
dubbogo 3.0 的通訊層將在 HTTP2 通訊協議之上採用一樣的通訊流程,以保證與 gRPC 的底層通訊溝通能力。
除了通訊協議採用 HTTP2 外,dubbogo 3.0 將採用基於 google protobuf 的 triple 協議【下面稱爲 dubbo3 協議】做爲 dubbogo 3.0 的序列化協議,爲 dubbo 未來支持更多的編程語言打下通訊協議層面的基礎。
目前設計的 dubbogo 3.0 傳輸模型以下:
dubbogo 3.0 使用的新一代服務註冊發現體系,將摒棄舊版的「接口級註冊發現」,使用「應用級別註冊發現」。
簡單地說,接口級別註冊發現,在註冊中心中以 RPC 服務爲 key,以實例列表做爲 value 來組織數據的,而咱們新引入的「應用粒度的服務發現」,它以應用名(Application)做爲 key,以這個應用部署的一組實例(Instance)列表做爲 value。這帶來兩點不一樣:
能夠認爲,基於應用粒度的模型所存儲和推送的數據量是和應用、實例數成正比的,只有當咱們的應用數增多或應用的實例數增加時,地址推送壓力纔會上漲。
而對於基於接口粒度的模型,數據量是和接口數量正相關的,鑑於一個應用一般發佈多個接口的現狀,其數量級通常是比應用粒度的數十倍。另一個關鍵點在於,接口的定義更多的是業務側的內部行爲,接口粒度致使的集羣規模評估的不透明,而實例、應用增加都一般是在運維側的規劃之中,可控性較好。
工商銀行曾經對這兩個模型進行生產測算:應用級服務註冊模型可讓註冊中心上的數據量變成原來的 1.68%,新模型可讓 zookeeper 輕鬆至成 10 萬級別的服務量和 10 萬級別的節點量。
數據中心的數據量變少所形成的結果,是 RPC 服務相關的數據在註冊中心消失了,只有 application - instance 這兩個層級的數據。爲了保證這部分缺乏的 RPC 服務數據仍然能被 Consumer 端正確的感知,咱們在 Consumer 和 Provider 間創建了一條單獨的通訊通道,目前針對元數據同步有兩種具體的可選方案,分別是:
爲了使整個開發流程對老的 dubbo-go 用戶更透明,同時避免指定 provider 對可擴展性帶來的影響),咱們設計了一套 RPC服務到應用名的映射關係,以嘗試在 consumer 自動完成 RPC 服務到 provider 應用名的轉換。
這套設計可讓 dubbogo 3.0 中同時保持對 dubbo v2.6.x、dubbo v2.7.x 和 dubbo v3.0.x 三個大版的互聯互通。
路由在概念上能夠理解爲從已有的全部 IP 地址列表中,根據特定的路由規則,挑選出須要的 ip 地址子集。路由的過程須要根據配置好的路由規則進行篩選,最終取全部路由規則的交集得到結果。多個路由如同流水線同樣,造成一條路由鏈,從全部的地址表中篩選出最終目的地址集合,再經過負載均衡策略選擇訪問的地址。
能夠把路由鏈的邏輯簡單理解爲 target = rn(...r3(r2(r1(src))))。對於每個 router 內部的邏輯,能夠抽象爲輸入地址 addrs-in 與 router 中按全量地址 addrs-all 實現切分好的 n 個互不相交的地址池 addrs-pool-1 ... addrs-pool-n 按實現定義好的規則取交集做爲輸出地址。以此類推,完成整個路由鏈的計算。
在路由規則配置文件中能夠配置 failover 字段。在尋找地址失敗時能夠 failover, 選擇其餘 subset,而且順序執行下來,直到找到地址,不然最後報地址找不到異常。
在的路由規則配置中,能夠配置一個沒有任何條件的 match, 最終的結果是至少會有一個 subset 被選到,以達到地址空保護的做用。
做爲 2020 年 dubbogo 社區打造並將在 2021 年初亮出的的三支箭之一,dubbogo 3.0 將帶來不一樣日常且面目一新的開發體驗,敬請廣大開發者期待!
若是你有任何疑問,歡迎釘釘搜索羣號加入交流羣:釘釘羣號 31363295。
dubbogo 3.0 目前是社區和 dubbo 官方團隊-- 阿里中間件團隊共同合做開發。
阿里雲-中間件團隊招募對 dubbo3 (java & go)、dapr、arthas 有興趣的開發者。能夠釘釘聯繫 northlatitude,或者發送郵件至 beiwei.ly@alibaba-inc.com。
李志信 (GitHubID LaurenceLiZhixin),阿里云云原生中間件團隊開發工程師,dubbogo 社區開發者,中山大學軟件工程專業在校學生,擅長使用 Go 語言,專一於雲原生和微服務等技術方向。
於雨(github @AlexStocks),dubbo-go 項目和社區負責人,一個有十多年服務端作着基礎架構研發一線工做經驗的程序員,陸續參與改進過 Muduo/Pika/Dubbo/Sentinel-go 等知名項目,目前在螞蟻金服可信原生部從事容器編排和 service mesh 工做。