Dubbo-go v1.5.1 發布,Apache Dubbo 的 Go 實現

2020-11-24 開源中國

Dubbo-go 團隊近期發布了 Dubbo-go v1.5.1,Dubbo-go 是 Apache Dubbo 項目的 Go 實現。

根據團隊的介紹,雖然 v1.5.1 是 v1.5 的一個子版本,但相比於 v1.5.0, 社區還是投入了很大人力添加了如下重大改進。

1 應用維度註冊模型

在新模型 release 後,團隊發現 Provider 每個 URL 發布元數據都會註冊 ServiceInstance,影響性能需要優化。

優化方案是: 去除 ServiceDiscoveryRegistry 中註冊 ServiceInstance 的代碼,在 config_loader 中的loadProviderConfig 方法的最後註冊 ServiceInstance 具體步驟: 1、獲取所有註冊的 Registry,過濾出 ServiceDiscoveryRegistry,拿取所有 ServiceDiscovery。 2、創建 ServiceInstance。 3、每個 ServiceDiscovery 註冊 ServiceInstance。

保證 Provider 在註冊成功之後,才暴露元數據信息。

2 支持基於 Seata 的事務

基於 Seata 擴展實現。通過增加過濾器,在服務端接收  xid 並結合 seata-golang 達到支持分布式事務的目的。 從而使 Dubbo-go 在分布式場景下,讓用戶有更多的選擇,能適應更多的個性化場景。

開發團隊在 dubbo-samples 中給出了 事務測試用例 。

3 多註冊中心集群負載均衡

對於多註冊中心訂閱的場景,選址時的多了一層註冊中心集群間的負載均衡:

在 Cluster Invoker 這一級,支持的選址策略有:

3 傳輸鏈路安全性

該版本在傳輸鏈路的安全性上做了嘗試,對於內置的 Dubbo getty Server 提供了基於 TLS 的安全鏈路傳輸機制。

為儘可能保證應用啟動的靈活性,TLS Cert 的指定通過配置文件方式,具體請參見 Dubbo-go 配置讀取規則與 TLS 示例:

4 路由功能增強

本次路由功能重點支持了 動態標籤路由 和 應用/服務級條件路由。

4.1 動態標籤路由

標籤路由通過將某一個或多個服務的提供者劃分到同一個分組,約束流量只在指定分組中流轉,從而實現流量隔離的目的,可以作為藍綠髮布、灰度發布等場景的能力基礎。

標籤主要是指對 Provider 端應用實例的分組,目前有兩種方式可以完成實例分組,分別是動態規則打標靜態規則打標,其中動態規則相較於靜態規則優先級更高,而當兩種規則同時存在且出現衝突時,將以動態規則為準。

4.1.1 動態規則打標

可隨時在服務治理控制臺下發標籤歸組規則

# governance-tagrouter-provider應用增加了兩個標籤分組tag1和tag2# tag1包含一個實例 127.0.0.1:20880# tag2包含一個實例 127.0.0.1:20881--- force: false runtime: true enabled: true key: governance-tagrouter-provider tags: - name: tag1 addresses: ["127.0.0.1:20880"] - name: tag2 addresses: ["127.0.0.1:20881"] ...

4.1.2 靜態規則打標

可以在 server 配置文件的 tag 欄位裡設置

services: "UserProvider": registry: "hangzhouzk" protocol : "dubbo" interface : "com.ikurento.user.UserProvider" loadbalance: "random" warmup: "100" tag: "beijing" cluster: "failover" methods: - name: "GetUser" retries: 1 loadbalance: "random"

consumer  添加 tag 至 attachment 即可

ctx := context.Background()attachment := make(map[string]string)attachment["dubbo.tag"] = "beijing"ctx = context.WithValue(ctx, constant.AttachmentKey, attachment)err := userProvider.GetUser(ctx, []interface{}{"A001"}, user)

請求標籤的作用域為每一次 invocation,使用 attachment 來傳遞請求標籤,注意保存在 attachment 中的值將會在一次完整的遠程調用中持續傳遞,得益於這樣的特性,只需要在起始調用時,通過一行代碼的設置,達到標籤的持續傳遞。

4.1.3 規則詳解

格式

  • Key明確規則體作用到哪個應用。必填
  • enabled=true 當前路由規則是否生效,可不填,預設生效。
  • force=false 當路由結果為空時,是否強制執行,如果不強制執行,路由結果為空的路由規則將自動失效,可不填,預設為 false
  • runtime=false 是否在每次調用時執行路由規則,否則只在提供者地址列表變更時預先執行並緩存結果,調用時直接從緩存中獲取路由結果。如果用了參數路由,必須設為 true,需要注意設置會影響調用的性能,可不填,預設為 false
  • priority=1 路由規則的優先級,用於排序,優先級越大越靠前執行,可不填,預設為 0
  • tags 定義具體的標籤分組內容,可定義任意n(n>=1)個標籤並為每個標籤指定實例列表。必填
  • addresses, 當前標籤包含的實例列表

