GO實現(xiàn)TCP服務(wù)器
首先新建一個項目go-redis,將config和lib包放到項目中,config.go用來解析配置,比如端口、功能、DB數(shù);lib包有兩個文件夾,分別是logger和sync,其中l(wèi)ogger.go是一個日志框架,sync包中的bool.go包裝了atomic操作,因為atomic原生沒有bool類型,所以將uint32類型改造成bool型的atomic,wait.go包裝了WaitGroup等待組,多做的工作是將等待組增加一個超時功能,redis.conf配置文件寫明我們redis要寫在的端口和監(jiān)聽地址
正式開始
- 新建一個接口文件夾,放一些全局用到的接口,首先是TCP層的handler.go,這個接口的目的是讓handler.go代表一個抽象的業(yè)務(wù)邏輯,讓TCP服務(wù)器只處理TCP層的連接,具體的業(yè)務(wù)扔給handler去做
type Handler interface {
Handle(ctx context.Context, conn net.Conn)
Close() error
}
TCP服務(wù)器開發(fā)
server.go
net.listen服務(wù)器監(jiān)聽端口地址,如果監(jiān)聽成功就調(diào)用Accept阻塞等待客戶端連接,但這里我們將listener傳給ListenAndServe方法,該方法傳入三個參數(shù),分別是listener,處理客戶端業(yè)務(wù)的handler和傳遞關(guān)閉信號的channel,在其中for循環(huán)阻塞等待客戶端連接,新的客戶端過來后一個協(xié)程一個連接,將上下文ctx和conn句柄傳入handler.Handle方法,然后我們只需在main函數(shù)里調(diào)用ListenAndServeWithSignal方法即可,但此時連接關(guān)閉和用戶關(guān)閉窗口統(tǒng)一關(guān)閉所有客戶端連接功能我們還沒有處理文章來源:http://www.zghlxwxcb.cn/news/detail-605757.html
接下來我們就要著手改進,第一點就是我們這個for循環(huán)在不斷阻塞接收新的連接,如果接收新連接出現(xiàn)錯誤后直接break,但此時我們已經(jīng)有一些連接正在服務(wù),所以我們需要等待已經(jīng)連接的客戶端退出,這里我們就要用到WaitGroup等待組,具體用法就是在每接收一個新的客戶端連接后WaitGroup.Add(1),在接收新連接出錯也就是break跳出fo文章來源地址http://www.zghlxwxcb.cn/news/detail-605757.html
到了這里,關(guān)于Go重寫Redis中間件 - GO實現(xiàn)TCP服務(wù)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!