原创 七. Go併發編程--sync.Once

一.序 單從庫名大概就能猜出其作用。sync.Once使用起來很簡單, 下面是一個簡單的使用案例 package main import ( "fmt" "sync" ) func main() { var ( once sy

原创 六. Go併發編程--WaitGroup

一. 序言 WaitGroup是Golang應用開發過程中經常使用的併發控制技術。 WaitGroup,可理解爲Wait-Goroutine-Group,即等待一組goroutine結束。比如某個goroutine需要等待其他幾個gorou

原创 5. Go 併發編程--sync/atomic

目錄1. 前言2. 簡單的使用2.1 mutex示例2.2 sync/atomic實現方式如下3. 源碼分析3.1 方法總結3.2 CAS3.2.1 延申閱讀: CAS的缺點3.2.2 VALUE3. 實戰:實現一個“無鎖”的棧3.1 無鎖

原创 4. Go併發編程--Mutex/RWMutex

目錄一.前言二. Mutex2.1 案例三. 實現原理3.1 鎖的實現模式3.2 Go Mutex 實現原理3.2.1 加鎖3.2.2 解鎖四. 源碼分析4.1 Mutex基本結構4.2 加鎖4.3 解鎖五. 讀寫鎖(RWMutex)5.1

原创 docker內服務訪問宿主機服務

目錄1. 場景2. 解決4. 參考 1. 場景 使用windows, wsl2 進行日常開發測試工作。 但是wsl2經常會遇到網絡問題。比如今天在測試一個項目,核心功能是將postgres 的數據使用開源組件synch 同步到clickho

原创 3. Go併發編程--數據競爭

目錄1.前言2.數據競爭2.1 示例一2.1.1 測試2.1.2 data race 檢測2.1.3 data race 配置2.2 循環中使用goroutine引用臨時變量2.3 引起變量共享2.4 不受保護的全局變量2.5 未受保護的成

原创 2. Go併發編程--GMP調度

目錄1. 前言1.1 Goroutine 調度器的 GMP 模型的設計思想1.2 GMP 模型1.3. 有關M和P的個數問題1.4 P 和 M 何時會被創建2. 調度器的設計策略3. go fucn() 調度流程4. 調度器的生命週期4.1

原创 Go序列化嵌套結構體

目錄1. 忽略某個字段2. 忽略空值字段3. 去掉結構體沒有字段的值4. 忽略嵌套結構體空值字段4.1 解套結構體解包序列化4.2 想要變成嵌套的json串,需要改爲具名嵌套或定義字段tag4.3 嵌套結構體如果無值,將對應json字段忽略

原创 Go併發編程--正確使用goroutine

目錄1. 對創建的gorouting負載1.1 不要創建一個你不知道何時退出的 goroutine1.2 不要幫別人做選擇1.3 不要作爲一個旁觀者1.4 不要創建不知道什麼時候退出的 goroutine1.5 不要創建都無法退出的 gor

原创 七. Go服務器--可用性總結

目錄1. 限流對比2. 微服務可用性設計總結2.1. 移動客戶端/瀏覽器2.2. BFF/Client2.3. Serve3. 總結4. 參考 1. 限流對比 類型 實現 優點 缺點 單機限流 令牌桶 1. 穩定可靠,實現簡單

原创 六.Go微服務--熔斷

1. 前言 無論是令牌桶, 漏桶 還是 自適應限流的方法,總的來說都是服務端的單機限流方式。雖然服務端限流雖然可以幫助我們抗住一定的壓力,但是拒絕請求畢竟還是有成本的。如果我們的本來流量可以支撐 1w rps,加了限流可以支撐在 10w r

原创 五.Go微服務--自適應限流

1. 前言 令牌桶與 漏桶 兩種算法最大的一個問題就是他們都屬於需要提前設置閾值的算法,基於 QPS 進行限流的時候最麻煩的就是這個閾值應該怎麼設定。一般來說我們可以通過壓測來決定這個閾值。但是也會存在問題 如果每個系統上線前都要經過很嚴

原创 四. Go微服務--漏桶算法實現限流

1.序 除開前面章節講到的令牌桶算法實現的網絡限流外, 還有另外一種常見的限流算法, 漏桶算法 2. 漏桶算法 漏桶算法(Leaky Bucket) 是網絡世界中 流量整形(Traffic Shaping)或速率限制(Rate Limiti

原创 三.Go微服務--令牌桶實現原理

1. 前言 在上一篇文章 Go微服務: 令牌桶 當中簡單的介紹了令牌桶實現的原理,然後利用 /x/time/rate 這個庫 10 行代碼寫了一個基於 ip 的 gin 限流中間件,那這個功能是怎麼實現的呢?接下來我們就從源碼層面來了解一下

原创 二.Go微服務--令牌桶

1. 令牌桶 1.1 原理 我們以 r/s 的速度向桶內放置令牌,桶的容量爲 b , 如果桶滿了令牌將會丟棄 當請求到達時,我們向桶內獲取令牌,如果令牌足夠,我們就通過轉發請求 如果桶內的令牌數量不夠,那麼這個請求會被緩存等待令牌足夠時