Go 版本入 Dubbo 生态一周年:已和 Spring Cloud、gRPC 互通 顶
去年 5 月,阿里開源的高性能 RPC 框架 Dubbo 從 ASF 畢業并晉升頂級項目,同時,還宣布 Go 語言版本的 Dubbo-go 正式加入 Dubbo 官方生態。
經過一年的發展, Dubbo-go 在技術和社區運營方面都已經有了不錯的成績。Dubbo-go 是 Dubbo 的完整 Go 語言實現,在功能實現和技術路徑上與 Dubbo 有不同程度的對標,項目團隊預計很快便可以追平 Java 版的功能。當然,也是因為基于 Go 語言開發,Dubbo-go 更易上手,未來或將反哺 Dubbo 的云原生化。
Dubbo-go 近期還實現了 REST 協議以及 gRPC 的支持,打通了 Spring Cloud 和 gRPC 生態,再加上與 Java Dubbo 的互通,應用場景廣泛。因此,它被其開發者叫做“all-in-one”的 RPC 框架。
目前 Dubbo 官方已經投入人力參與 Dubbo-go 的開發,阿里集團今年完成 HSF 和 Dubbo 的融合后,會在集團內逐步推廣使用 Dubbo-go。
開源中國采訪了當前正在開發中的 v1.5 版本的主要推進者鄧明,回顧 Dubbo-go 的過往,尤其是最近一年的發展情況,并展望項目未來的發展。
Dubbo-go 過去發展回顧
OSCHINA:作為項目主要推動者之一,可以簡單回顧下 Dubbo-go 的發展歷程嗎?
Dubbo-go 鄧明:
首先,個人代表社區,借助貴方平臺,感謝 Dubbo-go 的使用者、曾經合作過的各個媒體平臺以及 Dubbo 官方過去一年來對我們項目的關注,Dubbo-go 目前的發展離不開各方力量的幫助。
實際上,在 Dubbo-go 加入 Dubbo 官方生態之前,已經發展了兩年。它最早由其創始人于雨在 2016 年 5 月構建,同年 9 月發布并開源的。如下時間軸圖清晰記錄了 Dubbo-go 的前世今生。
OSCHINA:在去年項目剛加入 Dubbo 官方生態的時候,有開發團隊成員說,Dubbo-go 當時還沒能發揮出 Go 語言的優勢,功能完整性還要完善。作為一個為解決 Go 項目與 Java & Dubbo 項目互通的項目,經過一年的發展,項目現在能發揮出 Go 語言的優勢了嗎,為什么?
Dubbo-go 鄧明:
和去年比起來,在發揮 Go 語言自身優勢上,有了很大的提高。
Go 語言協程的個數上限比 Java 線程數目多。Go 語言的協程只運行在用戶態,初始堆棧小且可伸縮,而 Java 線程啟動因用戶態系統態之間切換帶來的額外成本被線程池抹平,所以只有在較大并發需求的場景下(核數限制的情況下,Java 線程池中最大線程數被限制),才會發揮優勢。Dubbo 中類似的場景:異步處理網絡和協議化的處理。我們在網絡庫 Getty 中加入了協程池,實現了網絡收發和邏輯處理的解耦。
另外,Go 語言上手速度確實比 Java 快好幾個數量級,只要搭好具有良好擴展性的架子,社區 contributor 培養的成本比 Java 低很多。得益于此,Dubbo-go 的功能和性能將很快追平 Java。
OSCHINA:關于 Dubbo-go 在 Java 和 Go 運行時的兼容互通和功能一致目標,目前進展如何?
Dubbo-go 鄧明:
目前,Dubbo-go 已經完全對齊 Dubbo v2.6.x,正在全力開發 v1.5.0 版本可以全面對齊 v2.7.x。
Dubbo v2.7.5 之后開始支持應用維度的服務注冊,這也是 v1.5.0 計劃支持的核心特性。
可以劇透一下,目前 v1.5.0 版本的 Dubbo-go 開發工作已經進入了尾聲,正處于測試階段。等 v1.5.0 發布之后,我們會陸續發布幾個小版本,用于對齊 Dubbo v2.7.5 之后的版本。可以說,v1.5.x 主要是為了配合 dubbo 的云原生化。
OSCHINA:Dubbo-go 近期實現了 REST 協議支持,可以和 Spring Cloud 生態互聯;年初實現了和 gRPC 的互聯,這對 Dubbo-go 有什么意義?
Dubbo-go 鄧明:
Dubbo-go 在支持了 REST 協議之后,已經可以做到跟絕大部分基于 HTTP 協議的微服務框架進行通信。
【REST總體設計】
另外一個突出優點是,支持了 gRPC 和 REST 之后,Dubbo-go 就可以考慮和一些公司內部自研的框架進行通信了。通常一些比較大的公司會自研框架,或者深度定制某些開源框架。而只要它們支持 gRPC 或者 HTTP 協議,Dubbo-go 就可以保證與這些框架的無縫銜接。
還有一個優勢,REST 協議對前端更友好,可以直接把 Dubbo-go 開發的服務給前端用,而不用加一層協議轉換,也避免了前端直接發起 RPC 請求。因此,Dubbo-go 也就可以成為它們在 Go 微服務框架的一個比較優秀的選擇。
OSCHINA:1. 4 版本中,Dubbo-go 在可觀測性方面采用了 tracing 和 metric,metric 的實現參考了 Dubbo 的做法,也做了一些調整,具體是怎么樣?
Dubbo-go 鄧明:
可觀測性是衡量一個微服務框架的重要方面。一般可觀測性分成 tracing、metric 和 log 三個部分。
[http://peter.bourgon.org/img/instrumentation/01.png]
在 v1.4 Dubbo-go 之前,tracing 和 metric 是 Dubbo-go 的薄弱環節。為了支持這兩個,我們考察了比較多的開源框架的做法。我們發現,因為要考慮對接非常多諸如 zipkin/cat 等監控框架,所以它們往往會設計一整套監控和度量的 API。
Dubbo 也是如此。Dubbo 的 metric 比較依賴阿里內部一個開源的 metric 的項目。這個項目也不是只能給 Dubbo 應用,而是 Java 項目都可以考慮。本質上來說,它定義了一套 API,而后提供了對不同開源框架的適配實現。把握住這一核心之后,我們就要考慮一個問題:要不要自己設計一套 API?我們的答案是 NO,并且選擇了 opentracing API 作為我們監控使用的 API。
首先,我們回顧那些自己設計了 API 的開源項目,它們的 API 和 opentracing API 還比較相像。我覺得我設計不出來一個明顯比 opentracing API 更加優雅的 API 了。
另外從實現效率上來說,如果我們使用 opentracing API 作為 Dubbo-go 接入 metric 和 tracing 的 API,那么,任何支持 opentracing API 的框架,都可以做到開箱即用。
目前我們正在向社區用戶征集監控意見,看社區希望我們在框架內什么地方進一步埋點。我們也得到了很多反饋,下一步就要考慮進一步優化采集的數據。
OSCHINA:Dubbo-go 的開發團隊之前介紹,Dubbo-go 首要目的就是解決 Go 項目與 Java & Dubbo 項目的互通問題,同時也為 Go 項目提供了一種 RPC 與微服務開發框架的選擇。但從之前的用戶使用列表來看,直接把它作為 Go 的一個 RPC 框架來使用的好像并不是特別多,現在情況是這樣嗎?
Dubbo-go 鄧明:
這個情況已經有了很大的改善了。最開始的時候,我們的用戶大部分都是 Java Dubbo 那里過來的。但是到今年,據我們了解,已經有一些用戶已經是直接把 Dubbo-go 作為 RPC 框架。在經過一年的發展以后,即便不考慮和 Dubbo 保持兼容這一特點,Dubbo-go 也可以說一個比較優秀的 Go 語言 RPC 框架。
尤其是在異構系統通信和服務治理方面,我們提供了非常多樣化的支持。這是很多別的 RPC 框架所不具備,或者不如我們的。
OSCHINA:總結一下這一年里,Dubbo-go 技術方面值得了解的進展吧?
Dubbo-go 鄧明:
Dubbo-go 這一年的進步很大,實現了非常多非常重要的特性。
首先要提及的就是支持了很多協議,比如說基于 protobuf 的 gRPC 和 REST。這些協議保證了我們能夠與市面上大多數的 RPC 框架進行通信,而且我們在 1.5.0 里面,還擴展支持支持基于 Json 的 gPRC 和基于 protobuf 的 TCP 通信。
第二則是支持了配置中心。這個功能可以提供給用戶極大的配置上的靈活性。
第三則是可觀測性上改進,也就是前面提到的 metric 和 tracing。
第四則是現在正在進行的應用注冊模型,它能讓我們更好地擁抱 k8s 和 servise mesh。為了支持應用注冊模型,我們還實現了一個元數據中心,這個元數據中心非常有利于做網關。此外還實現了很多功能,如新的限流算法,負載均衡算法和路由策略等。具體內容,歡迎大家去看我們的 release log。
【Dubbo-go總體架構圖】
Dubbo-go 生態建設
OSCHINA:上個月,Go 官方公布的最新調查報告顯示,Go 語言的主要用途包括編寫 RPC 服務,其次庫和框架方面增量巨大。“競爭對手”變多會影響到 Dubbo-go 原本的計劃實施嗎,Dubbo-go 和其他同類項目比有什么不同?
Dubbo-go 鄧明:
我們對 Go 社區的進步感同身受。實際上,Dubbo-go 這一年很多功能的實現,都離不開合作社區的支持。比如說我們提供的基于 Nacos 的配置中心支持,以及現在正在測試基于 Nacos 的應用維度服務注冊與發現,都十分依賴 Nacos 的 Go 語言 SDK 支持。
而且我們也注意到,別的 Go 語言的微服務框架在這一年也取得了不錯的進步,這是一種很好的鞭策。在 RPC 框架上,一直都是百家齊放百花爭鳴局面,迫使我們朝著“人無我有,人有我精”的方向前進。到目前來說,我們感覺我們的競爭優勢還是比較明顯的:
第一點就是保持了和 Dubbo 的兼容,那么原本的 Dubbo 用戶在考慮 Go 語言框架的時候,我們就會是首選;
第二個競爭優勢則是支持多協議。這幾年一個很明顯的趨勢就是,一個公司的技術棧難以保持單一,因為不同框架、不同語言會有不同優點。所以 Dubbo-go 也會是那些考慮連接異構系統用戶的首選;
第三則是軟實力,也就是我們社區自身的優點。我們社區非常有活力,用戶有什么問題都能夠得到很快的響應;而我們的迭代速度,一直比較快。如果用戶覺得自己能夠很快獲得幫助,那么他們也會傾向選擇我們。
OSCHINA:我們了解到,Dubbo-go/getty 是 Dubbo-go 中比較能體現 Go 語言優勢的部分,目前已經被解耦出來,可以直接用。Dubbo-go 的其他組成部分會考慮同樣解耦嗎?
Dubbo-go 鄧明:
這可以說是一個非常長遠和理想化的計劃了。我們現在正在做的一件事,是把項目里面用的公共方法、和框架無關的代碼抽取出來,做成一個工具類庫,也就是 dubbogo-gost 這個項目。
我們注意到,不管是在 Dubbo-go,還是別的框架,這些代碼都很類似,比如說對不同類型的數據排序。之前我們找過開源的 lib,但是都不盡如人意,所以我們打算把自己的拿出來,做成類似瑞士軍刀一樣小巧高效的工具。
另外還要提到 dubbo-go-hessian2 開源倉庫。我們可以自豪地說,這個庫是 Go 里面對 hessian v2 協議支持最好的開源庫。不僅僅是我們在用,阿里和螞蟻金服也在用。我們也希望吸引更加多用戶來使用,幫我們改進。
OSCHINA:Dubbo-go 今年 3 月 25 日的新版本 1.4.0 中“拿出了使用 k8s 作為注冊中心的解決方案”,選擇性放棄 Service 功能,將元數據直接寫入到 Pod 對象的 Annotations 中。為什么做出這個決策,后續有什么落地計劃?
Dubbo-go 鄧明:
在使用 k8s 作為注冊中心這個點上,討論就花了很長的時間。
其實最初考慮的是直接使用 k8s 服務發現模型,后來發現 k8s service 和 Dubbo-go Interface 之間存在一些難以調和的矛盾。比如說Kubernetes 已經為其承載的服務提供了?套服務發現,服務注冊,以及服務集群管理機制。? Dubbo-go 也擁有?成體系的服務集群管理。
這兩個功能點形成了沖突,在無法調和兩者的情況下,我們放棄了這個計劃,并且提出了現在這個隨 1.4.0 版本發布使用的模型。
【k8s registry設計方案】
后續,我們將主要考慮 k8s 本身提供的 CRD + Operator 的方案,畢竟越來越多的 k8s 周邊的項目都在以 Operator 作為切入點。Dubbo-go 社區后續的方案將會以 CRD 的形式在 k8s 內注冊和發現服務。這樣做的原因有很多,首先是為了減少 Dubbo-go 對 kube-apiserver 的直接依賴。其次是為了標準化注冊模型,當服務模型以 CRD 的形式存在在 k8s 集群中之后,其他圍繞 k8s 的項目可以直接使用這些資源二次開發和拓展。而這種方式更加 CloudNative。
OSCHINA:Dubbo-go 現在在云原生應用上的布局是怎樣的?
Dubbo-go 鄧明:
社區的主要人力正與螞蟻金服的 mosn 社區展開合作。目前有 5 個人力與 mosn 社區一起在 mosn 中實現 Dubbo 的服務發現、服務注冊和基本的 RPC 通信等數據平面的能力,在 istio 層面支持通過 XDS 實現配置下發,以實現 mosn + Dubbo-go 【嵌入 mosn】 + istio 這種 sidecar 形式的云原生方案。已完成的工作已經在多點科技展開測試,近期 mosn 社區同學會在 A2M 大會上公布具體進展。
除了 sidecar 這種 proxy 形式的云原生方案,社區還計劃實現 Dubbo-go【應用 sdk】 + istio 這種 proxyless 方式的云原生方案。Java 應用或者 Go 應用通過 istio 的 xDS 協議完成服務注冊和發現以及路由分發。或者說,我們力求微服務和云原生共存,可以稱之為“雙模微服務”。這種“雙模微服務”允許標準的 Dubbo-go + sidecar 和 Dubbo-go【應用 sdk】 + istio 兩種模式部署的應用共存。這將是 Dubbo-go v1.6 的核心工作。
OSCHINA:Dubbo-go 幾乎是剛一誕生就轉移到 Apache,并且很快發布了 Apache Dubbo Go v1.1.0,這對社區運營的幫助是什么,可以分享下 Dubbo-go 的運營情況和經驗嗎?
Dubbo-go 鄧明:
可以說,Apache 基金會對我們的幫助是很大的。
一方面,Apache 自身的光環十分有助于吸引開發關注和參與;另外一方面,Apache 的一些要求,也讓社區運營更加規范。
社區運營需要進一步規范化,透明化,以吸引更加多的人參與。我注意到很多優秀的社區運營做得很好,他們對 issue 的管理很細致,打上了各種標簽,做到了對 issue 的輕重緩急的管理。這種標簽能夠很容易吸引一些打算嘗試開源的新人,給社區帶來新的血液。
我們嘗試使用 milestone 的方式來管理 Dubbo-go 的整體進度。現在也在嘗試定期召開社區會議,討論社區發展方向,重大特性的設計,以及解決爭端會議會面向整個社區,想參與的人都可以參與。
【4.26 社區會議開了攝像頭的幾位成員】
Dubbo-go 應用及規劃
OSCHINA:Dubbo-go 適合什么樣的企業和場景?
Dubbo-go 鄧明:
我們認為,如果用戶需要一款 Go 語言方面 gRPC 框架,可以考慮 Dubbo-go;如果公司有和異構系統通信的需求,Dubbo-go 也是一個比較好的選擇。特別是,公司內部還有 Java Dubbo 或者 Spring Clound 之類的應用,那么 Dubbo-go 優勢就更加大了。
Dubbo-go 可以說是" all-in-one " 性質的 RPC 框架,自身包含服務治理等功能,非常省時省力,而且能夠降低使用微服務的門檻。
OSCHINA:GitHub 的用戶列表中已經有來自 14 家企業的使用記錄,Dubbo-go 一般會提供哪些后續支持?
Dubbo-go 鄧明:
我們一直都快速響應用戶的問題,而且積極鼓勵用戶參與到 Dubbo-go 的開發中來。目前涂鴉智能、攜程等幾家用戶已經成為了社區貢獻的主要力量。
有時候用戶來做調研,進來社區咨詢問題的時候,我們都會笑稱他“如果選擇了 Dubbo-go,就選擇了一個強大的售后團隊”。
社區一位很活躍的 Contributor 潘總【github id: pantianying】對我們的熱情服務應該深有體會。比如他會提 issue,然后我們也會很快解決像 router、優雅退出功能就是在潘總提出之后,我們很快實現的, 還有早期一次重構之后,也是潘總嘗鮮試用。嘗鮮版通常有很多 BUG,所以我們都是上班打工,下班給潘總修 BUG,也算是服務周到熱情用心了。
額外說下,目前 Dubbo 官方也已經投入人力參與 Dubbo-go 的開發,阿里集團今年完成 HSF 和 Dubbo 的融合后,會在集團內逐步推廣使用 Dubbo-go。
【潘總在分享 Dubbo-go 的實踐】
OSCHINA:Dubbo-go 下一版本預計什么時候發布,有沒有一些長遠的發展計劃?
Dubbo-go 鄧明:
當前正在測試的是 v1.5 版本,希望六月份能發出來。v1.6 版本正在設計和規劃中,v1.6 是和 Dubbo 3 對齊的,所以也會是一個比較大的版本。
今年我們社區主要集中在兩件事上。第一件是云和云原生的支持,現在進行中的 v1.5 和 v1.6 都是圍繞這一點的。今年幾乎所有大的 feature 都是這方面的。
第二件事,則是進一步提高 Dubbo-go 的文檔、注釋和代碼質量。坦白來說,Dubbo-go 的文檔并不是特別好,尤其是用戶文檔。我們也收到了很多用戶的批評正在加強 CI 和自動化測試這塊。總而言之,文檔與質量這件事是今年的頭等大事。
OSCHINA:最后,請介紹一下自己吧。
Dubbo-go 鄧明:
說起來挺有意思的,就是我本身是業務開發,并不是傳統意義上的中間件開發或者基礎架構開發。我目前在 eBay 做支付業務的開發。eBay 是一個 WLB 的公司,也就是在 eBay 我才有了足夠的業余時間,開始投入到了開源社區中。
【鄧明在Dubbo社區開發者日做分享】
Dubbo-go 是我第一個深入參與的開源項目,也是我第一次嘗試將個人對分布式系統和微服務治理的理解付諸實踐的項目。它是我的第一個“孩子”。
因為工作的關系,我算是 Dubbo-go 社區投入時間最多的人之一,為 Dubbo-go 開發了一些很有意思的特性,也因此成了 Apache committer。另外我還扮演了編輯的角色,幫社區小伙伴寫的博客文章把把關,潤潤色。我也算是 Dubbo-go 的主要管理人員了,比如說 v1.5 這個版本就是主要由我推進的——這大概還是因為我時間比較多。
【2019.04 社區成員會師阿里討論發展方案,相談甚歡】
【2019.12 上海gopher方銀城在分享Dubbo-go】
【2019.06 上海meetup】
【2019.12.28 Dubbo社區開發者日】
總結
以上是生活随笔為你收集整理的Go 版本入 Dubbo 生态一周年:已和 Spring Cloud、gRPC 互通 顶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCL 科技:拟 42.2 亿元收购武汉
- 下一篇: 行李放行条怎么写啊?