golang devops項目實戰 - 爲何選擇go語言

先來聊聊go有趣的歷史

在google中,大部分的項目都是採用C C++開發,少許地用了java,其次 纔是python;在2007年的某一天,google的首席工程師在編譯一個C++項目 過程當中,儘管在google早就實現了分佈式編譯系統,可是Rob Pike和Robert Griesemer實在受夠了那個漫長的編譯等待時間,因而突發靈感與坐在旁邊的 Ken Thompson一塊兒討論實在有必要發明一個新的編程語言,這個編程語言必 須有近乎C語言的執行效率和近乎解析型語言的開發效率,以及近乎完美的編譯 速度,因而他們取名這個語言爲go語言,就如每個go語言的使用者都成爲 gopher,gopher是一種生活在加拿大的小動物,它的中文名叫作囊地鼠,這 種動物有個特色就是生活在底下,哈哈,固然這個不是最關鍵的,他們最大的 特色就是挖洞速度特別快,固然可能不止是挖洞啦,取名爲go意爲語言的運行 速度、開發速度、學習速度(develop)都像gopher同樣快。html

 

 

被稱爲GO語言之父的Rob Pike說,你是否贊成GO語言,取決於你是承認 少就是多,仍是少就是少(Less is more or less is less)。Rob Pike以一種很是 樸素的方式,歸納了GO語言的整個設計哲學--將簡單、實用體現得淋漓盡致。java

不少人將GO語言稱爲21世紀的C語言,由於GO不只擁有C的簡潔和性 能,並且還很好的提供了21世紀互聯網環境下服務端開發的各類實用特性,讓 開發者在語言級別就能夠方便的獲得本身想要的東西。python

強大的研發團隊

go的應用c++

使用go語言開發的開源項目比較著名的主要有:git

Docker,火熱的容器化技術; Kubernetes,Goole Borg的開源實現; Etcd,相似zookeeper的高可用key-value存儲; TIDB,國人開發的Google spanner的開源實現;程序員

許多大廠都已經擁抱 Go 語言,包括以 Java 打天下的阿里巴巴,更別提深 愛着 Go 語言的滴滴、今日頭條、小米、奇虎 360、京東等明星公司。同時, 創業公司也很喜歡 Go 語言,主要由於其入門快、程序庫多、運行迅速,很適 合快速構建互聯網軟件產品,好比輕鬆籌、快手、知乎、探探、美圖、獵豹移 動等等,更好比前不久泄漏的B站後端源碼都是採用go語言開發。github

從業務維度看,在雲計算、微服務、大數據、區塊鏈、物聯網等領域,Go 語言早已蓬勃發展。有的使用率已經很是之高,有的已有一席之地。即便是在 Python 爲王的數據科學和人工智能領域,Go 語言也在緩慢滲透,並初露頭 角。golang

go的特性web

  • 併發與協程
  • 基於消息傳遞的通訊方式
  • 豐富實用的內置數據類型
  • 函數多返回值
  • defer機制
  • 反射(reflect)
  • 高性能HTTP Server
  • 工程管理
  • 編程規範

爲何要選擇go語言

你爲何選擇這門語言去開發,關於這個話題,永遠是爭議最大的,好比 程序員鄙視鏈,可是我在開講go語言以前仍是要來趟這個渾水,若是有失偏頗 的話,還請海涵。首先存在即合理,那麼多的計算機語言存在,都會有其時代 背景和對軟件工程中某些特殊問題的解決,不能一棍子敲死,好比C/C++牛 逼,那爲何java的應用範圍很是廣,java程序員的數量多過C/C++,java看 起來被這麼多人如此使用,那爲何如今愈來愈多的企業轉向用go語言開 發?!redis

從如下三個方面來闡述下:

首先,對於架構師來說,他應該是精通的領域較廣,對技術瞭解比較深 刻,那麼python、java、c、c++、lua、go比較瞭解,根據業務場景去選擇開 發語言,好比網易雲風,在架構網易遊戲的時候就大量低使用了lua語言,由於 lua動態解釋的,簡潔小而美,方便作熱更新,方便做爲實現業務邏輯的,是 c、c++各模塊之間的粘合劑,好比web開發;java有不少成熟的庫,開發效率 比較高;好比音視頻相關的開發,用C和C++,由於不少圖像處理、編解碼、 音效處理大多采用了C/C++開發,你再用java開發就是不三不四的。

其次,對於軟件工程來說,注重研發效率和合理適度的架構設計,在這方 便,C和C++對於移動互聯網和物聯網後臺服務以及基礎架構設計來說,由於 可以直接操做內存,好比內存溢出、棧溢出、內存泄漏、野指針操做等會致使 應用程序直接崩潰,而更加的是這些問題可能隱藏比較深,定位BUG和解決的 成本較大,因此對開發人員的技能要求比較高,那麼若是在一個團隊內沒有嚴 格的管理,用C和C++開發的工程代碼極難維護。如今不少的後臺應用使用java 語言開發,可是java的框架和組件很是多,這十分容易引發過分化設計。

