亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
[[443126]]" >[[443126]]
先說(shuō)兩句話
連結(jié)過(guò)去與未來(lái)
程式語(yǔ)言的抉擇
小結(jié)
Dubbo在RPC框架中的勝出
終結(jié)與線程池的鬥爭(zhēng)
為Dubbo Mesh鋪路
總結(jié)
首頁(yè) 後端開發(fā) Python教學(xué) Dubbo 為什麼用 Go 重寫?

Dubbo 為什麼用 Go 重寫?

Apr 10, 2023 pm 12:51 PM
java go dubbo

先說(shuō)兩句話

我常常在散步時(shí)思考很多技術(shù)上的「為什麼問(wèn)題」 ,有時(shí)一個(gè)問(wèn)題會(huì)想很久,直到問(wèn)題的每個(gè)點(diǎn)都能說(shuō)服自己時(shí),才算完結(jié)。於是想把這些思考記錄下來(lái),形成文章,可以當(dāng)作一個(gè)新的系列。這些文章中你可能看不到程式碼,但能窺探一些容易被忽略的問(wèn)題,以及問(wèn)題更深層的「為什麼」。

今天帶來(lái)第1篇,Dubbo為什麼要用Go重寫?

誕生於阿里巴巴,2011年開源的Dubbo已經(jīng)走過(guò)了10個(gè)年頭。在2019年,它被用Go重寫並開源,如今兩年過(guò)去,已經(jīng)從當(dāng)初的V1.0.0版本發(fā)展到了V3.0.0,截止目前star數(shù)3.8K。

有一次同事問(wèn)我,為什麼Dubbo這麼"老"的專案還要用Go重寫,有什麼現(xiàn)實(shí)意義嗎?

今天就來(lái)談?wù)勎业囊恍┛捶ā?

連結(jié)過(guò)去與未來(lái)

我覺得要回答好這個(gè)問(wèn)題,得從Dubbo-go的初衷談起,github主頁(yè)上它是這樣介紹自己的:

#官方給出的中文翻譯是

Apache Dubbo Go 語(yǔ)言實(shí)現(xiàn),架起Java 和Golang 之間的橋樑,與gRPC/Dubbo 生態(tài)互聯(lián)互通,帶領(lǐng)Java生態(tài)享受雲(yún)端原生時(shí)代的科技紅利。

我再通俗地翻譯一下:一個(gè)公司或部門內(nèi)有人用Java版Dubbo,有人用Go,這兩者需要通信,於是就有了Dubbo-Go,用來(lái)解決通信問(wèn)題。

所以第一個(gè)問(wèn)題來(lái)了,為什麼一個(gè)公司用了Java,又用了Go?

程式語(yǔ)言的抉擇

對(duì)於程式語(yǔ)言的選擇,在商業(yè)公司裡,我覺得最主要考慮的點(diǎn)就是效率,至於其他的點(diǎn)都是次要。因?yàn)樯虡I(yè)公司的主要目的就是獲利,不管什麼語(yǔ)言,只要能用最低的成本拿到相等的收益就是好語(yǔ)言。

效率又包含了好幾個(gè)面向:

  • 開發(fā)效率。開發(fā)效率高,專案能早日上線,佔(zhàn)領(lǐng)市場(chǎng),也能節(jié)省人力成本
  • 運(yùn)作效率。運(yùn)作效率高,能省下伺服器成本

縱觀國(guó)內(nèi)許多商業(yè)公司的選擇都是如此考慮,例如阿里。

阿里早期是PHP,選擇PHP的考慮點(diǎn)主要是開發(fā)效率,但隨著業(yè)務(wù)的發(fā)展,PHP的表現(xiàn)無(wú)法支撐,必須換一個(gè)運(yùn)作效率高的語(yǔ)言。

運(yùn)作效率高自然想到C/C ,但這兩種語(yǔ)言的開發(fā)效率低,得在開發(fā)效率和運(yùn)作效率中找到一個(gè)平衡點(diǎn),於是阿里選擇了Java。

阿里官方在知乎上回答為什麼選擇Java時(shí),主要有以下幾點(diǎn)考慮:性能、簡(jiǎn)單易學(xué)、生態(tài)豐富、社區(qū)活躍

