Go 開發者進階週刊(Jan week 2)
語言學習(Golang 程式設計知識與技巧)
1.Go程式語言規範
一份很詳細的 Go 程式語言的參考手冊。
2.Go網路檔案傳輸
藉助TCP完成檔案的傳輸,基本思路如下:
- 傳送方(客戶端)向服務端傳送檔名,服務端儲存該檔名。
- 接收方(服務端)向客戶端返回一個訊息ok,確認檔名儲存成功。
- 傳送方(客戶端)收到訊息後,開始向服務端傳送檔案資料。
- 接收方(服務端)讀取檔案內容,寫入到之前儲存好的檔案中。
由於檔案傳輸需要穩定可靠的連線,所以採用TCP方式完成網路檔案傳輸功能。
前段時間給後端幾個服務配證書,試著用了一下 Cert-Manager 專案。 Github 幾千 Star 的專案使用起來的確很方便,秒配域名免費證書。但是,執行了三天,機器CPU報警。趕緊去專案 issues 裡搜,果真遇到類似不止一個, 第二天這個問題就修復了。
Carlo Alberto Ferraris提交了一個對math/rand庫中的lockedSource優化的pr(CL#191538),核心程式碼其實只有一行,卻帶來了相對的巨大的效能提升,讓我們一起老看看這次的修改,學習一下程式碼的優化技巧,提高我們Go語言的底層優化經驗。
業務中超時抖動是大家平時比較容易遇到的一種技術問題,本文詳細記錄了一次線上容器中高頻 go 服務超時的排查過程。本文可以給大家提供查服務業務超時問題的一些思路,理解為什麼 go 服務會獲取錯 cpu 核數,瞭解獲取宿主 cpu 核數會有多大影響並怎樣最小成本避開。
假設我們需要頻繁申請記憶體用於存放你的結構體, 而這個結構體本身是短命的, 可能這個請求過去你就不用了. 申請了這麼多記憶體, 對於GC來說就是一種壓力了. 針對這個問題, 如果我們能產生一個池子, 用於存放這些短命記憶體, 理想情況中下次請求來了, 直接從池子中拿就好了, 那麼GC的時候我們直接清理池子就完事了, 算是一種GC的優化套路.
golang 常用的遍歷方式,有兩種:for 和 for-range。而 for-range 使用中有些坑常會遇到,今天我們一起來捋一捋。
編寫健壯且高效能的網路服務需要付出大量的努力。提高服務效能的方式有很多種,比如優化應用層的程式碼,更進一步,還可以看看垃圾回收器,作業系統,網路傳輸,以及部署我們服務的硬體是否有優化空間。
TCP/IP協議棧中的一些演算法會影響到服務效能。本文將簡單介紹其中的Nagle演算法,與Nagle演算法相關的socket選項TCP_NODELAY,以及在Go語言中如何使用它。
Context通常被譯作上下文,是一個比較抽象的概念。一般理解為程式單元的一個執行狀態、現場、快照,而翻譯中上下文又很好地詮釋了其本質。
每個Goroutine在執行前,都要先知道程式當前的執行狀態,通常將這些執行狀態封裝在一個Context變數中,傳遞給要執行的Goroutine中。上下文則幾乎已經成為傳遞與請求同生存週期變數的標準方法。在網路變成下,當接收到一個網路請求Request,處理Request時,我們可能需要開啟不同的Goroutine來獲取資料和執行程式邏輯,即一個請求Request,會在多個Goroutine中處理。而這些Goroutine可能需要共享Request的一些資訊;同時當Request被取消或者超時的時候,所有從這個Request建立的所有Goroutine也應該被結束。
10.《Go語言程式設計》讀書筆記(六) 基於共享變數的併發
一個函式線上性程式中可以正確地工作。如果在併發的情況下,這個函式依然可以正確地工作的話,那麼我們就說這個函式是併發安全的,併發安全的函式不需要額外的同步工作。我們可以把這個概念概括為一個特定型別的一些方法和操作函式,如果這個型別是併發安全的話,那麼所有它的訪問方法和操作就都是併發安全的。
工程實踐(Go的專案應用實踐)
uintptr
在 Go 的原始碼中 uintptr 的定義如下:
/* uintptr is an integer type that is large enough to hold the bit pattern of any pointer.
從英文註釋可以看出 uintptr是一個整形,它的大小能夠容納任何指標的位模式,它是無符號的,最大值為:18446744073709551615,怎麼來的,int64最大值 * 2 +1
*/
type uintptr uintptr
unasfe
在 Go 中,unsafe 是一個包,內容也比較簡短,但註釋非常多,這個包主要是用來在一些底層程式設計中,讓你能夠操作記憶體地址計算,也就是說 Go 本身是不支援指標運算,但還是留了一個後門,而且 Go 也不建議研發人員直接使用 unsafe 包的方法,因為它繞過了 Go 的記憶體安全原則,是不安全的,容易使你的程式出現莫名其妙的問題,不利於程式的擴充套件與維護。
2.eBay鄧明:dubbo-go 中 metrics 的設計
最近因為要在 Apache/dubbo-go(以下簡稱 dubbo-go )裡面實現類似的這個 metrics 功能,於是花了很多時間去了解現在 Dubbo 裡面的 metrics 是怎麼實現的。該部分,實際上是被放在一個獨立的專案裡面,即 metrics 。
使用 MacOS 做開發的朋友都知道,我們一般會使用 Homebrew 做軟體包管理,經常會用到 brew install [soft] 來安裝各種各樣的命令列軟體。今天通過一個百科查詢的命令列工具(tellme)示例,我們來學習一下如何使用 Go 語言開發自己的命令列軟體。
我們需要用到 cobra 這個 Go 模組來做命令列工具開發,這個開源庫其實是對 Go 官方庫 flag 的一個封裝,可以簡化獲取引數的操作。
在當前的複雜分散式架構環境下,服務治理已經大行其道。但目光往下一層,從上層 APP、Service,到底層計算引擎這一層面,卻還是各個引擎各自為政,Client-Server 模式緊耦合滿天飛的情況。如何做好“計算治理”,讓複雜環境下各種型別的大量計算任務,都能更簡潔、靈活、有序、可控的提交執行,和保障成功返回結果?計算中介軟體 Linkis 就是上述問題的最佳實踐。
go 的 goroutine 提供了一種較執行緒而言更廉價的方式處理併發場景, go 使用二級執行緒的模式, 將 goroutine 以 M:N 的形式複用到系統執行緒上, 節省了 cpu 排程的開銷, 也避免了使用者級執行緒(協程)進行系統呼叫時阻塞整個系統執行緒的問題。【1】
但 goroutine 太多仍會導致排程效能下降、GC 頻繁、記憶體暴漲, 引發一系列問題。在面臨這樣的場景時, 限制 goroutine 的數量、重用 goroutine 顯然很有價值。
本文正是針對上述情況而提供一種簡單的解決方案, 編寫一個協程池(任務池)來實現對 goroutine 的管控。
生態擴充(雲原生等 Go 生態體系)
今天我要帶給大家的是2018年底,在西雅圖舉辦的Kubecon的一場分享,來自谷歌K8s團隊的工程師Saad Ali分享的《Kubernetes設計原則》。這場會議雖然已經過去一年多了,但是我覺得本會議的內容非常值得學習,我們大都知道K8s是如何工作的,但是本文帶我們瞭解k8s背後的設計原則,以及為什麼要這樣設計。
2.分析並解決遺留應用遷移至Kubernetes後延遲增加的問題
上週我們團隊忙著將一個微服務遷移到中央平臺上,包括CI/CD,Kubernetes執行時,metric和其他一些程式。這次實驗是為了之後一個月裡大概150個微服務的遷移作準備,所有這些服務支撐著西班牙線上市場的運營。
當我們將應用程式部署到Kubernetes上,並且將一些生產流量匯入其中之後,事情開始有些不妙了。Kubernetes上的請求延遲比EC2上的高10倍左右。除非我們能找到解決方案,不然這會是微服務遷移的最大障礙,甚至可能徹底摧毀整個專案。
3.清晰架構(Clean Architecture)的Go微服務: 日誌管理
良好的日誌記錄可以提供豐富的日誌資料,便於在除錯時發現問題,從而大大提高編碼效率。 記錄器提供的自動化資訊越多越好,日誌資訊也需要以簡潔的方式呈現,便於找到重要的資料。
4.Serverless Kubernetes 入門:對 Kubernetes 做減法
Serverless Kubernetes 是阿里雲容器服務團隊對未來 Kubernetes 演進方向的一種探索,通過對 Kubernetes 做減法,降低運維管理負擔,簡化叢集管理,讓 Kubernetes 從複雜到簡單。
Kubernetes 容器平臺的安全,牽涉到平臺的各個層面:伺服器,作業系統, Docker 執行環境,容器, Kubernetes 執行環境等。
容器執行在伺服器上,伺服器和作業系統安全應該是容器平臺安全的第一道防線。關於主機和核心安全的資料和文件已經非常的豐富,不是我們這篇文件關注的重點,我們以下就其他幾個層面展開。
開源專案(社群新湧現的開源成果)
jql:用Go語言實現的JSON查詢處理器
rqlite:Go 實現分散式 SQLite
彩蛋(活動與招聘)
01.04 Gopher Meetup Plus 深圳站活動 PPT下載
- Asta——Go在工業領域的應用實踐
- 騰訊——Go效能優化之路
- 廣發證券——Go與極限效能實踐
- OPPO——雲平臺儲存系統架構設計與容器化實踐
- 平安科技——從面試題目到Golang彙編
- 騰訊——如何向Go官方提交程式碼
- 華為雲——KubeEdge:雲原生邊緣計算平臺的Golang實踐
【北京】【商湯科技招聘】Golang開發實習生 詳情
【杭州】【螞蟻金服】螞蟻金服研發效能團隊招人啦!詳情
【上海】【趣頭條旗下米讀小說】資深後端研發/架構師 詳情
【武漢】【奇虎360】招聘資深golang工程師 詳情
相關文章
- Go 開發者進階週刊(Jan week 1)Go
- Go 開發者進階週刊Go
- Go 開發者進階週刊(Dec 2nd)Go
- Go 開發者進階週刊(Dec 3rd)Go
- 2.week 獨立開發第二週
- SegmentFault 思否技術週刊 Vol.74 — 淺談 Android 進階指北Android
- 摩拜前端週刊第2期前端
- Scala 技術週刊 | 第 2 期
- SegmentFault 思否技術週刊 -- Node.js 進階之旅,看看那些還需要學?Node.js
- Go 學習、Go 進階、Go 實用工具類Go
- Coursera課程筆記----C程式設計進階----Week 5筆記C程式程式設計
- 開源早讀課週刊:第2期
- 《Android經驗分享》週刊第2期Android
- Go語言輕鬆進階Go
- Go 進階學習筆記Go筆記
- 【Go進階—基礎特性】介面Go
- 【Go進階—基礎特性】deferGo
- 【Go進階—基礎特性】反射Go反射
- SegmentFault 思否技術週刊 -- Go 語言通關攻略Go
- SegmentFault 思否技術週刊 -- 進擊的 ReactReact
- React進階篇2React
- go 單元測試進階篇Go
- 【Go進階—基礎特性】錯誤Go
- 【Go進階—資料結構】mapGo資料結構
- 【Go進階—資料結構】ChannelGo資料結構
- 【Go進階—資料結構】sliceGo資料結構
- LeetCode Week 2LeetCode
- 科技愛好者週刊(第 159 期):遊戲開發者的年薪遊戲開發
- 8.week 獨立開發第八週週報
- 7.week 獨立開發第七週週報
- SegmentFault 思否技術週刊 Vol.71 — 解讀 Go 語言Go
- 【Go進階—基礎特性】panic 和 recoverGo
- 【Go進階—基礎特性】定時器Go定時器
- 【Go進階—併發程式設計】MutexGo程式設計Mutex
- 【Go進階—資料結構】stringGo資料結構
- Go進階之網路程式設計Go程式設計
- 東方娛樂週刊
- HGAME-week2-web-wpGAMWeb