Go語言經典庫流量分析(五)| Negroni 中介軟體(一)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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/,第一時間看後續系列。覺得有協助的話,順手分享到朋友圈吧,感謝支援。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.