把性能放第一位,簡(jiǎn)單易學(xué)、生態(tài)豐富、社群活躍其實(shí)也都是說(shuō)的開發(fā)效率,正是有了這些優(yōu)點(diǎn),開發(fā)效率才高。

當(dāng)阿里巴巴選擇Java後,自研了大量的Java中間件,培養(yǎng)了大量的Java人才,所以其他公司在技術(shù)選型時(shí),也參考了阿里巴巴,導(dǎo)致越來(lái)越多的公司選擇了Java。

而選擇Go也是如此,一些年輕的公司早期可能是PHP、Python等腳本語(yǔ)言,等發(fā)展壯大後,不得不面臨和阿里一樣的問(wèn)題:效能問(wèn)題。

在2012年Go發(fā)布了,大家又多了一個(gè)選擇,Go既有很高的性能,又非常地簡(jiǎn)單易上手,像字節(jié)跳動(dòng)這類新公司就以Go為主。

所以綜合來(lái)看,選擇Java或Go都是合理的,存在即合理。

為什麼有公司選擇了Java,又想用Go呢?

  • Go語(yǔ)言相比Java有啟動(dòng)快,編譯速度快、佔(zhàn)用內(nèi)存小、擅長(zhǎng)高並發(fā)(協(xié)程)的特性,所以在已經(jīng)有Java的公司,也會(huì)考慮Go,只不過(guò)目前這類公司佔(zhàn)比不多。
  • 某些公司沒有強(qiáng)制的技術(shù)棧,所以新部門新業(yè)務(wù)可以擺脫束縛,選擇新語(yǔ)言Go來(lái)進(jìn)行開發(fā)。

小結(jié)

綜上看來(lái),選擇Java或選擇Go都合理,一個(gè)公司內(nèi)兩者都選擇,也有合理之處,雖然佔(zhàn)比不多,但還是有Java和Go通訊的需求。

Dubbo在RPC框架中的勝出

公司早期通常是單體服務(wù),在規(guī)模達(dá)到一定程度,單體應(yīng)用無(wú)法支撐業(yè)務(wù)發(fā)展時(shí),會(huì)選擇微服務(wù)架構(gòu),這時(shí)就需要一個(gè)好用的RPC框架。

能適應(yīng)Java語(yǔ)言的RPC框架中,Dubbo是國(guó)內(nèi)最早開源,於2011年開源。

而和他類似的競(jìng)品如Spring Cloud在2014年開源,微博的Motan在2017年開源,跨語(yǔ)言的gRPC在2015年開源,Thrift2007年開源。

只有Thrift比它早,但Thrift只是個(gè)RPC框架,Dubbo可是包含了開箱即用的服務(wù)治理能力,如服務(wù)註冊(cè)與發(fā)現(xiàn)、負(fù)載平衡、容錯(cuò)、動(dòng)態(tài)配置等等。

可以說(shuō)早期Java的RPC框架沒得選。

就算到了RPC框架百花齊放的時(shí)代,這麼多公司的使用加上阿里的背書,Dubbo也有它的一席之地。

小結(jié)

當(dāng)一個(gè)公司選擇了Java程式語(yǔ)言和Dubbo框架(這種選擇還是挺多的),後來(lái)又想嘗試Go,或者一些新業(yè)務(wù)、新部門想嘗試Go時(shí),他們就面臨了一個(gè)難題,Go如何跟Java的Dubbo通訊。

由於Dubbo協(xié)定是私有協(xié)議,用Go重新實(shí)現(xiàn)一遍的代價(jià)還蠻大。於是Dubbo-Go應(yīng)運(yùn)而生,從這個(gè)角度看,Dubbo-Go在連接Java和Go的通訊這條路上還是具有相當(dāng)大的價(jià)值的。

終結(jié)與線程池的鬥爭(zhēng)

如果使用了Dubbo框架,很多時(shí)候需要一個(gè)Dubbo網(wǎng)關(guān),關(guān)於Dubbo網(wǎng)關(guān)可以參考我這篇文章:《微服務(wù)網(wǎng)關(guān)演進(jìn)之路》。

