一、我們為什麼選擇Go語言
選擇Go語言的原因可能會有很多,關於Go語言的特性、優勢等,我們在之前的文件中也已經介紹了很多了。但是最主要的原因,應該是基於以下兩方面的考慮:
執行效能
縮短API的響應時長,解決批量請求訪問超時的問題。在Uwork的業務場景下,一次API批量請求,往往會涉及對另外介面服務的多次呼叫,而在之前的PHP實現模式下,要做到並行呼叫是非常困難的,序列處理卻不能從根本上提高處理效能。而GO語言不一樣,通過協程可以方便的實現API的並行處理,達到處理效率的最大化。 依賴Golang的高效能HTTP Server,提升系統吞吐能力,由PHP的數百級別提升到數千裡甚至過萬級別。
開發效率
GO語言使用起來簡單、程式碼描述效率高、編碼規範統一、上手快。 通過少量的程式碼,即可實現框架的標準化,並以統一的規範快速構建API業務邏輯。 能快速的構建各種通用元件和公共類庫,進一步提升開發效率,實現特定場景下的功能量產。
二、Go語言能做什麼
Go 語言從釋出 1.0 版本以來備受眾多開發者關注並得到廣泛使用,Go 語言的簡單、高效、併發特性吸引了眾多傳統語言開發者的加入,而且人數越來越多。
鑑於Go語言的特點和設計的初衷,Go語言作為伺服器程式語言,很適合處理日誌、資料打包、虛擬機器處理、檔案系統、分散式系統、資料庫代理等;網路程式設計方面,Go語言廣泛應用於Web 應用、API應用、下載應用等;除此之外,Go語言還適用於記憶體資料庫和雲平臺領域,目前國外很多雲平臺都是採用Go開發。
伺服器程式設計,以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日誌、資料打包、虛擬機器處理、檔案系統等。
分散式系統、資料庫代理器、中介軟體等,例如Etcd。
網路程式設計,這一塊目前應用最廣,包括Web應用、API應用、下載應用,而且Go內建的net/http包基本上把我們平常用到的網路功能都實現了。
資料庫操作
開發雲平臺,目前國外很多雲平臺在採用Go開發
三、國內外有哪些企業或專案使用Go語言
Go釋出之後,很多公司特別是雲端計算公司開始用Go重構他們的基礎架構,很多都是直接採用Go進行了開發,最近熱火朝天的Docker就是採用Go開發的。
使用 Go 語言開發的開源專案非常多。早期的 Go 語言開源專案只是通過 Go 語言與傳統專案進行C語言庫繫結實現,例如 Qt、Sqlite 等;後期的很多專案都使用 Go 語言進行重新原生實現,這個過程相對於其他語言要簡單一些,這也促成了大量使用 Go 語言原生開發專案的出現。
雲端計算基礎設施領域
代表專案:docker、kubernetes、etcd、consul、cloudflare CDN、七牛雲端儲存等。
基礎軟體
代表專案:tidb、influxdb、cockroachdb等。
微服務
網際網路基礎設施
代表專案:以太坊、hyperledger等。
採用Go的一些國外公司,如Google、Docker、Apple、Cloud Foundry、CloudFlare、Couchbase、CoreOS、Dropbox、MongoDB、AWS等公司;
採用Go開發的國內企業:如阿里雲CDN、百度、小米、七牛、PingCAP、華為、金山軟體、獵豹移動、餓了麼等公司。
Docker
Docker 是一種作業系統層面的虛擬化技術,可以在作業系統和應用程式之間進行隔離,也可以稱之為容器。Docker 可以在一臺物理伺服器上快速執行一個或多個例項。基於lxc的一個虛擬打包工具,能夠實現PAAS平臺的組建。例如,啟動一個 CentOS 作業系統,並在其內部命令列執行指令後結束,整個過程就像自己在作業系統一樣高效。
專案連結:
go語言
Go 語言自己的早期原始碼使用C語言和組合語言寫成。從 Go 1.5 版本後,完全使用 Go 語言自身進行編寫。Go 語言的原始碼對了解 Go 語言的底層排程有極大的參考意義,建議希望對 Go 語言有深入瞭解的讀者讀一讀。
專案連結:
Kubernetes
Google 公司開發的構建於 Docker 之上的容器排程服務,使用者可以通過 Kubernetes 叢集進行雲端容器叢集管理。
專案連結:
etcd
一款分散式、可靠的 KV 儲存系統,可以快速進行雲配置。
專案連結:
beego
beego 是一個類似 Python的 Tornado 框架,採用了 RESTFul 的設計思路,使用 Go 語言編寫的一個極輕量級、高可伸縮性和高效能的 Web 應用框架。
專案連結:
martini
一款快速構建模組化的 Web 應用的 Web 框架。
專案連結:
codis
國產的優秀分散式 Redis 解決方案。
專案連結:
delve
Go語言
強大的偵錯程式,被很多整合環境和編輯器整合。
專案連結:
Facebook也在用,為此他們還專門在Github上建立了一個開源組織facebookgo,大家可以通過github.com/facebookgo訪問檢視facebook開源的專案,比如著名的是平滑升級的grace。
Uber
騰訊
騰訊作為國內的大公司,還是敢於嘗試的,尤其是Docker容器化這一塊,他們在15年已經做了docker萬臺規模的實踐,具體可以參考www.infoq.com/cn/articles… 。
百度
目前所知的百度的使用是在運維這邊,是百度運維的一個BFE專案,負責前端流量的接入。他們的負責人在2016年有分享,大家可以看下這個 www.infoq.com/cn/presenta… 。
其次就是百度的訊息系統。負責公司手百訊息通訊系統伺服器端開發及維護。
京東
京東雲訊息推送系統、雲端儲存,以及京東商城等都有使用Go做開發。
小米
小米對Golang的支援,莫過於運維監控系統的開源,也就是 open-falcon.com/ 。
此外,小米互娛、小米商城、小米視訊、小米生態鏈等團隊都在使用Golang。
360
360對Golang的使用也不少,一個是開源的日誌搜尋系統Poseidon,託管在Github上,github.com/Qihoo360/po….
還有360的推送團隊也在使用,他們還寫了篇博文在Golang的官方部落格上 blog.golang.org/qihoo。
七牛雲
七牛雲用了近50萬行程式碼,來實現整個產品。七牛雲端儲存產品網址:qiniu.com/。上線時間:2011-9-1。應用範圍:整個產品(包括基礎服務、Web端、統計平臺、各類小工具等等)Go程式碼行數佔比:99.9%日 PV:保密
美團
美團後臺流量支撐程式。應用範圍:支撐主站後臺流量(排序,推薦,搜尋等),提供負載均衡,cache,容錯,按條件分流,統計執行指標(qps,latency)等功能。
滴滴
基礎服務平臺。
###金山微看
應用範圍:服務介面,後臺流程服務,訊息系統,圖片系統
搜狗
搜狗推送系統。Push系統中用於維持與客戶端連線的部分。
QOR - 模組化的電商系統
github地址: qor/qor · GitHub
應用範圍: 整個產品
weico
產品名:weico 3.0, 服務端所有程式碼都是用Go實現。
仙俠道
產品網址:仙俠道官網 - 心動遊戲
應用範圍: 遊戲服務端(通訊、邏輯、資料儲存)
快玩遊戲
應用範圍:實時訊息系統、使用者認證、使用者會話、統一統計介面
盛大雲CDN
網址:盛大雲端計算
應用範圍:CDN的排程系統、分發系統、監控系統、短域名服務,CDN內部開放平臺、運營報表系統以及其他一些小工具等
Bmob移動後端雲服務平臺
產品網址:Bmob移動後端雲服務平臺
應用範圍:Restful API(使用Beego)、統計分析平臺、常用服務如發郵件、佇列非同步處理、統計使用者空間和介面請求
群策
應用範圍:全系統
BiddingX DSP廣告投放系統
網址:BiddingX_專業的DSP解決方案供應商
應用範圍:競價投放、曝光統計、點選跳轉
街坊四鄰
網址:首頁 - 街坊四鄰
應用範圍:後臺服務
Leanote
網址:Leanote
Bearychat
網址:BearyChat
宅豆
網址:宅豆網 - 自築最美家,宅豆隨你搭
白板- 設計圖討論工具
網址:白板
實驗樓
網址:實驗樓 - 第一家以實驗為核心的IT線上教育平臺
新浪微博
中介軟體和彈性排程用 Java 和 Go 編寫,微博視訊轉碼及儲存服務用 Go 編寫。
愛奇藝
VR 後臺系統中介軟體,VR 端的 HTTP 介面。
獵豹移動
訊息推送
網易
網易蜂巢容器公有云。
嗶哩嗶哩
彈幕
巨人網路
部分手機遊戲的服務端。
今日頭條
Nsq:Nsq 是由Go語言開發的高效能、高可用訊息佇列系統,效能非常高,每天能處理數十億條的訊息;
Packer:用來生成不同平臺的映象檔案,例如VM、vbox、AWS等,作者是vagrant的作者
Skynet:分散式排程框架
Doozer:分散式同步工具,類似ZooKeeper
Heka:mazila開源的日誌處理系統
Cbfs:couchbase開源的分散式檔案系統
Tsuru:開源的PAAS平臺,和SAE實現的功能一模一樣
Groupcache:memcahe作者寫的用於Google下載系統的快取系統
God:類似redis的快取系統,但是支援分散式和擴充套件性
Gor:網路流量抓包和重放工具
還有很多,比如阿里中介軟體、聚美優品、高升控股、探探、鬥魚直播、人人車、亞信、Udesk、方付通、招財貓、三一集團、美餐網等。一般的選擇,都是選擇用於自己公司合適的產品系統來做,比如訊息推送的、監控的、容器的等,Golang特別適合做網路併發的服務,這是他的強項,所以也是被優先用於這些專案。Go語言作為一門大型專案開發語言,在很多大公司相繼使用,甚至完全轉向Go開發。
四、寫在最後
當然,一個技術能不能發展起來,關鍵還要看三點。
有沒有一個比較好的社群。像 C、C++、Java、Python 和 JavaScript 的生態圈都是非常豐富和火爆的。尤其是有很多商業機構參與的社群那就更為人氣爆棚了,比如 Linux 的社群。
有沒有一個工業化的標準。像 C、C++、Java 都是有標準化組織的。尤其是 Java,其在架構上還搞出了像 J2EE 這樣的企業級標準。
有沒有一個或多個殺手級應用。C、C++ 和 Java 的殺手級應用不用多說了,就算是對於 PHP 這樣還不能算是一個好的程式語言來說,因為是 Linux 時代的第一個殺手級解決方案 LAMP 中的關鍵技術,所以,也發展起來了。
上述的這三點是非常關鍵的,新的技術只需要佔到其中一到兩點就已經很不錯了,何況有的技術,比如 Java,是三點全佔到了,所以,Java 的發展是如此好。當然,除了上面這三點重要的,還有一些其它的影響因素,比如:
學習曲線是否低,上手是否快。這點非常重要,C++ 在這點上越做越不好了。
有沒有一個不錯的提高開發效率的開發框架。如:Java 的 Spring 框架,C++ 的 STL 等。
是否有一個或多個巨型的技術公司作為後盾。如:Java 和 Linux 後面的 IBM、Sun……
有沒有解決軟體開發中的痛點。如:Java 解決了 C 和 C++ 的記憶體管理問題。
用這些標尺來量一下 Go 語言,我們可以清楚地看到:
Go 語言容易上手;
Go 語言解決了併發程式設計和寫底層應用開發效率的痛點;
Go 語言有 Google 這個世界一流的技術公司在後面;
Go 語言的殺手級應用是 Docker,而 Docker 的生態圈在這幾年完全爆棚了。
所以,Go 語言的未來是不可限量的。當然,我個人覺得,Go 可能會吞食很多 C、C++、Java 的專案。不過,Go 語言所吞食主要的專案應該是中間層的專案,既不是非常底層也不會是業務層。
也就是說,Go 語言不會吞食底層到 C 和 C++ 那個級別的,也不會吞食到高層如 Java 業務層的專案。Go 語言能吞食的一定是 PaaS 上的專案,比如一些訊息快取中介軟體、服務發現、服務代理、控制系統、Agent、日誌收集等等,沒有複雜的業務場景,也到不了特別底層(如作業系統)的中間平臺層的軟體專案或工具。而 C 和 C++ 會被打到更底層,Java 會被打到更上層的業務層。
好了,我們再用上面的標尺來量一下 Go 語言的殺手級應用 Docker,你會發現基本是一樣的。
Docker 上手很容易。
Docker 解決了運維中的環境問題以及服務排程的痛點。
Docker 的生態圈中有大公司在後面助力。比如 Google。
Docker 產出了工業界標準 OCI。
Docker 的社群和生態圈已經出現像 Java 和 Linux 那樣的態勢。
……
所以,雖然幾年前的 Docker ,當時的坑兒還很多,但是,相對於這些大的因素來說,那些小坑兒都不是問題。只是需要一些時間,這些小坑兒在未來 5-10 年就可以完全被填平了。
同樣,我們可以看到 Kubernetes 作為服務和容器排程的關鍵技術一定會是最後的贏家。
最後,我還要說一下,為什麼要早一點地進入這些新技術,而不是等待這些技術成熟了後再進入。原因有這麼幾個。
技術的發展過程非常重要。因為你可以清楚地看到了這種新技術的生態圈發展過程。讓我們收穫最大的並不是這些技術本身,而是一個技術的變遷和行業的發展。
從中,我們看到了非常具體的各種思潮和思路,這些東西比起 技術本身來說更有價值。因為,這不但讓我們重新思考已經掌握的技術以及如何更好地解決已有的問題,而且還讓我看到了未來。不但有了技術優勢,而且這些知識還讓我們的技術生涯多了很多的可能性。
這些關鍵新技術,可以讓你拿到技術的先機。這些對一個需要技術領導力的個人或公司來說都是非常重要的。
一個公司或是個人能夠佔有技術先機,就會比其它公司或個人有更大的影響力。一旦未來行業需求引爆,那麼這個公司或是個人的影響力就會形成一個比較大的護城河,並可以快速地產生經濟利益。
Go的應用範圍一直在擴大,雲端計算,微服務,區塊鏈,哪裡都有用Go寫的重量級專案。docker/kubernetes生態圈,幾百/千萬行程式碼,基本統治了雲原生應用市場。去年大熱的區塊鏈,以太坊的geth,比特幣的btcd,閃電網路的lnd,都是Go語言開發。還是那句話,多看看各種語言的生態,或許都並沒有你想象的那麼不堪。。。Go語言設計上確實不夠“先進”,但也是另一種“務實”。其實go不管在國內還是國外已經很受待見了,國外google用的很多,uber也在用,國內有著名的今日頭條,每日千億級的訪問妥妥的。多少語言終其一生都沒有這麼大的應用場景。