歡迎您光臨本站 註冊首頁

衝上雲原生,Dubbo 發布 Go 版本

←手機掃碼閱讀     admin @ 2019-06-03 , reply:0

5 月 21 日,經過一年多的孵化,Apache Dubbo 從 Apache 軟體基金會畢業,成為 Apache 頂級項目。

Dubbo 是阿里於 2011 年開源的一款高性能 RPC 框架,在 Java 生態中具有不小的影響力。當初經歷過一段被外界詬病的「停止維護」灰暗時光,後來在 2017 年 Dubbo 浪子回頭,官方宣布重新重點維護。

重新啟航的 Dubbo 將首要目標定位於重新激活社區,贏回開發者的信任,並且逐漸將 Dubbo 打造成一個國際化與現代化的項目,目前距離宣布重啟已經過了一年半的時間。

在這個過程中,Dubbo 發布了多個版本,並逐漸從一個 RPC 框架向微服務生態系統轉變,18 年年初 Dubbo 入駐 Apache 軟體基金會孵化器,開始以 Apache 之道發展社區。

一年之後,Dubbo 在 Apache 孵化器中發布了重啟維護以來的首個裡程碑版本 2.7.0,添加了社區呼聲很高的非同步化支持,以及註冊中心與配置中心分離等特性。

這期間 Dubbo 3.0 的開發工作也被提上了日程,今年 4 月中旬,官方正式公布了 Dubbo 3.0 的進度,此版本新特性包括支持 Filter 鏈的非同步化、響應式編程、雲原生/Service Mesh 方向的探索,以及與阿里內外融合。

然後,Dubbo 畢業了。畢業后的 Dubbo 近期有什麼消息呢?生態還在發展,Dubbo 社區在前幾日公開了 Dubbo Roadmap 2019,計劃在 2020 年 2 月份發布 Dubbo 3.0 正式版,感興趣的同學可以詳細查閱。

而最近官方又宣布 Go 語言加入 Dubbo 生態,發布了 dubbo-go 項目。

在此之前 Dubbo 的跨語言可擴展性已經有一些實現,支持的語言包括 PHP、Node.js 與 Python,同時也基於標準 Java REST API - JAX-RS 2.0 實現了 REST 的調用支持,具體情況如下:

  • PHP:php-for-apache-dubbo,by 樂信,提供客戶端和服務端
  • Node.js:dubbo2.js,by 千米網,提供客戶端
  • Node.js:egg-dubbo-rpc,by 螞蟻金服 egg 團隊,提供客戶端和服務端
  • Python :py-client-for-apache-dubbo,by 千米網,提供客戶端

現在加入了 dubbo-go,Go 開發者也終於可以嘗到 Dubbo 的滋味了。據悉,dubbo-go 項目將於本周完成往 Apache 軟體基金會的遷移,作為 Apache Dubbo 頂級項目的子項目,屆時 dubbo-go 項目的新地址也將變為:https://github.com/apache/dubbo-go

關於項目的研發背景與具體技術細節等相關內容,我們第一時間採訪了項目共同發起人,目前在攜程基礎中台研發部的何鑫銘

 

OSCHINA:dubbo-go 是什麼,定位是什麼,為什麼做這個項目?

dubbo-go 何鑫銘: 

dubbo-go 是 Dubbo 的完整 Go 語言實現。

我們知道 Dubbo 本身基於 Java,很多公司也都以 Java 開發為主,並且使用 Dubbo 作 RPC 或微服務開發框架。

而最近 Go 語言生態發展比較迅速,因其語言優勢,我們已經有部門開始嘗試使用 Go 開發一些新的項目,就會存在亟需解決的問題:

  • 如何實現 Go 項目和 Java & Dubbo 項目的互通?
  • 另外,Go 項目本身也有對 RPC 與微服務開發框架的訴求,如何解決?

基於這兩個問題,我們攜程團隊基於 dubbo-go 的早期項目,重構開發了更易於擴展且功能更加完善的 dubbo-go v1.0.0 版本,並貢獻回了社區,它首要目的就是解決 Go 項目與 Java & Dubbo 項目的互通問題,同時為 Go 項目提供一種 RPC 與微服務開發框架的選擇

dubbo-go 提供客戶端與伺服器端,目前 dubbo-go 社區作為 Dubbo 生態最活躍的社區之一,後面的定位需要配合 Dubbo 官方的要求與社區用戶的需求。

 

OSCHINA:我們知道 Dubbo 在 Java 生態上是有非常高的成就的,而目前 Go 生態本身也有一些知名的微服務框架,那 dubbo-go 之於 Go 生態,是否有與其它框架比拼的能力?