在這篇文章中,詳細(xì)介紹了一款Dubbo網(wǎng)關(guān)的背景、難點(diǎn)、選型、設(shè)??計(jì)、演進(jìn)以及踩坑經(jīng)歷,其中我花了大篇幅介紹了“與線程池所做的鬥爭(zhēng)」,在Java中,線程是很寶貴的,但Dubbo網(wǎng)關(guān)如果是同步調(diào)用,必須一個(gè)請(qǐng)求佔(zhàn)用一個(gè)線程,這就導(dǎo)致並發(fā)上不去,而且線程池打滿後,會(huì)影響其他請(qǐng)求。

所以解決方案要嘛是隔離執(zhí)行緒池,要嘛改成非同步呼叫。隔離線程池只解決了請(qǐng)求不互相影響,但並發(fā)還是上不去,改成非同步呼叫可以完美解決,但是編碼實(shí)??在太複雜。

而Go的協(xié)程可以剛好解決這個(gè)問(wèn)題,Go的協(xié)程很輕量,調(diào)度效率也更高,所以我們可以用簡(jiǎn)單的程式碼寫出非常高效率的網(wǎng)關(guān)。

舉例可以直觀感受一下,Nginx的性能大家有目共睹,但如果用Java來(lái)實(shí)現(xiàn),不知道得堆多少機(jī)器才能達(dá)到Nginx的性能,但百度在反向代理上使用了Go寫的BFE來(lái)代替Nginx,可見其性能有多誇張。

關(guān)於協(xié)程的介紹和原理,可以參考我這篇文章:《寫了一年golang,來(lái)聊聊進(jìn)程、線程與協(xié)程》。

小結(jié)

所以在Dubbo網(wǎng)關(guān)上,Dubbo-Go也提供了一種新的解法,塗鴉智慧已經(jīng)有用於線上的Dubbo-Go網(wǎng)關(guān),並且已經(jīng)開源為Dubbo- go-pixiu。

為Dubbo Mesh鋪路

ServiceMesh也漸漸成為了下一代微服務(wù)架構(gòu),Go在Mesh上也絕對(duì)是個(gè)閃亮的明星語(yǔ)言,無(wú)論是K8S、Docker等雲(yún)端原生基礎(chǔ)設(shè)施都採(cǎi)用Go編寫,還是Go的開發(fā)速度以及協(xié)程的高並發(fā)能力,都使它成為了Mesh的首選語(yǔ)言。

基於此,Dubbo的Mesh化,Dubbo-Go也為其鋪平了道路,但目前DubboMesh還處?kù)缎∶娣e階段,完整落地的方案並沒有開源,從這點(diǎn)上來(lái)說(shuō),如果某公司想走DubboMesh化之路,Dubbo-Go可能也是他們要著重考慮的點(diǎn)之一。

總結(jié)

說(shuō)了這麼多,該正面回答Dubbo為什麼要用Go重寫,這個(gè)問(wèn)題的答案還是官方給出的那句話:架起Java 和Golang之間的橋樑。至於為什麼要「架起這座橋樑」,請(qǐng)參考下圖:

?

#

以上是Dubbo 為什麼用 Go 重寫?的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
GO應(yīng)用程序的標(biāo)準(zhǔn)項(xiàng)目佈局是什麼? GO應(yīng)用程序的標(biāo)準(zhǔn)項(xiàng)目佈局是什麼? Aug 02, 2025 pm 02:31 PM

答案是:Go應(yīng)用沒有強(qiáng)制項(xiàng)目佈局,但社區(qū)普遍採(cǎi)用一種標(biāo)準(zhǔn)結(jié)構(gòu)以提升可維護(hù)性和擴(kuò)展性。 1.cmd/存放程序入口,每個(gè)子目錄對(duì)應(yīng)一個(gè)可執(zhí)行文件,如cmd/myapp/main.go;2.internal/存放私有代碼,不可被外部模塊導(dǎo)入,用於封裝業(yè)務(wù)邏輯和服務(wù);3.pkg/存放可公開復(fù)用的庫(kù),供其他項(xiàng)目導(dǎo)入;4.api/可選,存放OpenAPI、Protobuf等API定義文件;5.config/、scripts/、web/分別存放配置文件、腳本和Web資源;6.根目錄包含go.mod和go.sum

