這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go語言經典庫流量分析,未完待續,歡迎掃碼關注公眾號flysnow_org
或者網站http://www.flysnow.org/,第一時間看後續系列。覺得有協助的話,順手分享到朋友圈吧,感謝支援。
上一篇介紹的Gorilla Handlers中介軟體,嚴格來說不能稱之為一個庫或者架構,他只是一系列封裝http.Handler的中介軟體函數,並且他們之間沒有任何關係,也沒有定義一種規則如何讓我們基於它來開發我們自己的中介軟體,總之它是孤立的,中介軟體之間沒有關係的。
我們這篇文章介紹的Negroni中介軟體庫,是一個非常經典的庫,非常小,但是功能強大,因為他定義了中介軟體的架構和風格,讓我們可以基於它開發出我們自己的中介軟體,並且可以整合到Negroni中。
Negroni還相容原生的http.Handler,你完全可以把自己的http.Handler加入到Negroni的中介軟體鏈中,Negroni會自動調用他們處理我們的HTTP Request的。
入門介紹
Negroni託管在Github上,你完全可以通過以下方式獲得它,然後在你的項目中使用。
1 |
go get -u github.com/urfave/negroni |
然後我們看個例子,還是基於Gorilla Handler的例子吧,便於理解。
1234567891011121314151617 |
//Blog:www.flysnow.org//Wechat:flysnow_orgfunc main() {n := negroni.Classic()n.UseHandler(handler())n.Run(":1234")}func handler() http.Handler{return http.HandlerFunc(myHandler)}func myHandler(rw http.ResponseWriter, r *http.Request) {rw.Header().Set("Content-Type", "text/plain")io.WriteString(rw,"Hello World")} |
negroni.Classic()
返回一個Negroni
執行個體,然後通過這個執行個體,我們就可以添加一些中介軟體了。因為Negroni完全相容http.Handler,所以我們自己對於HTTP Request的真實業務處理也可以作為Negroni的一個中介軟體。
通過Negroni的Run方法,就可以啟動一個服務了,這個Run方法和http.ListenAndServe
是等價的,只不過做了一些處理,比如會從環境變數PORT
裡擷取服務監聽的連接埠。
運行,然後訪問http://localhost:1234
,會看到如下輸出:
12 |
[negroni] 2017-08-20T18:09:47+08:00 | 200 | 591.81µs | localhost:1234 | GET / [negroni] 2017-08-20T18:09:47+08:00 | 200 | 29.677µs | localhost:1234 | GET /favicon.ico |
這個為什麼呢?哦,原來是我們的negroni.Classic()
初始化Negroni
執行個體的方式,這種方式會預設添加3個中介軟體。
123 |
func Classic() *Negroni {return New(NewRecovery(), NewLogger(), NewStatic(http.Dir("public")))} |
一個是Panic Recovery,一個是Log,一個是靜態檔案伺服器。如果你不想使用他們,或者你有自己定義好的可以替代他們的中介軟體,可以使用New
方法。
123456 |
func New(handlers ...Handler) *Negroni {return &Negroni{handlers: handlers,middleware: build(handlers),}} |
參數是一個可變的中介軟體處理參數,是否傳入一些處理中介軟體,由你來決定。
Negroni配合路由
Negroni是一個讓你更容易的使用中介軟體的微型庫,至於具體的業務處理Handler,需要我們自己來寫,不過Negroni強大之處在於,我們可以把我們自己的業務處理Hanlder當做Negroni的中介軟體,當然路由也不例外,go http mux路由本身就是一種Handler。
12345678910111213141516171819202122232425 |
//Blog:www.flysnow.org//Wechat:flysnow_orgfunc main() {n := negroni.Classic()mux := http.NewServeMux()mux.Handle("/",handler())mux.HandleFunc("/flysnow", func(rw http.ResponseWriter, r *http.Request) {io.WriteString(rw,"Blog:www.flysnow.org\n")io.WriteString(rw,"Wechat:flysnow_org")})n.UseHandler(mux)n.Run(":1234")}func handler() http.Handler{return http.HandlerFunc(myHandler)}func myHandler(rw http.ResponseWriter, r *http.Request) {rw.Header().Set("Content-Type", "text/plain")io.WriteString(rw,"Hello World")} |
對比前面的樣本,稍稍改動了下,通過一個路由處理不同的URL,然後把這個路由作為Negroni中介軟體的一部分。一般來說,路由器作為Negroni的最後一個路由被添加。
當然路由架構有很多個,如果你不是使用的預設的,你也可以選擇其他的,比如Gorilla Mux,那麼我們樣本可以這麼改寫。
123456789101112131415 |
//Blog:www.flysnow.org//Wechat:flysnow_orgfunc main() {n := negroni.Classic()router:=mux.NewRouter()router.Handle("/",handler())router.HandleFunc("/flysnow", func(rw http.ResponseWriter, r *http.Request) {io.WriteString(rw,"Blog:www.flysnow.org\n")io.WriteString(rw,"Wechat:flysnow_org")})n.UseHandler(router)n.Run(":1234")} |
從這裡可以又可以看到Negroni的靈活性,完全相容net/http,無縫融合,所以我們也鼓勵使用原生的net/http處理庫。
動態新增中介軟體
在建立了一個Negroni執行個體後,我們可以為它添加中介軟體,這些被添加的中介軟體組成一個中介軟體鏈,先添加的會被先執行。
中介軟體的添加,得益於幾個Negroni的Use函數,這些函數的功能是一樣的,抽象出來的幾個Use函數便於我們添加不同類型的中介軟體。
1234567 |
//Blog:www.flysnow.org//Wechat:flysnow_orgUse(handler Handler)UseFunc(handlerFunc func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc))UseHandler(handler http.Handler)UseHandlerFunc(handlerFunc func(rw http.ResponseWriter, r *http.Request)) |
除了第1個Use函數,其他三個函數最終都會調用Use函數,把中介軟體添加到中介軟體的處理鏈中。
12345678 |
func (n *Negroni) Use(handler Handler) {if handler == nil {panic("handler cannot be nil")}n.handlers = append(n.handlers, handler)n.middleware = build(n.handlers)} |
從上面的Use函數的實現可以看出,Negroni有兩個欄位,其中handler是一個切片,用於儲存所有的Handler;一個是middleware,用於儲存基於Handher構建而成的中介軟體鏈。
每次調用Use函數添加中介軟體,都會重新構建賦值給這兩個欄位,這樣就完成了中介軟體的添加。
小結
這一篇主要介紹下Negroni的使用,以及路由的配置和中介軟體的添加,對Negroni有一些大概的瞭解,下一篇會繼續介紹Negroni的處理器Handler,Handler和HandlerFunc之間的轉換,如何構建中介軟體鏈等。
相關文章推薦
Go語言經典庫流量分析(四)| Gorilla Handlers 原始碼實現分析
Go語言經典庫流量分析(三)| Gorilla Handlers 詳細介紹
Go語言經典庫流量分析(二)| Gorilla Context
Go語言經典庫流量分析(一)| 開篇
Go語言經典庫流量分析,未完待續,歡迎掃碼關注公眾號flysnow_org
或者網站http://www.flysnow.org/,第一時間看後續系列。覺得有協助的話,順手分享到朋友圈吧,感謝支援。