dubbo-go 何鑫銘:

我們最大的能力就是作為 Dubbo 的 Go 語言版本,打通了兩種語言之間的 gap,讓 Dubbo 更加貼近雲原生,為開發者也提供了最大的靈活性,顯著降低企業現有服務上雲的成本,讓企業在雲原生時代多了一種選擇。

 

OSCHINA:Go 的特性有沒有在 dubbo-go 中得到相應的體現?(比如 Go 的高併發是怎麼從基於 Java 的 Dubbo 中改造到 dubbo-go 中的?)

dubbo-go 何鑫銘:

我對於 Go 語言的認知是,首先學習成本比較小,相比於 Java 的學習成本,Go 語言更容易學習和上手。

其次 Go 在語言層面上,比如其 CSP 編程模型在高併發處理上的簡單高效、輕量級協程的優勢,相比較基於 JVM 的 Java 程序來說,基於 runtime 的 Go 程序瞬時啟動能力等特性都吸引著很多開發者,這裡就不詳細闡述了。

最後就是作為雲原生語言的優勢,隨著 Docker、k8s 與 Istio 等優秀項目的出現,雲原生底層基本被 Go 語言統一了,相信企業在雲原生模式下開發的日子已經不遠了。我覺得 Go 語言的生態應該會越來越好,也會有越來越多的人使用它。

將基於 Java 的 Dubbo 引入到 Go 中,像前邊講的,dubbo-go 帶來的優勢就是可以快速融入雲原生的領域。要說 Go 語言特性體現的話,可以參考一下 dubbo-go 非同步網路 I/O 模型的設計,這部分將 Go 語言輕量級協程的優勢體現了出來

這裡也說一下 Go 語言不足的地方:

  • Go 相對 Java 來說還是很年輕的語言,沒有模板庫可用,所以社區在編寫並維護Hessian 2 協議庫上付出了很高的開發成本;
  • 比起 Java 的 try/catch 錯誤處理方式,Go 的 error 處理能力偏弱;
  • 總體生態還是不如 Java,如沒有像 Netty 一樣的強有力網路 I/O 庫。

為什麼提到這一點呢,因為 Dubbo 自身使用了 Netty 和 Hessian 2 協議官方 Java 庫,而 dubbo-go 在開始做的時候這些都是沒有的,這使得 dubbo-go 一路走來非常艱辛,但是社區最終都克服了,並且額外貢獻了開源的 Getty 和 Hessian2 項目。

這裡特別感謝 dubbo-go 社區早期的組織者於雨,項目的早期版本是 2016 年在其領導胡長城和同事劉畏三支持下開發的,他貢獻的 Hessian2 和 Getty 項目,也為最新版本的 dubbo-go 打好了堅實的基礎。

 

OSCHINA:前不久 Dubbo 才宣布之後會在 3.0 中強調 Service Mesh ,這就是語言無關的了,那 dubbo-go 還有必要在這時候加入生態嗎?

dubbo-go 何鑫銘:

Service Mesh 確實是微服務未來發展的的一個大方向,但是現階段在國內大公司還沒有看到非常成功的案例,很多中小公司自身微服務還未拆分完畢甚至於還未開始,目前 dubbo-go 社區優先解決這種類型企業微服務技術落地環節中遇到的問題,專註於補齊相關功能、優化整體性能和解決 bug。至於未來,我相信隨著 Dubbo Mesh 在 Service Mesh 領域的探索,dubbo-go 肯定會跟進並扮演重要角色。

 

OSCHINA:dubbo-go 與 Dubbo 的更新關係是怎麼樣的?是同步更新特性還是有自己的一些創新?

dubbo-go 何鑫銘:

我們現在發布的最新版本是 v1.0.0,我們在每一次 release 新的版本后,都會明確說明可以兼容的 Dubbo 版本。所以,dubbo-go 需要兼容對應 Dubbo 版本號的功能,會同步更新一些 Dubbo 特性。

 

OSCHINA:新發布版本帶來什麼值得關注的特性?

dubbo-go 何鑫銘:

當前發布的 v1.0.0 版本支持的功能如下:

  • 角色:Consumer(√)、Provider(√)
  • 傳輸協議:HTTP(√)、TCP(√)
  • 序列化協議:JsonRPC v2(√)、Hessian v2(√)
  • 註冊中心:ZooKeeper(√)
  • 集群策略:Failover(√)
  • 負載均衡:Random(√)
  • 過濾器:Echo Health Check(√)
  • extension 擴展機制

