為什么很多公司轉(zhuǎn)型 Go 語言開發(fā)?Go 語言能做什么
來源:qfliweimin
1、為什么選擇Go語言 2、Go語言能做什么 3、國內(nèi)外有哪些企業(yè)或項目使用Go語言 4、寫在最后
1、為什么選擇Go語言
選擇Go語言的原因可能會有很多,關(guān)于Go語言的特性、優(yōu)勢等,我們在之前的文檔中也已經(jīng)介紹了很多了。但是最主要的原因,應(yīng)該是基于以下兩方面的考慮:
執(zhí)行性能
縮短API的響應(yīng)時長,解決批量請求訪問超時的問題。在Uwork的業(yè)務(wù)場景下,一次API批量請求,往往會涉及對另外接口服務(wù)的多次調(diào)用,而在之前的PHP實現(xiàn)模式下,要做到并行調(diào)用是非常困難的,串行處理卻不能從根本上提高處理性能。而GO語言不一樣,通過協(xié)程可以方便的實現(xiàn)API的并行處理,達(dá)到處理效率的最大化。依賴Golang的高性能HTTP Server,提升系統(tǒng)吞吐能力,由PHP的數(shù)百級別提升到數(shù)千里甚至過萬級別。
開發(fā)效率
GO語言使用起來簡單、代碼描述效率高、編碼規(guī)范統(tǒng)一、上手快。通過少量的代碼,即可實現(xiàn)框架的標(biāo)準(zhǔn)化,并以統(tǒng)一的規(guī)范快速構(gòu)建API業(yè)務(wù)邏輯。能快速的構(gòu)建各種通用組件和公共類庫,進(jìn)一步提升開發(fā)效率,實現(xiàn)特定場景下的功能量產(chǎn)。
2、Go語言能做什么
Go 語言從發(fā)布 1.0 版本以來備受眾多開發(fā)者關(guān)注并得到廣泛使用,Go 語言的簡單、高效、并發(fā)特性吸引了眾多傳統(tǒng)語言開發(fā)者的加入,而且人數(shù)越來越多。
鑒于Go語言的特點和設(shè)計的初衷,Go語言作為服務(wù)器編程語言,很適合處理日志、數(shù)據(jù)打包、虛擬機(jī)處理、文件系統(tǒng)、分布式系統(tǒng)、數(shù)據(jù)庫代理等;網(wǎng)絡(luò)編程方面,Go語言廣泛應(yīng)用于Web 應(yīng)用、API應(yīng)用、下載應(yīng)用等;除此之外,Go語言還適用于內(nèi)存數(shù)據(jù)庫和云平臺領(lǐng)域,目前國外很多云平臺都是采用Go開發(fā)。
服務(wù)器編程,以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日志、數(shù)據(jù)打包、虛擬機(jī)處理、文件系統(tǒng)等。
分布式系統(tǒng)、數(shù)據(jù)庫代理器、中間件等,例如Etcd。
網(wǎng)絡(luò)編程,這一塊目前應(yīng)用最廣,包括Web應(yīng)用、API應(yīng)用、下載應(yīng)用,而且Go內(nèi)置的net/http包基本上把我們平常用到的網(wǎng)絡(luò)功能都實現(xiàn)了。
數(shù)據(jù)庫操作
開發(fā)云平臺,目前國外很多云平臺在采用Go開發(fā)
3、國內(nèi)外有哪些企業(yè)或項目使用Go語言
Go發(fā)布之后,很多公司特別是云計算公司開始用Go重構(gòu)他們的基礎(chǔ)架構(gòu),很多都是直接采用Go進(jìn)行了開發(fā),最近熱火朝天的Docker就是采用Go開發(fā)的。

