iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0

中介器(middleware),
是指發送請求(request)後,
到收到回應(response)前,
途中處理各種用途的部分。

舉例來說,你有著幾百個api,
你想要在該api被呼叫時紀錄log,
在沒有MiddleWare的情況下,
你就必須每個api都要加程式碼,
如果有middleware,
你只需要在middleware上動手腳即可。

urfave/negroni

negroni,不是指調酒,
而是指這款用go開發,輕量化的middleware套件,
這款套件可以跟上一章介紹的mux有效配合,就像下面這樣:

router := mux.NewRouter()
router.HandleFunc("/", HomeHandler)

n := negroni.New(Middleware1, Middleware2)
// Or use a middleware with the Use() function
n.Use(Middleware3)
// router goes last
n.UseHandler(router)

http.ListenAndServe(":3001", n)

上面的是官方範例,可以看到先用mux建立router跟handler,
再來將router物件放入建立出來的middleware物件,就可以產生簡單的middleware了。

紀錄訊息

以建立好的webserver來說,一個麻煩的地方就是當要收集資料做分析,
或是有bug出現,需要找api被呼叫的紀錄時,
那個api並沒有加上log,導致沒log資料。
對於這種情況,negroni也有提供log相關的功能:

  mux := http.NewServeMux()
  mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
    fmt.Fprintf(w, "Welcome to the home page!")
  })

  n := negroni.New()
  n.Use(negroni.NewLogger())
  n.UseHandler(mux)

  http.ListenAndServe(":3004", n)

跟前面的官方範例類似,只是多一段Use(negroni.NewLogger()),在這邊設定好negroni的logger後
會印出下面的log

[negroni] 2017-10-04T14:56:25+02:00 | 200 |      378µs | localhost:3004 | GET /

對於這個log,也可以去更改他的log格式:

    nlogger := negroni.NewLogger()
	nlogger.SetFormat("[{{.Status}} {{.Duration}}] - {{.Request.UserAgent}}")
	n.Use(nlogger)

這個方式可以將log改成符合你收集格式的樣子,方便之後收集資料。
透過這個套件,我們就可以建好符合自己要求的middleware了,接下來我們要開始探討被呼叫的api要怎麼處理內部行為。


上一篇
Day8-Web-server 套件 Mux
下一篇
Day10-api與 Http handler
系列文
從0開始的golang web server30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言