降級約定

  1. request.tag=tag1 時優先選擇 標記了 tag=tag1 的 provider。若集群中不存在與請求標記對應的服務,默認將降級請求 tag 為空的 provider;如果要改變這種默認行為,即找不到匹配 tag1 的 provider 返回異常,需設置request.tag.force=true
  2. request.tag 未設置時,只會匹配 tag 為空的 provider。即使集群中存在可用的服務,若 tag 不匹配也就無法調用,這與約定 1 不同,攜帶標籤的請求可以降級訪問到無標籤的服務,但不攜帶標籤/攜帶其他種類標籤的請求永遠無法訪問到其他標籤的服務。

4.2 應用/服務級條件路由

可以在路由規則配置中配置多個條件路由及其粒度

Sample:

# dubbo router yaml configure filerouterRules: - scope: application key: BDTService priority: 1 enable: false force: true conditions : ["host = 192.168.199.208 => host = 192.168.199.208 "] - scope: service key: com.ikurento.user.UserProvider priority: 1 force: true conditions : ["host = 192.168.199.208 => host = 192.168.199.208 "]

4.2.1 規則詳解

各欄位含義

  • scope表示路由規則的作用粒度,scope的取值會決定key的取值。必填。
    • service 服務粒度
    • application 應用粒度
  • Key明確規則體作用在哪個服務或應用。必填。
    • scope=service時,key取值為[{group}/]{service}[:{version}]的組合
    • scope=application時,key取值為application名稱
  • enabled=true 當前路由規則是否生效,可不填,預設生效。
  • force=false 當路由結果為空時,是否強制執行,如果不強制執行,路由結果為空的路由規則將自動失效,可不填,預設為 false。
  • runtime=false 是否在每次調用時執行路由規則,否則只在提供者地址列表變更時預先執行並緩存結果,調用時直接從緩存中獲取路由結果。如果用了參數路由,必須設為 true,需要注意設置會影響調用的性能,可不填,預設為 false。
  • priority=1 路由規則的優先級,用於排序,優先級越大越靠前執行,可不填,預設為 0。
  • conditions 定義具體的路由規則內容。必填。

5 回顧與展望

Dubbo-go 處於一個比較穩定成熟的狀態。目前新版本正處於往雲原生方向的嘗試,應用服務維度註冊是首先推出的功能,這是一個和之前模型完全不一樣的新註冊模型。該版本是朝雲原生邁進新一步的關鍵版本。除此之外,包含在該版本也有一些之前提到的優化。

下一個版本 v1.5.2,本次的關注重點以通信模型改進為主,除此之外,與 2.7.x 的兼容性、易用性及質量保證也是本次關注的信息。

服務發現,會支持更加多的方式,如:文件、Consul。 從而使 Dubbo-go 在服務發現場景下,讓用戶有更多的選擇,能適應更多的個性化場景。

另外 易用性及質量保證,主要關注的是 samples 與自動化構建部分。可降低用戶上手 Dubbo-go 的難度,提高代碼質量。

目前下一個版本正在緊鑼密鼓的開發中,具體規劃及任務清單,都已經在 Github 上體現。

更多信息:https://github.com/apache/dubbo-go/releases/tag/v1.5.1