使用 Go 語言開發(fā)的開源項目非常多。早期的 Go 語言開源項目只是通過 Go 語言與傳統(tǒng)項目進(jìn)行C語言庫綁定實現(xiàn),例如 Qt、Sqlite 等;后期的很多項目都使用 Go 語言進(jìn)行重新原生實現(xiàn),這個過程相對于其他語言要簡單一些,這也促成了大量使用 Go 語言原生開發(fā)項目的出現(xiàn)。
云計算基礎(chǔ)設(shè)施領(lǐng)域代表項目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛云存儲等。
基礎(chǔ)軟件代表項目:tidb、influxdb、cockroachdb等。
微服務(wù)代表項目:go-kit、micro、monzo bank的typhon、bilibili等。
互聯(lián)網(wǎng)基礎(chǔ)設(shè)施代表項目:以太坊、hyperledger等。采用Go的一些國外公司,如Google、Docker、Apple、Cloud Foundry、CloudFlare、Couchbase、CoreOS、Dropbox、MongoDB、AWS等公司;采用Go開發(fā)的國內(nèi)企業(yè):如阿里云CDN、百度、小米、七牛、PingCAP、華為、金山軟件、獵豹移動、餓了么等公司。
DockerDocker 是一種操作系統(tǒng)層面的虛擬化技術(shù),可以在操作系統(tǒng)和應(yīng)用程序之間進(jìn)行隔離,也可以稱之為容器。Docker 可以在一臺物理服務(wù)器上快速運(yùn)行一個或多個實例。基于lxc的一個虛擬打包工具,能夠?qū)崿F(xiàn)PAAS平臺的組建。例如,啟動一個 CentOS 操作系統(tǒng),并在其內(nèi)部命令行執(zhí)行指令后結(jié)束,整個過程就像自己在操作系統(tǒng)一樣高效。
項目鏈接:https://github.com/docker/docker
go語言Go 語言自己的早期源碼使用C語言和匯編語言寫成。從 Go 1.5 版本后,完全使用 Go 語言自身進(jìn)行編寫。Go 語言的源碼對了解 Go 語言的底層調(diào)度有極大的參考意義,建議希望對 Go 語言有深入了解的讀者讀一讀。
項目鏈接:https://github.com/golang/go
KubernetesGoogle 公司開發(fā)的構(gòu)建于 Docker 之上的容器調(diào)度服務(wù),用戶可以通過 Kubernetes 集群進(jìn)行云端容器集群管理。
項目鏈接:https://github.com/kubernetes/kubernetes
etcd一款分布式、可靠的 KV 存儲系統(tǒng),可以快速進(jìn)行云配置。
項目鏈接:https://github.com/coreos/etcd
beegobeego 是一個類似 Python的 Tornado 框架,采用了 RESTFul 的設(shè)計思路,使用 Go 語言編寫的一個極輕量級、高可伸縮性和高性能的 Web 應(yīng)用框架。
項目鏈接:https://github.com/astaxie/beego
martini一款快速構(gòu)建模塊化的 Web 應(yīng)用的 Web 框架。項目鏈接:https://github.com/go-martini/martini
codis國產(chǎn)的優(yōu)秀分布式 Redis 解決方案。項目鏈接:https://github.com/CodisLabs/codis
FacebookFacebook也在用,為此他們還專門在Github上建立了一個開源組織facebookgo,大家可以通過https://github.com/facebookgo訪問查看facebook開源的項目,比如著名的是平滑升級的grace。
騰訊騰訊作為國內(nèi)的大公司,還是敢于嘗試的,尤其是Docker容器化這一塊,他們在15年已經(jīng)做了docker萬臺規(guī)模的實踐,具體可以參考http://www.infoq.com/cn/articles/tencent-millions-scale-docker-application-practice 。
百度目前所知的百度的使用是在運(yùn)維這邊,是百度運(yùn)維的一個BFE項目,負(fù)責(zé)前端流量的接入。他們的負(fù)責(zé)人在2016年有分享,大家可以看下這個 http://www.infoq.com/cn/presentations/application-of-golang-in-baidu-frontend 。
其次就是百度的消息系統(tǒng)。負(fù)責(zé)公司手百消息通訊系統(tǒng)服務(wù)器端開發(fā)及維護(hù)。
京東京東云消息推送系統(tǒng)、云存儲,以及京東商城等都有使用Go做開發(fā)。
小米小米對Golang的支持,莫過于運(yùn)維監(jiān)控系統(tǒng)的開源,也就是 http://open-falcon.com/ 。此外,小米互娛、小米商城、小米視頻、小米生態(tài)鏈等團(tuán)隊都在使用Golang。
360360對Golang的使用也不少,一個是開源的日志搜索系統(tǒng)Poseidon,托管在Github上,https://github.com/Qihoo360/poseidon. 還有360的推送團(tuán)隊也在使用,他們還寫了篇博文在Golang的官方博客上 https://blog.golang.org/qihoo。
七牛云七牛云用了近50萬行代碼,來實現(xiàn)整個產(chǎn)品。七牛云存儲產(chǎn)品網(wǎng)址:http://qiniu.com/。上線時間:2011-9-1。應(yīng)用范圍:整個產(chǎn)品(包括基礎(chǔ)服務(wù)、Web端、統(tǒng)計平臺、各類小工具等等)Go代碼行數(shù)占比:99.9%日 PV:保密
美團(tuán)美團(tuán)后臺流量支撐程序。應(yīng)用范圍:支撐主站后臺流量(排序,推薦,搜索等),提供負(fù)載均衡,cache,容錯,按條件分流,統(tǒng)計運(yùn)行指標(biāo)(qps,latency)等功能。
滴滴基礎(chǔ)服務(wù)平臺。
金山微看應(yīng)用范圍:服務(wù)接口,后臺流程服務(wù),消息系統(tǒng),圖片系統(tǒng)
weico服務(wù)端所有代碼都是用Go實現(xiàn)。
仙俠道應(yīng)用范圍:游戲服務(wù)端(通訊、邏輯、數(shù)據(jù)存儲)
快玩游戲應(yīng)用范圍:實時消息系統(tǒng)、用戶認(rèn)證、用戶會話、統(tǒng)一統(tǒng)計接口
盛大云CDNCDN的調(diào)度系統(tǒng)、分發(fā)系統(tǒng)、監(jiān)控系統(tǒng)、短域名服務(wù),CDN內(nèi)部開放平臺、運(yùn)營報表系統(tǒng)以及其他一些小工具等
Bmob移動后端云服務(wù)平臺應(yīng)用范圍:Restful API(使用Beego)、統(tǒng)計分析平臺、常用服務(wù)如發(fā)郵件、隊列異步處理、統(tǒng)計用戶空間和接口請求
群策統(tǒng)一團(tuán)隊溝通,高效完成工作 應(yīng)用范圍:全系統(tǒng)
BiddingX DSP廣告投放系統(tǒng) 應(yīng)用范圍:競價投放、曝光統(tǒng)計、點擊跳轉(zhuǎn)
宅豆自筑最美家,宅豆隨你搭
實驗樓第一家以實驗為核心的IT在線教育平臺
新浪微博中間件和彈性調(diào)度用 Java 和 Go 編寫,微博視頻轉(zhuǎn)碼及存儲服務(wù)用 Go 編寫。
愛奇藝VR 后臺系統(tǒng)中間件,VR 端的 HTTP 接口。
網(wǎng)易網(wǎng)易蜂巢容器公有云。
嗶哩嗶哩彈幕
巨人網(wǎng)絡(luò)部分手機(jī)游戲的服務(wù)端。
今日頭條Nsq:Nsq 是由Go語言開發(fā)的高性能、高可用消息隊列系統(tǒng),性能非常高,每天能處理數(shù)十億條的消息;Packer:用來生成不同平臺的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者 Skynet:分布式調(diào)度框架 Doozer:分布式同步工具,類似ZooKeeper Heka:mazila開源的日志處理系統(tǒng) Cbfs:couchbase開源的分布式文件系統(tǒng) Tsuru:開源的PAAS平臺,和SAE實現(xiàn)的功能一模一樣 Groupcache:memcahe作者寫的用于Google下載系統(tǒng)的緩存系統(tǒng) God:類似redis的緩存系統(tǒng),但是支持分布式和擴(kuò)展性 Gor:網(wǎng)絡(luò)流量抓包和重放工具
還有很多,比如阿里中間件、聚美優(yōu)品、高升控股、探探、斗魚直播、人人車、亞信、Udesk、方付通、招財貓、三一集團(tuán)、美餐網(wǎng)等。一般的選擇,都是選擇用于自己公司合適的產(chǎn)品系統(tǒng)來做,比如消息推送的、監(jiān)控的、容器的等,Golang特別適合做網(wǎng)絡(luò)并發(fā)的服務(wù),這是他的強(qiáng)項,所以也是被優(yōu)先用于這些項目。Go語言作為一門大型項目開發(fā)語言,在很多大公司相繼使用,甚至完全轉(zhuǎn)向Go開發(fā)。
4、寫在最后
當(dāng)然,一個技術(shù)能不能發(fā)展起來,關(guān)鍵還要看三點。
**有沒有一個比較好的社區(qū)。**像 C、C++、Java、Python 和 JavaScript 的生態(tài)圈都是非常豐富和火爆的。尤其是有很多商業(yè)機(jī)構(gòu)參與的社區(qū)那就更為人氣爆棚了,比如 Linux 的社區(qū)。
**有沒有一個工業(yè)化的標(biāo)準(zhǔn)。**像 C、C++、Java 都是有標(biāo)準(zhǔn)化組織的。尤其是 Java,其在架構(gòu)上還搞出了像 J2EE 這樣的企業(yè)級標(biāo)準(zhǔn)。
**有沒有一個或多個殺手級應(yīng)用。**C、C++ 和 Java 的殺手級應(yīng)用不用多說了,就算是對于 PHP 這樣還不能算是一個好的編程語言來說,因為是 Linux 時代的第一個殺手級解決方案 LAMP 中的關(guān)鍵技術(shù),所以,也發(fā)展起來了。
上述的這三點是非常關(guān)鍵的,新的技術(shù)只需要占到其中一到兩點就已經(jīng)很不錯了,何況有的技術(shù),比如 Java,是三點全占到了,所以,Java 的發(fā)展是如此好。當(dāng)然,除了上面這三點重要的,還有一些其它的影響因素,比如:
**學(xué)習(xí)曲線是否低,上手是否快。**這點非常重要,C++ 在這點上越做越不好了。**有沒有一個不錯的提高開發(fā)效率的開發(fā)框架。**如:Java 的 Spring 框架,C++ 的 STL 等。**是否有一個或多個巨型的技術(shù)公司作為后盾。**如:Java 和 Linux 后面的 IBM、Sun……**有沒有解決軟件開發(fā)中的痛點。**如:Java 解決了 C 和 C++ 的內(nèi)存管理問題。
用這些標(biāo)尺來量一下 Go 語言,我們可以清楚地看到:
Go 語言容易上手; Go 語言解決了并發(fā)編程和寫底層應(yīng)用開發(fā)效率的痛點; Go 語言有 Google 這個世界一流的技術(shù)公司在后面; Go 語言的殺手級應(yīng)用是 Docker,而 Docker 的生態(tài)圈在這幾年完全爆棚了。
所以,Go 語言的未來是不可限量的。當(dāng)然,我個人覺得,Go 可能會吞食很多 C、C++、Java 的項目。不過,Go 語言所吞食主要的項目應(yīng)該是中間層的項目,既不是非常底層也不會是業(yè)務(wù)層。
也就是說,Go 語言不會吞食底層到 C 和 C++ 那個級別的,也不會吞食到高層如 Java 業(yè)務(wù)層的項目。Go 語言能吞食的一定是 PaaS 上的項目,比如一些消息緩存中間件、服務(wù)發(fā)現(xiàn)、服務(wù)代理、控制系統(tǒng)、Agent、日志收集等等,沒有復(fù)雜的業(yè)務(wù)場景,也到不了特別底層(如操作系統(tǒng))的中間平臺層的軟件項目或工具。而 C 和 C++ 會被打到更底層,Java 會被打到更上層的業(yè)務(wù)層。
好了,我們再用上面的標(biāo)尺來量一下 Go 語言的殺手級應(yīng)用 Docker,你會發(fā)現(xiàn)基本是一樣的。
Docker 上手很容易。 Docker 解決了運(yùn)維中的環(huán)境問題以及服務(wù)調(diào)度的痛點。 Docker 的生態(tài)圈中有大公司在后面助力。比如 Google。 Docker 產(chǎn)出了工業(yè)界標(biāo)準(zhǔn) OCI。 Docker 的社區(qū)和生態(tài)圈已經(jīng)出現(xiàn)像 Java 和 Linux 那樣的態(tài)勢。……
所以,雖然幾年前的 Docker ,當(dāng)時的坑兒還很多,但是,相對于這些大的因素來說,那些小坑兒都不是問題。只是需要一些時間,這些小坑兒在未來 5-10 年就可以完全被填平了。