dubbo-go v1.0.0 版本,主要由我和同在攜程的同事方銀城維護,社區成員周子慶高辛格參與貢獻,該版本沿用了 Dubbo 的代碼分層解耦設計。Dubbo 2.6.x 的主要功能都會逐漸在 dubbo-go 中實現,包括 Dubbo 基於 SPI 的代碼拓展機制,dubbo-go 也有對應的 extension 擴展機制與之對應。

我們在未來將逐漸推出目前可擴展模塊的更多實現,如補齊更多的 Loadbalance 負載均衡、Cluster Strategy 集群策略實現(目前這些任務由社區夥伴主動認領,希望更多的 Go 語言愛好者朋友可以加入社區貢獻);又如雲原生領域非常流行的 k8s,我們也將同步 Dubbo 的 roadmap,跟進 k8s 作為註冊中心的支持,目前由社區成員張海彬負責跟進。

當然廣大開發者們也可以對這些模塊介面進行新的實現,通過 extension 拓展,以完成自己的特殊需求而無需修改源代碼。同時,我們非常歡迎開發者為社區貢獻有用的拓展實現。

此版本解決了一大重點問題:與 Dubbo Java 版本互通的解決方案。我們將這部分提取出了 Hessian2 項目,該項目源自社區於雨的早期貢獻,現在由社區成員望哥負責維護,周子慶高辛格參與貢獻。目前該項目已經完成了對 Java 大部分類型的兼容支持。大家也可以單獨將該項目集成到自己的項目中,它的開源協議是 Apache-2.0。

另外一個比較重要的就是 dubbo-go 現在使用的 TCP 非同步網路 I/O 庫,該庫也是基於於雨早期寫的 Getty 項目,目前由社區的望哥方銀城負責維護,它同樣也是 Apache-2.0 的開源協議。下一版本我們會針對 dubbo-go 和 Getty 的網路 I/O 與線程派發這一部分進行進一步優化

除此之外,我們計劃下一步支持 Dubbo 的另外幾大重要功能,如:

  • routing rule 路由規則(dubbo v2.6.x)
  • dynamic configuration 動態配置中心(dubbo v2.7.x)
  • metrics 指標與監控(dubbo v2.7.x) 
  • trace 鏈路監控(dubbo ecos) 

 

OSCHINA:目前項目的應用情況如何?

dubbo-go 何鑫銘:

dubbo-go 現在已經開始被一些企業嘗試應用於 Go 語言應用融入企業已有 Java & Dubbo 技術棧,以及搭建全新 Go 語言分散式應用等場景。比如中通快遞內部 Go 調用 Java Dubbo 服務;作為攜程 Go 語言應用的服務框架以及 Go、Java 應用互通。

具體的應用情況可以查看:

 

OSCHINA:接下來的演進方向是怎麼樣的?

dubbo-go 何鑫銘:

在 dubbo-go 遷往 Apache 軟體基金會作為 Apache Dubbo 的子項目后,首先最重要的是性能的進一步優化,目前性能上雖然能夠達到應用的生產級別要求,但我們覺得還沒有發揮出 Go 語言的優勢,還有比較大的優化空間。比如前邊提到的 Getty,下一版本會針對 dubbo-go 應用 Getty 的網路 I/O 模型與線程派發做一些優化。

另外包含上面提到的我們近期需要補全一些重要功能,最大限度地在功能完整性上能夠跟 Dubbo 兼容。關於未來 dubbo-go 的發展,也會向 Dubbo 2.7.x 版本這條線上的路線圖演進。

 

OSCHINA:說到性能,當前性能情況具體如何?

dubbo-go 何鑫銘:

我們有做一個 dubbo-go-benchmark 項目,在 CPU 型號為 Intel(R) Xeon(R) CPU E5-2609 0 @2.40GHz,CPU 核心數為 4*8 的硬體水平下,發送 1k 並返回 1k 的數據,100 併發數,100w 總請求數,qps 可以達到 1.2 萬左右。

CPU 性能換成比較高的配置如 Intel Core i9 2.9GHz,qps 可以到達 2 萬左右。

我們後面會對 Hessian2 庫和 Getty 庫進行持續性能優化,以給廣大使用者節約資源。

採訪嘉賓介紹

何鑫銘,攜程基礎中台研發部技術專家,dubbo-go 主要作者。目前專註於 Golang & Java、中台架構、中間件與區塊鏈等技術。


[admin ]

來源:OsChina
連結:https://www.oschina.net/question/3820517_2306822
衝上雲原生,Dubbo 發布 Go 版本已經有286次圍觀

http://coctec.com/news/all/show-post-206365.html