Go程式設計實踐
女主宣言
應用程式設計課最後一節,本節課李鋼老師分享了很多他在Go語言開發中使用到的工具和一些實踐經驗以及心得體會,下面就讓我們來一起感受學習這篇收官之作吧!
PS:豐富的一線技術、多元化的表現形式,盡在“HULK一線技術雜談”,點關注哦!
The International Space Station, Oct. 4, 2018
by NASA IOTD
今天我給大家介紹下我使用Go語言做過的一些程式設計實踐。
1 golog
專案地址:
無論我們做什麼開發,log 都是個強需求,所以先給大家介紹下我開發的 golog.
首先看下里面最重要的幾個資料結構間的關係:
writer
對底層寫操作的封裝,寫的物件可以是檔案、佇列、ES等,當前提供如下writer實現:
FileWriter寫檔案
FileWithSplitWriter寫檔案,可自動按照天、小時為單位分檔案寫入
ConsoleWriter寫終端
buffer
對寫操作加buffer提升寫效能,實現時有如下要點:
實現為writer的裝飾者
提供單獨的goroutine做autoflush
formater
formater是將要記錄的log內容發往writer之前做一次格式化,例如新增統一的log日期、終端輸出新增顏色等,當前有如下實現:
simpleFormater在訊息前面加上loglevel和時間
webFormater在simpleFormater的基礎上新增clientIp和logId
consoleFormater為終端輸出新增顏色
logger
這個是程式中記錄log要使用到的物件,當前提供了simpleLogger這個實現,是一種同步的方式(寫操作阻塞程式執行)
async
將寫入操作放到單獨的goroutine中從而提升程式效能,實現要點如下:
asyncLogger實現為對logger的裝飾者
提供單獨的goroutine做寫操作
更詳細的使用,可以參考:
2 shardmap
專案地址:
go中的原生map在多個goroutine同時讀寫時是需要加鎖的,為了提升效能,核心思想是減少鎖粒度,shardmap就是這樣開發的:
go1.8之後的官方包中提供了sync.Map用於解決map的併發讀寫問題,但我自己測試沒有shardmap效能好,讀者有興趣可以自己試下。
更詳細的使用,可以參考:
3 redis
專案地址:
redis可用的包很多,我自己實現的這個包,底層driver部分使用了redigo,考慮到實際的生產環境使用,我自行實現瞭如下機制:
懶載入機制,即只有真正和redis做互動時才建立網路連線
操作失敗自動重連機制
提供連線池以提高效能
pipeling封裝
事物封裝
更詳細的使用,可以參考:
4 goconsumer
專案地址:
對非同步佇列的使用目前在開發中也是必不可少的,這裡提供了一個消費處理框架,目前支援:
訊息非順序消費
訊息順序消費
整體處理框架如圖:
裡面的物件關係如下:
consumer
從各種佇列中做消費的物件,例如kafka、nsq等
dispatcher
分配訊息到worker中處理,可以在這裡實現自己的分配演算法達到順序消費的目的,當前提供下面兩種實現:
simpleDispatcher,這個做訊息的隨機分發,無需順序的消費均可以使用
specifyDispatcher,自己指定訊息的分發方法,需要順序消費等特殊消費需求可以使用
worker
訊息處理物件,幹實際業務工作的。
task
啟動一個消費任務框架,執行的入口,我在task_test.go中有個demo實現,可供大家參考。
5 gobox-demo
專案地址:
gobox-demo 是我開發的一個通用的模版專案,基於這個專案我有一些使用Go語言做專案開發的心得想要介紹給大家。
controller 和 action 的組織
我見過的大多數專案,都喜歡把controlelr和action放到一個程式碼檔案中,專案功能越多,檔案就越長。
實際中這樣做會給開發和維護帶來很大的不利,所以我把他們拆開,每個action作為一個程式碼檔案,這樣很清晰:
6 其他
以上都是我在開發過程中最常用到的一些工具,我的原則向來是追求精簡,團隊沒用到的功能就不新增。
另外,一些涉及到公司內部的程式碼,例如上線操作無法放到這裡展示,但都是會有單獨的目錄去組織這些。
總之一句話,我力求做到專案組織合理,命名清晰,層次分明,希望讓大家從專案的組織結構上就能判斷出哪部分功能放在哪裡,任何會讓人有歧義的地方都要改善。
結束語
應用程式設計課已經全部講完了,希望我的經驗對大家有幫助,有認識不當的地方還請指正,謝謝大家!
HULK一線技術雜談
由360雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算、資料庫、大資料、監控、泛前端、自動化測試等眾多技術領域,透過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2220349/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- go 程式設計師的最佳實踐Go程式設計師
- GO語言泛型程式設計實踐Go泛型程式設計
- 高效前端程式設計實踐前端程式設計
- 【Go 程式設計實踐】從零到一:建立、測試併發布自己的 Go 庫Go程式設計
- framebuffer應用程式設計實踐程式設計
- Java併發程式設計實踐Java程式設計
- Golang 併發程式設計實踐Golang程式設計
- hadoop程式設計實踐(一)Hadoop程式設計
- JS程式設計實踐指導JS程式設計
- 非同步程式設計最佳實踐非同步程式設計
- jQuery程式設計的最佳實踐jQuery程式設計
- C 程式設計最佳實踐(轉)程式設計
- Bash 優良程式設計實踐程式設計
- Android混合程式設計:WebView實踐Android程式設計WebView
- PHP安全程式設計最佳實踐PHP程式設計
- 高效能JavaScript 程式設計實踐JavaScript程式設計
- 深入實踐c++模板程式設計C++程式設計
- C++程式設計最佳實踐(轉)C++程式設計
- 【go網路程式設計】-HTTP程式設計Go程式設計HTTP
- go程式設計題Go程式設計
- 詞頻統計任務程式設計實踐程式設計
- 實驗 2 Scala 程式設計初級實踐程式設計
- 六、GO 程式設計模式:GO GENERATIONGo程式設計設計模式
- 十、GO程式設計模式 : 泛型程式設計Go程式設計設計模式泛型
- 函數語言程式設計最佳實踐函數程式設計
- 如何培養良好的程式設計實踐程式設計
- Laravel最佳實踐–事件驅動程式設計Laravel事件程式設計
- Java併發程式設計實踐-this溢位Java程式設計
- JAVA併發程式設計實踐 下載Java程式設計
- Laravel 最佳實踐 -- 事件驅動程式設計Laravel事件程式設計
- 程式設計實踐(Pandas)綜合練習1程式設計
- Laravel最佳實踐 -- 事件驅動程式設計Laravel事件程式設計
- C++非同步程式設計最佳實踐C++非同步程式設計
- Python程式設計規範+最佳實踐Python程式設計
- Go物件導向程式設計OOP的實現Go物件程式設計OOP
- Go程式設計基礎Go程式設計
- Go 併發程式設計Go程式設計
- Java併發程式設計 - 第十一章 Java併發程式設計實踐Java程式設計