再者,對於企業和行業現狀來說,不少的企業都面臨高併發和大數據的請 求,對於併發或者並行開發,python就免談了,壓根不合適,可是對於java語 言或者C/C++語言來說,若是採用多進程和多線程的方式,採用這種方式時, 不少時候咱們採用鎖的機制解決問題,可是採用鎖帶來的成本是很大的(可見 http://47.106.79.26:4000/2018/11/28/kernel_mutex/ 對mutex的分析), 採用多線程最著名的《併發危險:解決多線程代碼中的 11 個常見的問題》( https://blog.csdn.net/mergerly/article/details/39028861)。那麼在業界內 咱們採用的比較多的是lock-free的方案,好比自旋鎖和原子操做等,例如 Disruptor。幾年前我接觸了ZeroMQ的設計,從ZeroMQ的主要貢獻者Pieter Hintjens裏瞭解到最好的併發方式,是不共享任何資源,若是真要共享資源則 能夠設計爲線程通訊的方式去解決。那麼咱們也看到go語言裏實現的協程,以 及協程間用channel去通訊的設計。

論述完以上三點,那go語言又有哪些優點呢?

性能:go語言是一門靜態語言,編譯成機器字節碼,java雖然有JVM,但 是java也有JIT,能夠生成字節碼去執行。C和C++也是靜態語言,直接編 譯生成機器字節碼,因此go在語言層面的性能是接近C和C++的。關於語 言性能的比較咱們能夠從 https://benchmarksgame- http://team.pages.debian.net/benchmarksgame/fastest/go.html略窺一 二。可是在應用一門語言時,語言的性能僅僅是一個方面,還跟其它方面 有關係:好比跟寫代碼的人的水平和方式有關( Will your toy benchmark program be faster if you write it in a different programming language? It depends how you write it!);其二在內存管理和IO操做上,這個就不 是語言層面可以控制的了,好比C/C++可以本身實現內存的管理,好比內 存池的技術,因此對於後臺服務的應用程序須要海量請求時,能夠從內存

池的技術上去優化性能,相對來講go語言和其它高級語言沒有指針的這個 操做,因此在這方面仍是不如C/C++的;其三,應用程序的性能也符合 28原則,咱們更應當將注意力集中在頻繁被執行的代碼上。

go還提供了一些性能分析工具(好比pprof),經過這些工具能夠分 析程序CPU使用、內部使用,查看協程棧、GC日誌和Trace信息。 語言技術棧:首先,go語言裏內置了不少的package,從其官網( https://golang.org/pkg/)能夠查看到,基於這些package能夠足夠開 發出你的應用了,因此go語言是比較反對框架的;可是你也能夠引入第三 方的package,如首先執行: go

get http://github.com/garyburd/redigo/redis,而後import這個package, 就可使用這個package了,如今不少組件都提供了go語言版本的接口, 也有不少第三方的框架,好比web服務的beego、buffalo、echo、gin、 iris和revel,好比微服務的很是著名而且性能彪悍的grpc,分佈式文件系 統的go-fastdfs,對於不少的其它方面的應用都有go語言的接口實現。 開發效率:

編譯效率高,go語言的設計的初衷之一就是解決C/C++混亂的頭文 件依賴機制所致使的編譯時間過長問題,在GO語言中,有一套標準 的工程管理規範,只要按照這個規範進行項目開發,以後的事情 (好比包管理、編譯等等)都將變得很是的簡單。在GO項目下,存 在兩個關鍵目錄,一個是src目錄,用於存放全部的.go源碼文件; 一個是bin目錄,用於存在編譯後的二進制文件。在src目錄下,除 了main主包所在的目錄外,其它全部的目錄名稱與直接目錄下所對 應的包名保持對應,不然編譯沒法經過。這樣,GO編譯器就能夠從 main包所在的目錄開始,徹底使用目錄結構和包名來推導工程結構 以及構建順序,避免像C++同樣,引入一個額外的Makefile文件。 在GO的編譯過程當中,咱們惟一要作的就是將GO項目路徑賦值給一 個叫GOPATH的環境變量,讓編譯器知道將要編譯的GO項目所在的 位置。而後進入bin目錄下,執行go build {主包所在的目錄名},即 可秒級完成工程編譯。

一處編譯處處運行, Go編譯生成的是一個靜態可執行文件,除了 glibc 外沒有其餘外部依賴。(夠浪) 學習成本:go語言的設計者,一開始就遵照少就是多的原則,因此 go語言沒有太多的特性,不像C同樣須要控制內存,也不像 C++11/14/17/20同樣引入了特別多的語法特性,go的代碼比較簡 單,學習的成本比較低。除此以外咱們能夠從官網和社區獲取到很 多的幫助。

Golang官網

Golang官方地址: http://golang.org,不管學習什麼知識,第一手資料 基本都是首發於官網。進入到官網後,會看到不少資源,好比:

文檔:http://golang.org/doc,官方文檔,仔細讀下文檔首頁並分 類,瞭解下本身要學哪些內容; 一覽:http://tour.golang.org,交互式運行環境,不安裝golang便 可體驗學習它的語法與使用; 指南:http://golang.org/ref/spec,golang學習指導手冊,從基礎 語法到高級特性所有都有介紹;

標準庫:http://golang.org/pkg/,能夠查看全部的官方庫的接口、 源碼以及使用介紹; 博客:http://blog.golang.org,不按期分享go的最佳實踐,有些公 司也會投稿介紹本身的案例; 實驗室:http://play.golang.org,感受和tour相似,不過在這裏編 寫的代碼能夠分享給別人;

官網是個寶庫,咱們須要認真仔細去挖掘其中的內容;但因爲一 些緣由,golang的官方站點咱們沒法訪問,不過golang爲咱們提供了中國的官 網,地址: https://go-zh.org;

golang社區

一門語言的發展須要有大批牛人的分享佈道,也須要咱們這些菜鳥學習有更多 的參考路徑。這一切都離不開社區。國內外也有不少優秀的go語言社區。

https://www.bilibili.com/video/av57709660

相關文章
相關標籤/搜索