這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前段時間工作中遇到了golang
的項目,稍稍對其產生了點興趣,打算認真學習下,正巧在搭建mysql
主備環境的時候發現如果用一個代理程式的話自己測試會方便很多(主要還是為了造輪子),於是就抽空用golang
寫了一個tcp代理程式(絕對是空餘時間,工作很飽滿的)
需求
- 由於是為了學習golang,所以要在實現代理基礎功能的前提下儘可能的用到golang的各種基礎知識,不要上來就拿別人的東西,不利於夯實基礎
- 不可能真單純的為了玩,學一個東西除了為充實大腦,更為了能有實際用途,所以有必要掌握工程化流程
- 程式不要太繁雜,畢竟這是我的第一個
golang
工程,來日方長
設計
結構圖如下:
+----------+ +------------+| client |<--------+ | |+----------+ +-------->+-----+<--------------->| server | | | | |+----------+ | | +------------+| client |<----------------->| |+----------+ | | | | +------------++----------+ | L | | || client |^----------------->| B |<--------------->| server |+----------+ | S | | | | | +------------++----------+ | || client |<----------------->| |+----------+ | | +------------+ | | | |+----------+ +--------->+-----+<--------------->| server || client |<-------+ | |+----------+ +------------+
最常見的負載平衡模式,但有幾個點需要支援:
1. 支援不同的調度策略,如:輪訓,隨機,iphash
2. 要有心跳檢查機制,及時將有問題的後端server剔除,但也要在server恢複的時候恢複過來
3. 有簡單的監控,便於查看後端server的代理情況及用戶端的串連情況
4. 參數配置化,便於修改
5. ...後續再加...
實現
github:EasyProxy
歡迎交流~
總結
在easyproxy
第一版結束後,較為深入的學習了slice
,map
,channel
,struct
,interface
等結構,還玩了下golang的協程
,反射
,多態
等特性,順帶掌握了下其工程化應當注意的包迴圈引入
,debug
,打包發布
等問題
感覺現在看書也不虛了,看開原始碼也更有勁兒了~