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