Go 開發者進階週刊(Jan week 2)

dyq發表於2020-01-10

語言學習(Golang 程式設計知識與技巧)

1.Go程式語言規範

一份很詳細的 Go 程式語言的參考手冊。

2.Go網路檔案傳輸

藉助TCP完成檔案的傳輸,基本思路如下:

  1. 傳送方(客戶端)向服務端傳送檔名,服務端儲存該檔名。
  2. 接收方(服務端)向客戶端返回一個訊息ok,確認檔名儲存成功。
  3. 傳送方(客戶端)收到訊息後,開始向服務端傳送檔案資料。
  4. 接收方(服務端)讀取檔案內容,寫入到之前儲存好的檔案中。

由於檔案傳輸需要穩定可靠的連線,所以採用TCP方式完成網路檔案傳輸功能。 

3.Go 程式設計: 對不起,你的 CPU 洩露了 

前段時間給後端幾個服務配證書,試著用了一下 Cert-Manager 專案。 Github 幾千 Star 的專案使用起來的確很方便,秒配域名免費證書。但是,執行了三天,機器CPU報警。趕緊去專案 issues 裡搜,果真遇到類似不止一個, 第二天這個問題就修復了。

4.小改動,大提升:Go 標準庫的一次優化 

Carlo Alberto Ferraris提交了一個對math/rand庫中的lockedSource優化的pr(CL#191538),核心程式碼其實只有一行,卻帶來了相對的巨大的效能提升,讓我們一起老看看這次的修改,學習一下程式碼的優化技巧,提高我們Go語言的底層優化經驗。

5.高頻 golang 服務介面超時排查&效能調優 

業務中超時抖動是大家平時比較容易遇到的一種技術問題,本文詳細記錄了一次線上容器中高頻 go 服務超時的排查過程。本文可以給大家提供查服務業務超時問題的一些思路,理解為什麼 go 服務會獲取錯 cpu 核數,瞭解獲取宿主 cpu 核數會有多大影響並怎樣最小成本避開。

6.Go語言學習Sync.Pool

假設我們需要頻繁申請記憶體用於存放你的結構體, 而這個結構體本身是短命的, 可能這個請求過去你就不用了. 申請了這麼多記憶體, 對於GC來說就是一種壓力了. 針對這個問題, 如果我們能產生一個池子, 用於存放這些短命記憶體, 理想情況中下次請求來了, 直接從池子中拿就好了, 那麼GC的時候我們直接清理池子就完事了, 算是一種GC的優化套路.

7.Go之for-range排坑指南

golang 常用的遍歷方式,有兩種:for 和 for-range。而 for-range 使用中有些坑常會遇到,今天我們一起來捋一捋。

8.Go語言使用TCP_NODELAY控制發包流量[譯]

編寫健壯且高效能的網路服務需要付出大量的努力。提高服務效能的方式有很多種,比如優化應用層的程式碼,更進一步,還可以看看垃圾回收器,作業系統,網路傳輸,以及部署我們服務的硬體是否有優化空間。

TCP/IP協議棧中的一些演算法會影響到服務效能。本文將簡單介紹其中的Nagle演算法,與Nagle演算法相關的socket選項TCP_NODELAY,以及在Go語言中如何使用它。

9.Golang context機制

Context通常被譯作上下文,是一個比較抽象的概念。一般理解為程式單元的一個執行狀態、現場、快照,而翻譯中上下文又很好地詮釋了其本質。

每個Goroutine在執行前,都要先知道程式當前的執行狀態,通常將這些執行狀態封裝在一個Context變數中,傳遞給要執行的Goroutine中。上下文則幾乎已經成為傳遞與請求同生存週期變數的標準方法。在網路變成下,當接收到一個網路請求Request,處理Request時,我們可能需要開啟不同的Goroutine來獲取資料和執行程式邏輯,即一個請求Request,會在多個Goroutine中處理。而這些Goroutine可能需要共享Request的一些資訊;同時當Request被取消或者超時的時候,所有從這個Request建立的所有Goroutine也應該被結束。

10.《Go語言程式設計》讀書筆記(六) 基於共享變數的併發

一個函式線上性程式中可以正確地工作。如果在併發的情況下,這個函式依然可以正確地工作的話,那麼我們就說這個函式是併發安全的,併發安全的函式不需要額外的同步工作。我們可以把這個概念概括為一個特定型別的一些方法和操作函式,如果這個型別是併發安全的話,那麼所有它的訪問方法和操作就都是併發安全的。 


工程實踐(Go的專案應用實踐)

1.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 。 

3.Go在MacOS建立一個自定義的命令列工具

使用 MacOS 做開發的朋友都知道,我們一般會使用 Homebrew 做軟體包管理,經常會用到 brew install [soft] 來安裝各種各樣的命令列軟體。今天通過一個百科查詢的命令列工具(tellme)示例,我們來學習一下如何使用 Go 語言開發自己的命令列軟體。

我們需要用到 cobra 這個 Go 模組來做命令列工具開發,這個開源庫其實是對 Go 官方庫 flag 的一個封裝,可以簡化獲取引數的操作。

4.複雜分散式架構下的計算治理之路

在當前的複雜分散式架構環境下,服務治理已經大行其道。但目光往下一層,從上層 APP、Service,到底層計算引擎這一層面,卻還是各個引擎各自為政,Client-Server 模式緊耦合滿天飛的情況。如何做好“計算治理”,讓複雜環境下各種型別的大量計算任務,都能更簡潔、靈活、有序、可控的提交執行,和保障成功返回結果?計算中介軟體 Linkis 就是上述問題的最佳實踐。

5.100 行寫一個go的協程池(任務池)

go 的 goroutine 提供了一種較執行緒而言更廉價的方式處理併發場景, go 使用二級執行緒的模式, 將 goroutine 以 M:N 的形式複用到系統執行緒上, 節省了 cpu 排程的開銷, 也避免了使用者級執行緒(協程)進行系統呼叫時阻塞整個系統執行緒的問題。【1】

但 goroutine 太多仍會導致排程效能下降、GC 頻繁、記憶體暴漲, 引發一系列問題。在面臨這樣的場景時, 限制 goroutine 的數量、重用 goroutine 顯然很有價值。

本文正是針對上述情況而提供一種簡單的解決方案, 編寫一個協程池(任務池)來實現對 goroutine 的管控。


生態擴充(雲原生等 Go 生態體系)

1.Kubernetes設計的4個原則 

今天我要帶給大家的是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 從複雜到簡單。

5.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工程師 詳情

 

相關文章