Go程式設計實踐

HULK一線技術雜談發表於2018-11-16

女主宣言

應用程式設計課最後一節,本節課李鋼老師分享了很多他在Go語言開發中使用到的工具和一些實踐經驗以及心得體會,下面就讓我們來一起感受學習這篇收官之作吧!

PS:豐富的一線技術、多元化的表現形式,盡在“HULK一線技術雜談”,點關注哦!

Go程式設計實踐

The International Space Station, Oct. 4, 2018

by NASA IOTD


今天我給大家介紹下我使用Go語言做過的一些程式設計實踐。

1   golog

專案地址:

無論我們做什麼開發,log 都是個強需求,所以先給大家介紹下我開發的 golog.

首先看下里面最重要的幾個資料結構間的關係:

Go程式設計實踐
  • writer

對底層寫操作的封裝,寫的物件可以是檔案、佇列、ES等,當前提供如下writer實現:

  1. FileWriter寫檔案

  2. FileWithSplitWriter寫檔案,可自動按照天、小時為單位分檔案寫入

  3. ConsoleWriter寫終端

  4. buffer

對寫操作加buffer提升寫效能,實現時有如下要點:

  1. 實現為writer的裝飾者

  2. 提供單獨的goroutine做autoflush

  3. formater

formater是將要記錄的log內容發往writer之前做一次格式化,例如新增統一的log日期、終端輸出新增顏色等,當前有如下實現:

  1. simpleFormater在訊息前面加上loglevel和時間

  2. webFormater在simpleFormater的基礎上新增clientIp和logId

  3. consoleFormater為終端輸出新增顏色

  4. logger

這個是程式中記錄log要使用到的物件,當前提供了simpleLogger這個實現,是一種同步的方式(寫操作阻塞程式執行)

  • async

將寫入操作放到單獨的goroutine中從而提升程式效能,實現要點如下:

  1. asyncLogger實現為對logger的裝飾者

  2. 提供單獨的goroutine做寫操作

更詳細的使用,可以參考:

2    shardmap

專案地址:

go中的原生map在多個goroutine同時讀寫時是需要加鎖的,為了提升效能,核心思想是減少鎖粒度,shardmap就是這樣開發的:

Go程式設計實踐

go1.8之後的官方包中提供了sync.Map用於解決map的併發讀寫問題,但我自己測試沒有shardmap效能好,讀者有興趣可以自己試下。


更詳細的使用,可以參考:

3    redis

專案地址:

redis可用的包很多,我自己實現的這個包,底層driver部分使用了redigo,考慮到實際的生產環境使用,我自行實現瞭如下機制:

  1. 懶載入機制,即只有真正和redis做互動時才建立網路連線

  2. 操作失敗自動重連機制

  3. 提供連線池以提高效能

  4. pipeling封裝

  5. 事物封裝

更詳細的使用,可以參考:

4    goconsumer

專案地址:

對非同步佇列的使用目前在開發中也是必不可少的,這裡提供了一個消費處理框架,目前支援:

  1. 訊息非順序消費

  2. 訊息順序消費

整體處理框架如圖:

Go程式設計實踐

裡面的物件關係如下:

  • consumer

從各種佇列中做消費的物件,例如kafka、nsq等

  • dispatcher

分配訊息到worker中處理,可以在這裡實現自己的分配演算法達到順序消費的目的,當前提供下面兩種實現:

  1. simpleDispatcher,這個做訊息的隨機分發,無需順序的消費均可以使用

  2. specifyDispatcher,自己指定訊息的分發方法,需要順序消費等特殊消費需求可以使用

  3. worker

訊息處理物件,幹實際業務工作的。

  • task

啟動一個消費任務框架,執行的入口,我在task_test.go中有個demo實現,可供大家參考。

5    gobox-demo

專案地址:

gobox-demo 是我開發的一個通用的模版專案,基於這個專案我有一些使用Go語言做專案開發的心得想要介紹給大家。

controller 和 action 的組織

我見過的大多數專案,都喜歡把controlelr和action放到一個程式碼檔案中,專案功能越多,檔案就越長。

實際中這樣做會給開發和維護帶來很大的不利,所以我把他們拆開,每個action作為一個程式碼檔案,這樣很清晰:

Go程式設計實踐
svc 的組織
Go程式設計實踐

6   其他

以上都是我在開發過程中最常用到的一些工具,我的原則向來是追求精簡,團隊沒用到的功能就不新增。

另外,一些涉及到公司內部的程式碼,例如上線操作無法放到這裡展示,但都是會有單獨的目錄去組織這些。

總之一句話,我力求做到專案組織合理,命名清晰,層次分明,希望讓大家從專案的組織結構上就能判斷出哪部分功能放在哪裡,任何會讓人有歧義的地方都要改善。

結束語

應用程式設計課已經全部講完了,希望我的經驗對大家有幫助,有認識不當的地方還請指正,謝謝大家!

HULK一線技術雜談

由360雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算資料庫大資料監控泛前端自動化測試等眾多技術領域,透過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享

原文連結:https://mp.weixin.qq.com/s/wfuwOY1-Rij_yO98f-11Jw

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2220349/,如需轉載,請註明出處,否則將追究法律責任。

相關文章