Dubbo-go v3.0——打造一流開源 Go 服務(wù)框架
簡介:2021 年底 dubbogo 社區(qū)正式推出集成 新通信協(xié)議、新序列化協(xié)議、新應(yīng)用注冊模型、新路由以及新的服務(wù)治理能力的 v3.0 版本
作者介紹:
李志信(github @laurencelizhixin),dubbo-go 3.0 負責人,apache dubbo PMC,來自阿里云中間件團隊,從事 Go 語言中間件的研發(fā)和開源工作。
于雨 (github @AlexStocks),dubbo-go 社區(qū)負責人,Apache Dubbo PMC,螞蟻集團可信原生部【TNT】基礎(chǔ)設(shè)施和中間件研發(fā)一線程序員。工作十一年來陸續(xù)參與和改進過 Redis/Pika/Pika-Port/etcd/Muduo/Dubbo/dubbo-go/Sentinel-golang/Seata-golang 等知名項目。
牛學蔚(github @justxuewei),Apache Dubbo Committer,北郵計算機學院二年級研究生,對中間件、云原生領(lǐng)域有著濃厚的興趣。
董劍輝(github @Mulavar),Apache Dubbo Committer,目前主要關(guān)注的開源方向為 Dubbo、Flink、Calcite。
Go 語言作為最流行的云原生語言,近些年擁有很高的熱度,一度備受國內(nèi)開源生態(tài)的關(guān)注,據(jù)筆者了解,眾多企業(yè)也在近年來從自身傳統(tǒng)技術(shù)棧轉(zhuǎn)型 Go 語言技術(shù)棧。Go 以其開發(fā)敏捷、易用性高、入門較為容易的優(yōu)勢深受廣大開發(fā)者青睞。而在 Go 語言生態(tài)成日益蓬勃發(fā)展之勢下,其生態(tài)的完備性,相比于飽經(jīng)考驗的 Java 生態(tài)依然有著很大的 Gap,對中小型企業(yè)來說,依然需要類似于 Spring 的 Go 框架來支撐日常業(yè)務(wù)開發(fā),渴望具備 Dubbo 生態(tài)的易用性和穩(wěn)定性,在這樣的訴求之下,初衷為 “Bridging The Gap Between Java And Go” 的 Dubbo-go 服務(wù)框架在 2016 年應(yīng)運而生,發(fā)展至今。
我們在今年下半年的云計算基礎(chǔ)架構(gòu)大會上了解到了“基礎(chǔ)架構(gòu)能力下沉”的重大意義,從單體架構(gòu)到云原生架構(gòu)的一步步發(fā)展,都在努力將業(yè)務(wù)代碼與中間件解耦,盡可能提供統(tǒng)一的編程接口,通過AOP的思路將服務(wù)調(diào)用抽象化,將接口標準化,將基礎(chǔ)設(shè)施的實現(xiàn)下沉化。而 Dubbo-go 正是在原有保證網(wǎng)絡(luò)通信的高可用、穩(wěn)定性的前提下,整合了一批常用開源組件,提供一致的編程接口可供擴展和調(diào)用。在此之上,對齊 Dubbo 生態(tài)主流控制面,嘗試與云原生結(jié)合,朝向 Proxyless Service Mesh 方向發(fā)展,是我們整個生態(tài)項目的一致的愿景。
在 3.0 時代,我們的“野心” 不會止步于已有的用戶使用場景和基礎(chǔ)框架能力,我們選擇追求高可用、多語言、跨生態(tài)的優(yōu)點,打造新一代微服務(wù)基礎(chǔ)設(shè)施,實現(xiàn) “Bridging The Gap Between Dubbo And X”,在擴展 Go 生態(tài)的同時,也實現(xiàn)各種基礎(chǔ)設(shè)施的云原生化。
一 Dubbo-go 簡介
Dubbo-go 是常新的,每年都在不斷進化。介紹 Dubbo-go 3.0 工作之前,先回顧其過往 6 年的發(fā)展歷程,以明晰未來的方向。
1 什么是 Dubbo-go
github.com/apache/dubbo-go 是一款高性能 Go 語言微服務(wù) RPC 框架,在 Dubbo 多語言生態(tài)中扮演重要角色,是編寫 go 語言微服務(wù)的最佳選擇之一。
開發(fā)者可以使用 Dubbo-go 框架高效地編寫 RPC 服務(wù),并支持與 Dubbo、gRPC 服務(wù)跨語言互通;您可以使用 Dubbo 生態(tài)強大的服務(wù)治理能力和運維能力,例如服務(wù)注冊發(fā)現(xiàn)、負載均衡、配置中心、可視化等功能;您也可以使用 Dubbo-go 生態(tài)的 pixiu 網(wǎng)關(guān)將服務(wù)暴露給集群外部訪問。
Dubbo-go 項目由于雨于 2016 年創(chuàng)立,2018 年開始組建開源社區(qū),2019 年項目正式進入 Apache 軟件基金會,經(jīng)歷三年多不斷地迭代和優(yōu)化,2021 年底 dubbogo 社區(qū)正式推出集成 新通信協(xié)議、新序列化協(xié)議、新應(yīng)用注冊模型、新路由以及新的服務(wù)治理能力的 v3.0 版本,該版本在前期研發(fā)階段已經(jīng)擁有了眾多生產(chǎn)用戶的關(guān)注和使用。
Dubbo-go 是阿里開源項目中最活躍的開源社區(qū)之一,多年的發(fā)展使社區(qū)積累了眾多熱愛開源的活躍貢獻者、 Apache Committer/PMC 成員。不僅給 Dubbo 以及其他 Dubbo 生態(tài)項目示范了通過社區(qū)的組織運營幫助項目發(fā)展,而且?guī)椭颂嵘苏麄€ Dubbo 大社區(qū)的活躍度:
- 包括 Apache/Dubbo 與 Apache/Dubbo-go 在內(nèi)的 Dubbo 生態(tài)被評為 2021 年中國 20 大最活躍社區(qū)之一,位居阿里所有開源項目第二【第一是螞蟻集團的 AntD】
- Dubbo-go 已經(jīng)成功申報中國科學技術(shù)協(xié)會主辦的「 2021“科創(chuàng)中國”開源創(chuàng)新榜評選 」
- Dubbo-go 開源社區(qū)被 OSCHINA 評為“2021 年度 OSCHINA 優(yōu)秀開源技術(shù)團隊”
2 功能介紹
Dubbo-go 目前已經(jīng)達成了其初始使命 “Bridging The Gap Between Java And Go” ,具備了強大的互聯(lián)互通能力,并在云原生方向取得了長足的進展。
- 互聯(lián)互通能力
Dubbo-go 生態(tài)覆蓋多種網(wǎng)絡(luò)協(xié)議:Triple、Dubbo、JSONRPC、grpc、HTTP、HTTP2等。其中 Triple 協(xié)議是 Dubbo3 生態(tài)主推的協(xié)議,是基于 gRPC 的擴展協(xié)議,底層為HTTP2,可與 gRPC 服務(wù)互通。相當于在 gRPC 可靠的傳輸基礎(chǔ)上,增加了 Dubbo 的服務(wù)治理能力。
Dubbo-go 生態(tài)整體已經(jīng)與 Dubbo、gRPC、Spring Cloud 等生態(tài)互聯(lián)互通,把東西向和南北向數(shù)據(jù)面流量統(tǒng)一于一體:既可以通過 Dubbo-go 進行東西方向服務(wù)調(diào)用,也可以在 Dubbo-go-pixiu 中進行南北向流量治理。
- Devops 能力
在服務(wù)注冊發(fā)現(xiàn)方面,支持 Nacos 、Zookeeper、ETCD、Consul、Polaris-mesh(騰訊開源) 等服務(wù)注冊中間件,并擁有可擴展能力。我們也會根據(jù)用戶使用情況,進一步擴展出用戶需要的實現(xiàn)。
在配置中心方面,開發(fā)者可以使用Nacos、Apollo(攜程開源)、Zookeeper 進行框架/用戶的配置的發(fā)布和拉取。
在流量控制方面,我們內(nèi)置實現(xiàn)了固定窗口、滑動窗口等知名的限流算法,同時也支持與第三方成熟的限流熔斷框架 Hystrix,Sentinel-golang 等集成提供治理功能。
在分布式事務(wù)方面,我們支持 Seata-golang,實現(xiàn)了 TCC 模式分布式事務(wù)的調(diào)用。
在鏈路追蹤方面,我們支持基于 Jaeger、ZipKin 的鏈路追蹤能力。在指標可視化方面,我們支持使用 Prometheus 收集框架指標和用戶指標。
3 目標用戶
Dubbo-go 從開始即是面向生產(chǎn)環(huán)境基于用戶的實際需求構(gòu)建開發(fā)的,其目標用戶如下。
- 廣大 Go 語言微服務(wù)開發(fā)者
如果您是 Go 語言微服務(wù)開發(fā)者,希望基于輕量級微服務(wù)框架快速開發(fā)自己的服務(wù),那么 Dubbo-go 3.0 將是您很好的一個選擇。
- Dubbo 生態(tài)多語言使用者
如果您是 Dubbo 生態(tài)使用者,或者在語言切換的過程中面對兼容性問題,Dubbo-go 在多協(xié)議跨語言互通的場景下會祝您一臂之力。
- gRPC 使用者
如果您希望在 gRPC 生態(tài)中增加服務(wù)治理能力,Dubbo-go 可幫助您很容易地從 gRPC 接入 Dubbo 生態(tài),在不改變業(yè)務(wù)代碼的情況下提供服務(wù)治理能力的支持。
- 云原生架構(gòu)師
如果你在為公司選擇云原生解決方案,dubbogo 3.0 提供的 proxyless service mesh 也是一個很好的選擇,它可以幫助你以最低的成本助你從微服務(wù)體系接入 istio 控制面。當然,dubbogo 的控制面能力還需要進一步加強,在未來的 3.1 版本中提供 proxyless 和 proxy 兩套 service mesh 方案。
二 Dubbo-go 3.0 有哪些不同
Apache 軟件基金會頂級項目 Dubbo 開源至今已有十年時間,而作為第三個里程碑,也是云原生時代的全新版本,Dubbo 3.0 的研發(fā)工作最早可以追溯到2018年,作為 Dubbo 多語言生態(tài)的重要一環(huán),Dubbo-go 社區(qū)也在2020年年底,將 3.0 版本作為主推方向。
在官方新特性支持(Triple 協(xié)議、應(yīng)用級服務(wù)發(fā)現(xiàn)、路由規(guī)則、柔性服務(wù)等等)的基礎(chǔ)之上,Dubbo-go 社區(qū)針對使用友好性,多語言多生態(tài)的兼容性,用戶編程和使用習慣等方面重點進行了優(yōu)化,與其說 Go 社區(qū)的 3.0 是一次版本對齊的迭代,不如說是一個富有生命力的新開始。
1 新配置方案
- 配置結(jié)構(gòu)
在 3.0 時代,我們更清晰地規(guī)范出了應(yīng)用層級配置和接口層級配置的概念,相比于之前版本,在配置結(jié)構(gòu)上進行了重構(gòu)和精簡化。例如開發(fā)者在微服務(wù)場景之下,會關(guān)注注冊中心地址、協(xié)議、接口名等信息。只需要在配置文件中制定好:
dubbo: registries: ZKRegistry: # 注冊中心配置 Protocol: zookeeper # 注冊中心類型 address: 127.0.0.1:2181 # 注冊中心配置 protocols: triple: # 協(xié)議配置 name: tri # 協(xié)議名 port: 20000 # 服務(wù)端監(jiān)聽端口 provider: services: GreeterProvider: # 服務(wù)提供者類名 interface: com.dubbogo.sample.DemoServiceName # 接口 ID
- 配置中心
在 Dubbo-go 3.0 中,可以將上述框架配置或用戶配置放置在配置中心內(nèi)便于管理。在容器內(nèi)只需要放置配置中心相關(guān)信息即可基于該配置啟動框架。
dubbo: config-center: # 配置中心信息 protocol: nacos address: 127.0.0.1:8848 data-id: dubbo-go-samples-configcenter-nacos-server
- 配置API
開發(fā)者可以在代碼內(nèi)通過配置 API 生成配置實例結(jié)構(gòu),代碼中生成的配置與從文件內(nèi)讀取的配置等價。參考于 Java Builder 的設(shè)計來自于社區(qū)同學們,也代表了開發(fā)者對于接口易用性的訴求。
// 1. 通過 Builder 模式創(chuàng)建配置中心的配置configCenterConfig := config.NewConfigCenterConfigBuilder(). SetProtocol("nacos").SetAddress("127.0.0.1:8848"). SetDataID("dubbo-go-samples-configcenter-nacos-server"). SetGroup("dubbogo"). Build()// 2. 通過 Builder 模式創(chuàng)建根配置rootConfig := config.NewRootConfigBuilder(). SetConfigCenter(configCenterConfig). Build()// 3. 加載配置并啟動框架rootConfig.Load() // 啟動框架
2 Triple PB 協(xié)議
Dubbo-go 在上半年首次發(fā)布的 3.0.0-rc1 版本內(nèi)已經(jīng)支持 Triple 協(xié)議。在此期間,由合作方釘釘部門相關(guān)同學提出了較多針對響應(yīng)時延、穩(wěn)定性等優(yōu)化建議。時至今日,在性能、用戶使用體驗、泛化調(diào)用、異?;貍鳌B反射等方面都進行了大量的優(yōu)化工作。
- 性能優(yōu)化
將舊版本基于 net/http2 的實現(xiàn)切換為基于 grpc 的 http2 層實現(xiàn)方案。增強了底層傳輸?shù)姆€(wěn)定性和性能。經(jīng)過壓測,4c8g 單機 Provider 可以處理 7萬 tps 的簡單請求。
我們使用了 3 臺相同規(guī)格機器,一臺作為Server(運行一個 triple-server),一臺作為Client(運行一個triple-server 和triple client) ,一臺作為施壓機向 Client 發(fā)起針對整個鏈路的調(diào)用施壓,并進行數(shù)據(jù)記錄,記錄rt、真實 tps 以及client 和 server 的 CPU 占比數(shù)據(jù)。
TPS | Consumer CPU (%) | Provider CPU(%) | RT(ms) |
1000 | 8.9 | 4.6 | 0.6 |
2000 | 16.5 | 8.5 | 0.6 |
5000 | 18.8 | 10 | 1 |
10000 | 37 | 18.3 | 1 |
20000 | 72 | 37 | 1 |
25000 | 77 | 40 | 1.2 |
通過壓測結(jié)果我們可以看到,我們在多跳鏈路和單機上萬級別tps的實驗環(huán)境下,可以保證毫秒級請求時延,并維持合理的 CPU 資源占用率。
- 反射支持Triple 默認開啟 proto 反射,用戶可以使用 grpc_cli 針對 Triple 協(xié)議暴露的pb序列化服務(wù)進行展示和調(diào)試。 在 proto 反射支持的前提下,dubbo-go-pixiu 提供了網(wǎng)關(guān)層協(xié)議轉(zhuǎn)換調(diào)用 triple 服務(wù)的支持。
$ grpc_cli ls localhost:20000org.apache.dubbogo.samples.api.Greetergrpc.reflection.v1alpha.ServerReflection
- 用戶編程方式
新 PB 編譯插件,新版本 dubbo-go 推薦 go 用戶使用 proto 文件定義接口,與 gRPC-go 的使用方式類似。
$ go install github.com/dubbogo/tools/cmd/protoc-gen-go-triple@v1.0.5$ protoc --go_out=. --go-triple_out=. ./helloworld.proto
關(guān)于 Triple 協(xié)議,最早是阿里云中間件團隊在 Dubbo3 形成概念的時候就提出的。它相比于上一代 Dubbo 協(xié)議,解決了 Dubbo 生態(tài)與其他云原生架構(gòu)生態(tài)不互通的特點,并且用戶很難理解位于傳輸層的上一代二進制協(xié)議?;?HTTP2 協(xié)議的 gRPC 擴展協(xié)議就很好滴解決了這一問題。第二是點是對 Mesh 等網(wǎng)關(guān)型組件不夠友好,在 3.0 時代,我們可以直接通過解析協(xié)議頭來獲取必要的元數(shù)據(jù),并很自然地適配網(wǎng)關(guān)對于 HTTP 協(xié)議的轉(zhuǎn)發(fā)實現(xiàn)。
從我們社區(qū)所對接的 Go 語言開發(fā)者考慮,PB 序列化更能適配與他們的開發(fā)習慣,方便從已有 gRPC 服務(wù)遷移業(yè)務(wù)代碼,還解決了升級過程中跨協(xié)議通信的兼容性問題,而在使用 Triple 協(xié)議后,跨語言互通的優(yōu)勢將進一步體現(xiàn),從“可互通” 轉(zhuǎn)變?yōu)榛诔墒煨蛄谢桨傅摹胺€(wěn)定性互通”,方便用戶業(yè)務(wù)更廣泛的擴展,簡單來說,在 Dubbo 時代,用戶進行跨語言互通需要依賴多語言生態(tài)的 Dubbo 協(xié)議實現(xiàn),而在3.0 時代,您可以使用任意語言的 gRPC 實現(xiàn)來與 Dubbo 服務(wù)直接進行互通,并共享 gRPC 生態(tài)的一系列組件,例如鏈路追蹤、可視化、cli 工具等等。
因此,我們認為 Triple 的意義并不是一個簡單的擴展協(xié)議,而是一個跨語言、跨生態(tài)概念的實現(xiàn),也是 Dubbo3 的核心 Feature 所在。
3 柔性服務(wù)
大規(guī)模分布式系統(tǒng)承載的用戶流量呈指數(shù)級增長,需要使用負載均衡算法將流量均勻地分散到各個機器中,提升集群的吞吐率和資源利用率。
傳統(tǒng)負載均衡算法大多是基于消費者視角,它們共同的局限性是無法根據(jù)服務(wù)提供者的當前狀態(tài)動態(tài)調(diào)整分流策略,如 RR、hash 等算法。這些算法總是以盡可能公平的概率分配流量,但在實踐中公平不等于負載均衡。
我們期望的均衡分流策略是:
- 動態(tài)性能評估:用戶不需要事先設(shè)置機器權(quán)重,框架在運行時自動評估系統(tǒng)性能,性能好的機器承擔更多流量,性能不足的機器承擔更少的流量;
- 故障自愈能力:負載均衡算法能夠自動摘除故障的節(jié)點,并具備故障自愈能力;
- 適當限流策略:避免服務(wù)雪崩問題。
柔性服務(wù)作為新一代負載均衡策略被引入 Dubbo-go 3.0 中,核心能力包括容量評估和智能分流。
容量評估是評估當前服務(wù)提供者狀態(tài)以保持最優(yōu)請求隊列長度。容量評估關(guān)注的兩個核心指標是 TPS 和延遲,TPS 評估系統(tǒng)的每秒處理事物的速度,延遲反映用戶等待時間。在評估服務(wù)端容量時,要平衡系統(tǒng)吞吐率和用戶等待時間兩者之間的關(guān)系,理想狀態(tài)下在系統(tǒng)吞吐率盡可能大的情況下用戶延遲盡可能小。
真實容量受到硬件和下游依賴的限制,一次性預(yù)測真實容量難度較高。如上圖所示,TPS 在到達最佳值之前,與請求數(shù)呈單調(diào)遞增的關(guān)系。在 Dubbo-go 3.0.0 版本中,我們引入了爬山算法(HillClimbing),在調(diào)用過程中逐步逼近系統(tǒng)的最佳承載量。
HillClimbing 算法作用于服務(wù)提供者,周期性地判定當前是否處于最佳狀態(tài)并動態(tài)更新系統(tǒng)容量。
探測間隔隨著時間逐步拉長,直至趨向穩(wěn)定。剛啟動時沒有歷史數(shù)據(jù),此時需要頻繁更新容量評估值,保證系統(tǒng)以盡可能快的速度探測到最優(yōu)容量。我們假定最優(yōu)容量短時間內(nèi)不會再強烈波動,且容量評估也會額外消耗資源,因此當趨向穩(wěn)定的時候,算法將逐步延長探測周期。
容量更新策略與 TCP 擁塞控制相似。下面公示表示 HillClimbing 算法預(yù)設(shè)的兩種增量類型:
其中,lim 表示當前容量,itv 表示當前探測間隔。
在初期采用慢啟動策略,取一個較低水平的值作為容量初始值,但是以較高增量(alpha)向最優(yōu)容量逼近。如果當前容量已經(jīng)增長到 TPS 降低的情況,則使用較低增量(beta)以更精準的方式向最優(yōu)容量移動。
在每次調(diào)用過程結(jié)束后,服務(wù)提供者會通過 Dubbo-go 的附件(attachment)特性將最新的預(yù)估容量返回給服務(wù)消費者,消費者將信息緩存至本地并使用 P2C 算法實現(xiàn)智能分流。
P2C(Pick Two Random Choices)算法作用于服務(wù)消費者,它有著更科學的負載均衡策略并廣泛的應(yīng)用在多個知名開源項目中,如 Linkerd、Rsocket 等。該算法首先隨機選擇兩個節(jié)點,然后對比節(jié)點的剩余容量,選擇其中一個剩余容量較多的節(jié)點作為本次調(diào)用的服務(wù)提供者。
柔性服務(wù)將在后續(xù)版本中持續(xù)優(yōu)化,與 Dubbo 社區(qū)共同探索出一套適合微服務(wù)場景的柔性服務(wù)最佳實踐。
4 Pixiu 網(wǎng)關(guān)
Dubbo-go-pixiu 網(wǎng)關(guān)支持調(diào)用 GO/Java 的 Dubbo 集群。在 Dubbo-go 3.0 的場景下,我們可以通過 Pixiu 網(wǎng)關(guān),在集群外以 HTTP 協(xié)議請求 pixiu 網(wǎng)關(guān),在網(wǎng)關(guān)層進行協(xié)議轉(zhuǎn)換,進一步調(diào)用集群內(nèi)的Dubbo-go 服務(wù)。
用戶調(diào)用 Dubbo-go 服務(wù)的 path 為http://$(app_name)/$(service_name)/$(method)。
例如一個proto文件內(nèi)有如下定義:
package org.apache.dubbo.quickstart.samples;service UserProvider { rpc SayHello (HelloRequest) returns (User) {}}message HelloRequest { string name = 1;}
并在dubbo-go 服務(wù)啟動時在dubbogo.yml 內(nèi)配置應(yīng)用名為my-dubbogo-app:
dubbo: application: name: my-dubbogo-app
pixiu 網(wǎng)關(guān)即可解析 path 為 my-dubbogo-app/org.apache.dubbo.quickstart.samples.UserProvider/SayHello 的路由,并轉(zhuǎn)發(fā)至對應(yīng)服務(wù)。來自外部HTTP 請求的 body 為 json 序列化的請求參數(shù),例如 {"name":"test"}。我們目前推薦使用 Nacos 作為注冊中心。用戶可以在自己的集群里部署我們的demo,集群最好擁有暴露 lb 類型 service 的能力,從而可以在公網(wǎng)訪問至集群內(nèi)的服務(wù),您也可以直接集群內(nèi)進行請求。
針對您的集群,執(zhí)行:
$ kubectl apply -f https://raw.githubusercontent.com/dubbogo/triple-pixiu-demo/master/deploy/pixiu-triple-demo.yml
會在 dubbogo-triple-nacos 命名空間下創(chuàng)建如下資源,包含三個 triple-server,一個pixiu網(wǎng)關(guān),一個 nacos server。并通過 Servcie 將服務(wù)暴露至公網(wǎng)。
namespace/dubbogo-triple-nacos createdservice/dubbo-go-nacos createddeployment.apps/dubbogo-nacos-deployment createddeployment.apps/pixiu createddeployment.apps/server createdservice/pixiu created
獲取 pixiu 公網(wǎng) ip 并進行調(diào)用
$ kubectl get svc -n dubbogo-triple-nacosNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEdubbo-go-nacos ClusterIP 192.168.123.204 <none> 8848/TCP 32spixiu LoadBalancer 192.168.156.175 30.XXX.XXX.XX 8881:30173/TCP 32s
通過curl 調(diào)用 demo 服務(wù),并獲得響應(yīng)結(jié)果。
$ curl -X POST -d '{"name":"laurence"}' http://30.XXX.XXX.XX:8881/dubbogoDemoServer/org.apache.dubbo.laurence.samples.UserProvider/SayHello{"name":"Hello laurence","id":"12345","age":21}
5 運維能力與工具
- 可觀測性
相比于上一版本的 Dubbo-go,本次發(fā)布在原來Dubbo協(xié)議的可觀測性的基礎(chǔ)上,提供了基于 Triple 協(xié)議可觀測性支持,適配于 Jaeger 的鏈路追蹤展示。對于數(shù)據(jù)上報,我們在框架中為之提供了接口,方便用戶實時上報業(yè)務(wù)埋點數(shù)據(jù),并默認開啟 promehteus 的拉模式數(shù)據(jù)收集的支持。
框架對于 RPC調(diào)用相關(guān)信息,例如請求RT,接口名、方法名等數(shù)據(jù),也提供了默認的 metrics 字段,供用戶收集和統(tǒng)計。
- 日志
本次發(fā)版對日志模塊進行了較大的改變和更新,用戶可以根據(jù)需求配置日志打印的級別、分片、文件輸出、保留時常等信息,并支持用戶自定義日志組件。
- cli工具
Dubbo-go 3.0 會針對命令行工具進行重點開發(fā),目前社區(qū)已提供用于發(fā)起 Dubbo RPC 調(diào)用的dubbo-go-cli;用于編譯 pb 文件的protoc-gen-go-triple 插件;并且 Dubbo-go 已經(jīng)適配 grpc_cli 工具的調(diào)試,在未來,我們會在健康檢查、服務(wù)信息獲取、RPC 調(diào)用調(diào)試、框架代碼初始化和接口編譯、服務(wù)部署等方面,進一步增強命令行工具的能力,以提供更完備的服務(wù)治理和運維生態(tài)。
三 用戶視角的 Dubbo-go
作為一款站在用戶角度設(shè)計的框架,我們更希望給予廣大用戶更簡潔,更直觀,更“約定大于配置”的使用體驗,因此在研發(fā)階段,我們重點進行了多輪的配置迭代以及 samples 倉庫的建設(shè)和維護,為用戶提供了更為精簡的概念和重點突出的 samples 示例。
1 面向接口和配置的開發(fā)
Dubbo-go 3.0 為開發(fā)者屏蔽掉了底層實現(xiàn)細節(jié),只需要關(guān)注幾個關(guān)鍵點即可使用本框架進行開發(fā),以 triple 服務(wù)為例。
- 框架配置文件:dubbogo.yaml
框架啟動所依賴的配置項。
- 接口定義
編寫 proto 文件,并使用提供的 protoc-gen-go-triple 插件以及官方 protoc-gen-go 插件進行編譯。
- 接口代碼實現(xiàn)
編寫服務(wù)實現(xiàn),并使用框架進行啟動即可。
接口、實現(xiàn)、配置。是常見 go 微服務(wù)的基本依賴元素。Dubbo-go 提供一整套微服務(wù)的解決方案,并提供豐富的服務(wù)治理能力和可擴展能力,從而可以讓用戶容易地接入使用。
2 代碼示例倉庫 dubbo-go-samples
我們在apache/dubbo-go-samples 倉庫的 master 分支維護了豐富的 dubbo-go 3.0 的代碼示例。包括多種協(xié)議的 rpc 調(diào)用,多種注冊中心的支持,多種配置中心的使用,以及泛化調(diào)用、配置API、日志、數(shù)據(jù)上報、鏈路追蹤等運維能力的展示,幾乎框架擁有的全部能力都可以在 samples 倉庫中找到對應(yīng)的常見用例。用戶也可以在1.5分支找到適配與dubbo-go 1.5.x 的示例。
通過 3.0 前期階段對于配置重構(gòu)和大幅度的用戶友好性優(yōu)化,目前 samples 倉庫內(nèi)的代碼和配置都已經(jīng)高度精簡化,從而突出單個模塊的能力。開發(fā)者可以下載倉庫后直接按照server 到 client 的順序來啟動一個示例模塊的服務(wù),即可體驗框架提供的能力。
samples 倉庫在迭代過程中也被賦予了更多的功能,社區(qū)開發(fā)同學都會熟悉,我們將框架倉庫、samples 倉庫通過 ci 集成測試的方式結(jié)合起來,保證框架開發(fā)者每次提交的代碼都能通過所有用例的 e2e 測試,從而保障開發(fā)質(zhì)量,提高迭代的效率。
四 社區(qū)協(xié)作
作為一個能力功能非常豐富的服務(wù)平臺,dubbogo 社區(qū)很重視與各大開源社區(qū)特別是阿里系開源產(chǎn)品社區(qū)以及各個公司的合作。
- Nacos 社區(qū)
早期 Dubbo-go 社區(qū)就與 Nacos 社區(qū)展開密切合作,由多位核心貢獻者參與 Dubbo-go 研發(fā)支持中,在 3.0.0 版本中,增加了多位 Nacos 社區(qū)成員,在社區(qū)迭代中作出了許多建設(shè)性的建議和貢獻。
點擊鏈接查看原文Dubbo-go v3.0 正式發(fā)布 ——打造國內(nèi)一流開源 Go 服務(wù)框架,關(guān)注公眾號【阿里技術(shù)】獲取更多福利!
版權(quán)聲明:本文內(nèi)容由阿里云實名注冊用戶自發(fā)貢獻,版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。具體規(guī)則請查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識產(chǎn)權(quán)保護指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進行舉報,一經(jīng)查實,本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。