1. 程式人生 > >golang devops專案實戰

golang devops專案實戰

先來聊聊go有趣的歷史

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

 

 

被稱為GO語言之父的Rob Pike說,你是否同意GO語言,取決於你是認可 少就是多,還是少就是少(Less is more or less is less)。Rob Pike以一種非常 樸素的方式,概括了GO語言的整個設計哲學--將簡單、實用體現得淋漓盡致。

很多人將GO語言稱為21世紀的C語言,因為GO不僅擁有C的簡潔和性 能,而且還很好的提供了21世紀網際網路環境下服務端開發的各種實用特性,讓 開發者在語言級別就可以方便的得到自己想要的東西。

強大的研發團隊

go的應用

使用go語言開發的開源專案比較著名的主要有:

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

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

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

go的特性

  • 併發與協程
  • 基於訊息傳遞的通訊方式
  • 豐富實用的內建資料型別
  • 函式多返回值
  • defer機制
  • 反射(reflect)
  • 高效能HTTP Server
  • 工程管理
  • 程式設計規範

為什麼要選擇go語言

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

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

首先,對於架構師來講,他應該是精通的領域較廣,對技術瞭解比較深 刻,那麼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