<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Dubbo為什么用Go重寫?

          共 3166字,需瀏覽 7分鐘

           ·

          2022-01-09 22:51

          先說兩句

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


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

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

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

          連接過去和未來

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

          官方給出的中文翻譯是

          Apache Dubbo Go 語言實(shí)現(xiàn),架起 Java 和 Golang 之間的橋梁,與 gRPC/Dubbo 生態(tài)互聯(lián)互通,帶領(lǐng) Java 生態(tài)享受云原生時(shí)代的技術(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ā)效率高,項(xiàng)目能早日上線,占領(lǐng)市場,也能節(jié)約人力成本
          • 運(yùn)行效率。運(yùn)行效率高,能省下服務(wù)器成本

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

          阿里早期是PHP,選擇PHP的考量點(diǎn)主要是開發(fā)效率,但隨著業(yè)務(wù)的發(fā)展,PHP的性能無法支撐,必須得換一個(gè)運(yùn)行效率高的語言。

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

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

          把性能放第一位,簡單易學(xué)、生態(tài)豐富、社區(qū)活躍其實(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é)跳動(dòng)這類新公司就以Go為主。

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

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

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

          小結(jié)

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

          Dubbo在RPC框架中的勝出

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

          能適配Java語言的RPC框架中,Dubbo是國內(nèi)最早開源,于2011年開源。

          而和他類似的競品如Spring Cloud在2014年開源,微博的Motan在2017年開源,跨語言的gRPC在2015年開源,Thrift 2007年開源。

          只有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é)與線程池的斗爭

          如果使用了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)歷,其中我花了大篇幅介紹了「與線程池所做的斗爭」,在Java中,線程是很寶貴的,但Dubbo網(wǎng)關(guān)如果是同步調(diào)用,必須一個(gè)請(qǐng)求占用一個(gè)線程,這就導(dǎo)致并發(fā)上不去,而且線程池打滿后,會(huì)影響其他請(qǐng)求。

          所以解決方案要么是隔離線程池,要么改成異步調(diào)用。隔離線程池只解決了請(qǐng)求不相互影響,但并發(fā)還是上不去,改成異步調(diào)用可以完美解決,但是編碼實(shí)在是太復(fù)雜。

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

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

          小結(jié)

          所以在Dubbo網(wǎng)關(guān)上,Dubbo-Go也提供了一種新的解法,已經(jīng)有用于線上的Dubbo-Go網(wǎng)關(guān),開源項(xiàng)目可參考Dubbo-go-pixiu。

          為Dubbo Mesh鋪路

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

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

          總結(jié)

          說了這么多,該正面回答Dubbo為什么要用Go重寫,這個(gè)問題的答案還是官方給出的那句話:架起 Java 和 Golang 之間的橋梁。至于為什么要「架起這座橋梁」,參考下圖:


          ··········? END? ··············

          也許你還想看
          ??|?官宣!我升級(jí)了!!!
          ??|?抄襲狗,你冬天睡覺腳必冷?。?!
          ??|?用 Java 寫個(gè)沙盒塔防游戲!已上架 Steam,Apple Store
          ? |?這樣使用 IDEA ,效率提升10倍!| IDEA 高效使用指南
          ? |?豆瓣 9.7!這本技術(shù)書籍直接封神了
          ? |?阿里開源的15個(gè)頂級(jí)Java項(xiàng)目!!!
          ? |?面試八股文,YYDS!

          簡歷指導(dǎo)/Java 學(xué)習(xí)/面試指導(dǎo)/面試小冊(cè),歡迎加入我的知識(shí)星球(公眾號(hào)后臺(tái)回復(fù)“星球”即可)。

          如果本文對(duì)你有幫助的話,歡迎點(diǎn)贊&在看&分享,這對(duì)我繼續(xù)分享&創(chuàng)作優(yōu)質(zhì)文章非常重要。感謝????

          瀏覽 58
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美亚洲黄色 | 免费看日本一级片 | 国产精品卡一卡二 | 一区二区三清视频 | 天天操比|