您如何在GO中解析命令行旗幟? 您如何在GO中解析命令行旗幟? Aug 02, 2025 pm 04:24 PM

Go的flag包可輕鬆解析命令行參數(shù),1.使用flag.Type()定義字符串、整型、布爾等類型標(biāo)誌;2.可通過(guò)flag.TypeVar()將標(biāo)誌解析到變量避免指針操作;3.調(diào)用flag.Parse()後,用flag.Args()獲取後續(xù)位置參數(shù);4.實(shí)現(xiàn)flag.Value接口可支持自定義類型,滿足多數(shù)簡(jiǎn)單CLI需求,複雜場(chǎng)景可用spf13/cobra庫(kù)替代。

您如何在Go中宣布常數(shù)? 您如何在Go中宣布常數(shù)? Aug 02, 2025 pm 04:21 PM

在Go中,常量使用const關(guān)鍵字聲明,且值不可更改,可為無(wú)類型或有類型;1.單個(gè)常量聲明如constPi=3.14159;2.塊內(nèi)多個(gè)常量聲明如const(Pi=3.14159;Language="Go";IsCool=true);3.顯式類型常量如constSecondsInMinuteint=60;4.使用iota生成枚舉值,如const(Sunday=iota;Monday;Tuesday)將依次賦值0、1、2,且iota可用於位運(yùn)算等表達(dá)式;常量必須在編譯時(shí)確定值,

您如何使用諸如if-else in go中的條件語(yǔ)句? 您如何使用諸如if-else in go中的條件語(yǔ)句? Aug 02, 2025 pm 03:16 PM

Go中的if-else語(yǔ)句無(wú)需括號(hào)但必須使用花括號(hào),支持在if中初始化變量以限製作用域,可通過(guò)elseif鍊式判斷條件,常用於錯(cuò)誤檢查,且變量聲明與條件結(jié)合可提升代碼簡(jiǎn)潔性與安全性。

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動(dòng)管理內(nèi)存的機(jī)制,通過(guò)回收不可達(dá)對(duì)象釋放堆內(nèi)存,減少內(nèi)存洩漏風(fēng)險(xiǎn)。 1.GC從根對(duì)象(如棧變量、活動(dòng)線程、靜態(tài)字段等)出發(fā)判斷對(duì)象可達(dá)性,無(wú)法到達(dá)的對(duì)像被標(biāo)記為垃圾。 2.基於標(biāo)記-清除算法,標(biāo)記所有可達(dá)對(duì)象,清除未標(biāo)記對(duì)象。 3.採(cǎi)用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時(shí)較長(zhǎng)的MajorGC;Metaspace存儲(chǔ)類元數(shù)據(jù)。 4.JVM提供多種GC器:SerialGC適用於小型應(yīng)用;ParallelGC提升吞吐量;CMS降

如何在GO中連接到SQL數(shù)據(jù)庫(kù)? 如何在GO中連接到SQL數(shù)據(jù)庫(kù)? Aug 03, 2025 am 09:31 AM

要連接Go中的SQL數(shù)據(jù)庫(kù),需使用database/sql包和特定數(shù)據(jù)庫(kù)驅(qū)動(dòng)。 1.導(dǎo)入database/sql包和驅(qū)動(dòng)(如github.com/go-sql-driver/mysql),注意驅(qū)動(dòng)前加下劃線表示僅用於初始化;2.使用sql.Open("mysql","user:password@tcp(localhost:3306)/dbname")創(chuàng)建數(shù)據(jù)庫(kù)句柄,並調(diào)用db.Ping()驗(yàn)證連接;3.使用db.Query()執(zhí)行查詢,db.Exec()執(zhí)行

如何交叉編譯GO應(yīng)用程序? 如何交叉編譯GO應(yīng)用程序? Aug 02, 2025 pm 02:43 PM

Cross-compilingGoapplicationsrequiressettingGOOSandGOARCHenvironmentvariablestospecifythetargetplatform,enablingcompilationfordifferentoperatingsystemsandarchitecturesdirectlyfromanymachine.1.SetGOOSforthetargetoperatingsystem(e.g.,windows,linux,darw

See all articles