相關焦點

  • 俯瞰Dubbo全局,閱讀源碼前必須掌握這些!!
    進行實現。其中,dubbo-remoting-api是整個dubbo-rpc模塊的核心抽象,其他模塊是對dubbo-remoting-api的實現。其中dubbo-registry-api是整個dubbo-registry的核心抽象,其他模塊是對dubbo-registry-api的具體實現。
  • 團隊成員梁飛專訪:阿里巴巴分布式服務框架Dubbo
    Dubbo運行JDK1.5之上,預設依賴javassist、netty、spring等包,但不是必須依賴,通過配置Dubbo可不依賴任何三方庫運行。在阿里巴巴內部,每天支撐2000多個服務,30多億訪問量,最大單機支撐每天近1億訪問量。可參見:http://code.alibabatech.com/wiki/display/dubbo/User+Guide#UserGuide-PerformanceTestReport和淘寶HSF相比,Dubbo的特點是什麼?
  • 史上最全 40 道 Dubbo 面試題及答案,看完碾壓面試官
    :// redis:// rest:// 5、Dubbo需要 Web 容器嗎? dubbo 通過 telnet 命令來進行服務治理,具體使用看這篇文章《dubbo服務調試管理實用命令》。 telnet localhost 8090 26、Dubbo支持服務降級嗎?
  • smart-doc 1.9.7 發布,Java 零註解文檔生成工具
    smart-doc是一款同時支持java restful api和apache dubbo rpc接口文檔生成的工具
  • Gse v0.30.0 發布, Go 高性能分詞, 增加 hmm 支持
    Go 語言高效分詞, 支持英文、中文、日文等詞典用雙數組 trie(Double-Array Trie)實現, 分詞器算法為基於詞頻的最短路徑加動態規劃。
  • Soul 1.0.5 發布,基於 WebFlux 的 Reactive 網關
    Soul關是一款基於webflux的Reactive網關,* 提供了http,restful,websocket,dubbo
  • 「去學校」是go to school,「回家」為什麼卻是go home?
    」當我們表達「去學校」的時候,我們會說go to school。但是當我們表達「回家」的時候,我們卻會說go home。這是為什麼呢?為什麼不能說go to home?Could you go downstairs, please? Yourfather needs your help.你下樓去一下,你爸爸需要你的幫助。拓展1.
  • Apache SkyWalking(Incubating) 5.0.0-alpha 發布
    5.x版本系列的首次發布,系統迎來了全新的UI和功能特性。現代化的UI,後端複雜的分析能力,展現了從3.x到5.x的跨越,以及技術迭代。新版本從7個維度可視化剖析分布式系統的運行情況1. 大家可以前往如下地址下載我們的發布包:l  Apache官網:http://skywalking.apache.org/downloads/l  GitHub發布頁面:https://github.com/apache/incubator-skywalking
  • 解密 Go 語言之反射 reflect
    /value.go:2817) MOVQ AX, reflect.dummy+16(SB) 0x007a 00122 ($GOROOT/src/reflect/value.go:2348) PCDATA $0, $-1 0x007a 00122 ($GOROOT/src/reflect/value.go:2348) MOVQ CX, reflect.i+64(SP) 0x007f
  • 「go ahead!」的用法
    一起來看看吧~ 1著手;開始做當表示「著手;開始做」的含義時,go ahead後需要加介詞with,go ahead with something。例:The district board will vote today on whether to go ahead with the plan.
  • DRYCC Workflow v1.3.0 版本發布 - OSCHINA - 中文開源技術交流社區
    DRYCC工作流包括通過git push從原始碼構建和部署的功能、簡單的應用程式配置、創建和回滾發布、管理域名和SSL證書、提供無縫邊緣路由、聚合日誌以及與團隊共享應用程式。所有這些都是通過一個簡單的RESTAPI和命令行接口公開的。
  • 網際網路+:Go是去,bananas是香蕉,go bananas是?
    所以,英語go bananas是什麼不重要,你怎麼知道它是什麼意思才重要。怎麼才能知道go bananas什麼意思呢?方法和能力就是:到Yahoo上訓練出使用英英字典的能力。1) 打開英文Yahoo2) Yahoo go bananas我喜歡在眾多的英英字典中首選The Free Dictionary這個電子字典:它用詞相對淺顯,適合初學英英字典的學習者。
  • 【安全風險通告】GoAhead Web Server遠程代碼執行漏洞安全風險通告
    經搜索網絡空間測繪網站發現受此漏洞影響的設備量比較大,具體如下表所示:區域空間測繪1空間測繪2空間測繪3國內6,8561,209,98740,435全球108,1478,188,6051,421,317奇安信 CERT風險評級為:高危風險等級:藍色(一般事件)GoAhead Web Server v5.0.1GoAhead Web Server v4.1.1GoAhead Web Server v3.6.5
  • gtoken v1.1.0 發布,gf 的 token 插件,加入 Redis 緩存支持
    gtoken此版本主要加入了緩存redis支持,便於項目集群部署介紹基於gf框架的token插件,通過服務端驗證方式實現token認證; 支持單機gcache和集群gredis
  • 「come back」 和「go back」 有什麼區別?
    搭配 「come back」 通常被翻譯成 「回來」;而 「go back」 則被譯成 「回去」。在使用中,除了參考它們的漢語釋義之外,還有什麼方法可以幫你牢記它們的意思和用法?back1.Go backWhen you go back, you return there - to the place you were before.搭配 「go back」 的意思是 「回去」,即 「回到說話人曾經所在的地方」。
  • go to peak
    《go to peak》是一款十分有趣的冒險闖關小遊戲,玩家需要在遊戲中不斷控制一個引擎來讓自己躲避各種障礙物,一步步來到陰暗地牢的高出,慢慢尋找出口,在不同的地方還有小人在阻擋你,千萬要小心哦。
  • 初中必備英語常用詞組系列(5)—go的相關短語
    1、go to (the) hospital  去醫院看病 go to the hospital  去醫院上班,去醫院 go to hospital 住院2、go over  過一遍,複習/  go over to  朝……走去  She went over her lines before the
  • GoAhead Web Server遠程代碼執行漏洞分析(附PoC)
    farm.json LICENSE.md make.bat package.json projects src daniel@makemyday:~/goahead$ git checkout tags/v3.6.4 -q daniel@makemyday:~/goahead$ make > /dev/null daniel@makemyday:~/goahead$ cd test daniel
  • 一分鐘學個詞:go-ahead
    學個詞go-ahead兩個詞當中加聯接號,go-ahead就成了名詞,意思是批准或下令。例如:I've already given them the go-ahead, what are they waiting for. 我告訴他們可以進行了,他們還在等什麼呀!要注意,go ahead當中沒有連接詞時用作動詞。
  • 不背英語,從go to school和go home開始理解
    每個英語初學者都問過同樣一個問題, go home為何沒有to,go to school卻有,無論問老師還是上網查,得到的答案千篇一律,因為home是副詞,school是名詞,所以go home不加to,這解釋好像也說得過去......吧。