golang 網(wǎng)絡(luò)編程(6)中間件

golang_real.jpg

在前面的分享
golang 網(wǎng)絡(luò)編程(5)中間件
我們通過學(xué)習(xí)自己動手寫了兩個(gè)攔截器愧膀,輸出日志和簡單權(quán)限校驗(yàn)。這也是我們中間件通常要做的事谣光。其實(shí)很多時(shí)候我們不需要自己做過多事檩淋,想喝咖啡我們還有必要去種、烘焙、研磨嗎蟀悦?直接麥當(dāng)勞了媚朦。

不過我們簡單了解一下中間件實(shí)現(xiàn)原理還是很有必要的。先拿日志系統(tǒng)舉例吧日戈。通常我們的日志需要以文件形式保存下來询张,而不是在控制臺輸出。
我們會用到 "github.com/gorilla/handlers"這個(gè)第三方包浙炼。

func index(w http.ResponseWriter, r *http.Request){
    log.Println("Execute index handler")
    fmt.Fprintf(w,"welcome")
}

func about(w http.ResponseWriter, r *http.Request){
    log.Println("Execute about handler")
    fmt.Fprintf(w,"about")
}

我們先定義兩個(gè)路由器份氧,分別在瀏覽器輸出文本。

logFile, err := os.OpenFile("server.log",os.O_WRONLY|os.O_CREATE|os.O_APPEND,0666)
    // logFile, err := os.OpenFile("server.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)

這里通過 go 語言提供 os 包來創(chuàng)建一個(gè)用于保存日志的文件server.log

http.Handle("/", handlers.LoggingHandler(logFile, handlers.CompressHandler(indexHandler))) 
    http.Handle("/about", handlers.LoggingHandler(logFile, handlers.CompressHandler( aboutHandler)))

這里使用了handlers提供的LoggingHandlerCompressHandler來將日志進(jìn)行壓縮后輸入到文件 logFile 中弯屈,這里壓縮是使用 gzip 或 Deflate 對請求返回進(jìn)行壓縮蜗帜。

完整代碼如下

package main

import(
    "fmt"
    "log"
    "net/http"
    "os"

    "github.com/gorilla/handlers"
)

func index(w http.ResponseWriter, r *http.Request){
    log.Println("Execute index handler")
    fmt.Fprintf(w,"welcome")
}

func about(w http.ResponseWriter, r *http.Request){
    log.Println("Execute about handler")
    fmt.Fprintf(w,"about")
}

func iconHandler(w http.ResponseWriter, r *http.Request) {
}

func main(){
    http.HandleFunc("/favicon.icon",iconHandler)

    indexHandler := http.HandlerFunc(index)
    aboutHandler := http.HandlerFunc(about)

    logFile, err := os.OpenFile("server.log",os.O_WRONLY|os.O_CREATE|os.O_APPEND,0666)
    // logFile, err := os.OpenFile("server.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil{
        panic(err)
    }

    http.Handle("/", handlers.LoggingHandler(logFile, handlers.CompressHandler(indexHandler))) 
    http.Handle("/about", handlers.LoggingHandler(logFile, handlers.CompressHandler( aboutHandler)))

    server := &http.Server{
        Addr: ":8080",
    }
    log.Println("Listening...")
    server.ListenAndServe()
}
::1 - - [24/Apr/2019:05:39:31 +0800] "GET / HTTP/1.1" 200 31
::1 - - [24/Apr/2019:05:39:31 +0800] "GET /favicon.ico HTTP/1.1" 200 31
::1 - - [24/Apr/2019:05:39:38 +0800] "GET /about HTTP/1.1" 200 31
::1 - - [24/Apr/2019:05:39:38 +0800] "GET /favicon.ico HTTP/1.1" 200 31

這一次我們又引入了github.com/justinas/alice這個(gè)第三方包,使用 alice 原因是讓我們代碼看起來更優(yōu)雅资厉。

commonHandlers := alice.New(loggingHandler, handlers.CompressHandler)

對我們?nèi)罩具M(jìn)行整合封裝厅缺。

package main

import(
    "io"
    "log"
    "net/http"
    "os"

    "github.com/justinas/alice"
    "github.com/gorilla/handlers"
)

func loggingHandler(next http.Handler) http.Handler{
    
    logFile, err := os.OpenFile("server.log",os.O_WRONLY|os.O_CREATE|os.O_APPEND,0666)

    if err != nil{
        panic(err)
    }

    return handlers.LoggingHandler(logFile,next)
}

