国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

Dubbo 為什麼用 Go 重寫?

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

先說兩句話

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

今天帶來第1篇,Dubbo為什麼要用Go重寫?

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

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

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

連結(jié)過去與未來

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

#官方給出的中文翻譯是

Apache Dubbo Go 語言實(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,用來解決通信問題。

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

程式語言的抉擇

對(duì)於程式語言的選擇,在商業(yè)公司裡,我覺得最主要考慮的點(diǎn)就是效率,至於其他的點(diǎn)都是次要。因?yàn)樯虡I(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)無法支撐,必須換一個(gè)運(yùn)作效率高的語言。

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

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

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

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

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

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

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

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

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

小結(jié)

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

Dubbo在RPC框架中的勝出

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

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

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

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

可以說早期Java的RPC框架沒得選。

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

小結(jié)

當(dāng)一個(gè)公司選擇了Java程式語言和Dubbo框架(這種選擇還是挺多的),後來又想嘗試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è)問題,Go的協(xié)程很輕量,調(diào)度效率也更高,所以我們可以用簡(jiǎn)單的程式碼寫出非常高效率的網(wǎng)關(guān)。

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

關(guān)於協(xié)程的介紹和原理,可以參考我這篇文章:《寫了一年golang,來聊聊進(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è)閃亮的明星語言,無論是K8S、Docker等雲(yún)端原生基礎(chǔ)設(shè)施都採(cǎi)用Go編寫,還是Go的開發(fā)速度以及協(xié)程的高並發(fā)能力,都使它成為了Mesh的首選語言。

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

總結(jié)

說了這麼多,該正面回答Dubbo為什麼要用Go重寫,這個(gè)問題的答案還是官方給出的那句話:架起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)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
比較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。

類型如何在GO中實(shí)現(xiàn)接口? 類型如何在GO中實(shí)現(xiàn)接口? Aug 03, 2025 pm 03:19 PM

InGo,atypeimplementsaninterfaceimplicitlybyprovidingallrequiredmethodswithoutexplicitdeclaration.1.Interfacesaresatisfiedautomaticallywhenatypehasmethodsmatchingtheinterface'ssignatureexactly.2.No"implements"keywordisneeded—ducktypingisused

如何在Java加入一系列字符串? 如何在Java加入一系列字符串? Aug 04, 2025 pm 12:55 PM

使用String.join()(Java8 )是連接字符串?dāng)?shù)組最簡(jiǎn)單推薦的方法,直接指定分隔符即可;2.對(duì)於舊版本Java或需要更多控制時(shí),可使用StringBuilder手動(dòng)遍歷並拼接;3.StringJoiner適用於需要前綴、後綴等更靈活格式的場(chǎng)景;4.使用Arrays.stream()結(jié)合Collectors.joining()適合在連接前對(duì)數(shù)組進(jìn)行過濾或轉(zhuǎn)換等操作;綜上所述,若使用Java8及以上版本,大多數(shù)情況下應(yīng)首選String.join()方法,語法簡(jiǎn)潔易讀,而對(duì)於復(fù)雜邏輯則推薦

如何比較Java中的兩個(gè)字符串? 如何比較Java中的兩個(gè)字符串? Aug 04, 2025 am 11:03 AM

使用.equals()方法比較字符串內(nèi)容,因?yàn)?=僅比較對(duì)象引用而非內(nèi)容;1.使用.equals()比較字符串值是否相等;2.使用.equalsIgnoreCase()進(jìn)行忽略大小寫的比較;3.使用.compareTo()按字典順序比較字符串,返回0、負(fù)數(shù)或正數(shù);4.使用.compareToIgnoreCase()進(jìn)行忽略大小寫的字典序比較;5.使用Objects.equals()或安全調(diào)用方式處理null字符串,避免空指針異常??傊瑧?yīng)避免使用==進(jìn)行字符串內(nèi)容比較,除非明確需要檢查對(duì)像是否相

鍵盤上的音量鍵無法正常工作 鍵盤上的音量鍵無法正常工作 Aug 05, 2025 pm 01:54 PM

First,checkiftheFnkeysettingisinterferingbytryingboththevolumekeyaloneandFn volumekey,thentoggleFnLockwithFn Escifavailable.2.EnterBIOS/UEFIduringbootandenablefunctionkeysordisableHotkeyModetoensurevolumekeysarerecognized.3.Updateorreinstallaudiodriv

如何在Java中使用線程池? 如何在Java中使用線程池? Aug 04, 2025 am 02:54 AM

使用線程池可提升性能並減少開銷,答案是通過重用線程來高效處理多任務(wù);1.選擇合適的線程池類型,如newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor或newScheduledThreadPool,生產(chǎn)環(huán)境推薦直接使用ThreadPoolExecutor以獲得更好控制;2.提交任務(wù)時(shí)可使用Runnable(無返回值)或Callable(有返回結(jié)果,並通過Future獲?。?;3.必須正確關(guān)閉線程池,先調(diào)用shutdown(),再

在Java中編寫高性能I/O代碼 在Java中編寫高性能I/O代碼 Aug 04, 2025 am 03:45 AM

應(yīng)優(yōu)先使用NIO而非BIO,因其基于通道和緩沖區(qū),支持非阻塞I/O并通過Selector實(shí)現(xiàn)單線程管理多連接,顯著降低線程開銷;2.必須合理使用緩沖如BufferedInputStream/BufferedOutputStream,并設(shè)置8KB~64KB緩沖區(qū)以減少系統(tǒng)調(diào)用,大文件傳輸應(yīng)使用FileChannel.transferTo()實(shí)現(xiàn)零拷貝;3.對(duì)大文件或頻繁隨機(jī)訪問場(chǎng)景應(yīng)采用內(nèi)存映射文件MappedByteBuffer,利用操作系統(tǒng)頁面緩存提升性能,但需警惕過大文件導(dǎo)致OutOfMem

Python記錄到文件示例 Python記錄到文件示例 Aug 04, 2025 pm 01:37 PM

Python的logging模塊可通過FileHandler將日誌寫入文件,首先調(diào)用basicConfig配置文件處理器和格式,如設(shè)置level為INFO、使用FileHandler寫入app.log;其次可添加StreamHandler實(shí)現(xiàn)同時(shí)輸出到控制臺(tái);進(jìn)階場(chǎng)景可用TimedRotatingFileHandler按時(shí)間分割日誌,例如設(shè)置when='midnight'實(shí)現(xiàn)每日生成新文件並保留7天備份,需確保日誌目錄存在;建議使用getLogger(__name__)創(chuàng)建命名logger,生產(chǎn)

See all articles