同樣,我們可以看到 Kubernetes 作為服務(wù)和容器調(diào)度的關(guān)鍵技術(shù)一定會是最后的贏家。
最后,我還要說一下,為什么要早一點地進(jìn)入這些新技術(shù),而不是等待這些技術(shù)成熟了后再進(jìn)入。原因有這么幾個。
技術(shù)的發(fā)展過程非常重要。因為你可以清楚地看到了這種新技術(shù)的生態(tài)圈發(fā)展過程。讓我們收獲最大的并不是這些技術(shù)本身,而是一個技術(shù)的變遷和行業(yè)的發(fā)展。
從中,我們看到了非常具體的各種思潮和思路,這些東西比起 技術(shù)本身來說更有價值。因為,這不但讓我們重新思考已經(jīng)掌握的技術(shù)以及如何更好地解決已有的問題,而且還讓我看到了未來。不但有了技術(shù)優(yōu)勢,而且這些知識還讓我們的技術(shù)生涯多了很多的可能性。
這些關(guān)鍵新技術(shù),可以讓你拿到技術(shù)的先機(jī)。這些對一個需要技術(shù)領(lǐng)導(dǎo)力的個人或公司來說都是非常重要的。
一個公司或是個人能夠占有技術(shù)先機(jī),就會比其它公司或個人有更大的影響力。一旦未來行業(yè)需求引爆,那么這個公司或是個人的影響力就會形成一個比較大的護(hù)城河,并可以快速地產(chǎn)生經(jīng)濟(jì)利益。
Go的應(yīng)用范圍一直在擴(kuò)大,云計算,微服務(wù),區(qū)塊鏈,哪里都有用Go寫的重量級項目。docker/kubernetes生態(tài)圈,幾百/千萬行代碼,基本統(tǒng)治了云原生應(yīng)用市場。去年大熱的區(qū)塊鏈,以太坊的geth,比特幣的btcd,閃電網(wǎng)絡(luò)的lnd,都是Go語言開發(fā)。還是那句話,多看看各種語言的生態(tài),或許都并沒有你想象的那么不堪。。。Go語言設(shè)計上確實不夠“先進(jìn)”,但也是另一種“務(wù)實”。其實go不管在國內(nèi)還是國外已經(jīng)很受待見了,國外google用的很多,uber也在用,國內(nèi)有著名的今日頭條,每日千億級的訪問妥妥的。多少語言終其一生都沒有這么大的應(yīng)用場景。
END
往期推薦
若覺得文章對你有幫助,隨手轉(zhuǎn)發(fā)分享,也是我們繼續(xù)更新的動力。
長按二維碼,掃掃關(guān)注哦
?「C語言中文網(wǎng)」官方公眾號,關(guān)注手機(jī)閱讀教程??

點擊“閱讀原文”,領(lǐng)取 2020 年最新免費(fèi)技術(shù)資料大全