func index(w http.ResponseWriter, r *http.Request){
    w.Header().Set(
        "Content-Type",
        "text/html",
    )
    io.WriteString(
        w,
        `<doctype html>
        <html>
            <head>
                <title>Index</title>
            </head>
            <body>
                Hello Zidea!
            </body>
        </html>`, )
}

func about(w http.ResponseWriter, r *http.Request){
    w.Header().Set(
        "Content-Type",
        "text/html",
    )
    io.WriteString(
        w,
        `<doctype html>
        <html>
            <head>
                <title>About</title>
            </head>
            <body>
                about HTTP Middleware
            </body>
        </html>`, )
}

func iconHandler(w http.ResponseWriter, r *http.Request) {
    // http.ServeFile(w, r, "./favicon.ico")
}

func main(){
    http.HandleFunc("/favicon.ico", iconHandler)
    indexHandler := http.HandlerFunc(index)
    aboutHandler := http.HandlerFunc(about)
    commonHandlers := alice.New(loggingHandler, handlers.CompressHandler)
    http.Handle("/", commonHandlers.ThenFunc(indexHandler))
    http.Handle("/about", commonHandlers.ThenFunc(aboutHandler))

    server := &http.Server{
        Addr: ":8080",
    }
    log.Println("Listening...")
    server.ListenAndServe()
}
::1 - - [24/Apr/2019:05:53:01 +0800] "GET /about HTTP/1.1" 200 110
::1 - - [24/Apr/2019:05:53:05 +0800] "GET /welcome HTTP/1.1" 200 103
th-9.jpeg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宴偿,隨后出現(xiàn)的幾起案子湘捎,更是在濱河造成了極大的恐慌,老刑警劉巖窄刘,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窥妇,死亡現(xiàn)場離奇詭異,居然都是意外死亡都哭,警方通過查閱死者的電腦和手機(jī)秩伞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門逞带,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欺矫,“玉大人,你說我怎么就攤上這事展氓∧屡浚” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵遇汞,是天一觀的道長未妹。 經(jīng)常有香客問我,道長空入,這世上最難降的妖魔是什么络它? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮歪赢,結(jié)果婚禮上化戳,老公的妹妹穿的比我還像新娘。我一直安慰自己埋凯,他們只是感情好点楼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布扫尖。 她就那樣靜靜地躺著,像睡著了一般掠廓。 火紅的嫁衣襯著肌膚如雪换怖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天蟀瞧,我揣著相機(jī)與錄音沉颂,去河邊找鬼。 笑死悦污,一個(gè)胖子當(dāng)著我的面吹牛兆览,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播塞关,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抬探,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帆赢?” 一聲冷哼從身側(cè)響起小压,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椰于,沒想到半個(gè)月后怠益,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘾婿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年蜻牢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偏陪。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抢呆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笛谦,到底是詐尸還是另有隱情抱虐,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布饥脑,位于F島的核電站恳邀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏灶轰。R本人自食惡果不足惜谣沸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笋颤。 院中可真熱鬧乳附,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贤重,卻和暖如春茬祷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背并蝗。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工祭犯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滚停。 一個(gè)月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓沃粗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親键畴。 傳聞我的和親對象是個(gè)殘疾皇子最盅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • feisky云計(jì)算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,844評論 0 5
  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,753評論 0 8
  • 打敗你的不是對手起惕,顛覆你的不是同行涡贱,甩掉你的不是時(shí)代,而是你傳統(tǒng)的思維和落后的觀念惹想,成功不是能不能问词,而是你要不要,...
    吳彥來閱讀 569評論 3 13
  • 在訓(xùn)練營結(jié)束的尾聲得知自己獲得訓(xùn)練營優(yōu)秀學(xué)員的時(shí)候其實(shí)非常意外嘀粱,也算是給整個(gè)訓(xùn)練營的學(xué)習(xí)劃上一個(gè)完美的句號了吧激挪。 ...
    Evans_Young閱讀 216評論 0 1
  • 近日悲柱,共青團(tuán)中央微博@視覺中國:國旗锋喜、國徽的版權(quán)也是貴公司些己? 接著視覺中國發(fā)出了致歉信:經(jīng)網(wǎng)友舉報(bào)的視覺中國網(wǎng)站關(guān)...
    香山分享閱讀 291評論 0 2