Go語言的Http 中介軟體實現

2022-09-23 05:09:09 字數 2187 閱讀 3859

當你正在構建乙個web應用程式有可能要執行許多(甚至全部)的http請求一些共享功能,你可能想記錄每乙個request,gzip壓縮的每個response,或者做一些繁重的處理或者快取檢查。

實現這個共享功能的一種方法是將其設定為中介軟體,他可以作為乙個獨立的程式,在正常的handlers處理之前。根本不需要重寫**:如果你想用乙個中介軟體,就把它加上應用中;如果你改變主意了,去掉就好了。就這麼簡單。

這篇文章,我會給大家介紹怎麼自己去實現乙個自定義的middleware模式。以及通過使用第三方的中介軟體軟體包的一些具體的例項。

基本原則:

在go語言中實現和使用middleware是非常簡單的。

使我們的中介軟體能搞滿足 http.handlers 這個介面

建立乙個 handlers 鏈,使其能夠滿足中介軟體的 handler 和 正常應用的 handler,並且能夠註冊到 http.servemux

我來解釋如何實現:

首先你要知道go 的http handle,這裡假設你是知道的

這上面這個**片段裡面我們的邏輯很簡單只是乙個簡單的 w.write() 然後我們使用 http.handlerfunc 介面卡來轉化這個閉包,並返回。

我們可以使用乙個相同的方法來建立乙個 handler 鏈。可以使用 handler 代替引數 string 傳進閉包,然後把控制 handler 給傳進來的 handler,並且呼叫 servehttp() 方法。

這給了我們乙個完整的模式構建中介軟體:

你注意到這個中介軟體有乙個這樣的函式結構 func(http.handler) http.handler 。它接受乙個 handler 作為引數,並且返回乙個 handler。這裡有兩個很有用的原因:

因為這個函式返回乙個控制代碼可以直接供中介軟體註冊

我們可以建立任意長度的 handler 鏈來通過中介軟體的方法互相巢狀

比如:控制流說明:

讓我們來看乙個帶有多個中介軟體的例子,並且把日誌輸出到控制台:

然後我們執行 go run main.go 在瀏覽器開啟http://localhost:3000。 你會看到下面的輸出。

我們能夠很清楚的看到handle的流程控制。我們巢狀他們的返回順序。我們可以通過中介軟體中得 return 隨時停止handle鏈的控制。

在上面的**中我們在middlewaretwo function包含了retrun 語句。我們在瀏覽器中開啟http://localhost:3000/foo,我們會看到。

我們實現乙個真實的專案的示例:

我們實現乙個判斷請求是不是xml的功能,我們要實現乙個中介軟體。用來檢查的請求體的存在。檢查請求體,以確保它是xml。如果其中檢查失敗,我希望我們的中介軟體輸出錯誤資訊然後終止我們的handle處理。

為了檢驗我們的中介軟體是否實現了這個功能,我們首先建立乙個xml檔案。

然後通過使用curl來進行模擬請求:

接下來給大家介紹一下第三方中介軟體的使用:

秉承不造輪子的原則,其實在github上有很多實現了一些功能的中介軟體。比如這裡給大家介紹2個基礎驗證的中介軟體goji/httpauth和gorilla』s logginghandler

首先我們需要引入第三方包

如果你執行這個例子,你應該得到你所期望的有效和無效的憑證響應

gorilla』s logginghandler和apache-style logs有一些區別

以下是我們在其中寫入日誌到server.log檔案乙個簡單的例子:

首先還是引入第三包

在乙個簡單的情況下,這樣我們的**是相當清楚的。但是,如果我們想用logginghandler作為乙個更大的中介軟體鏈中的一部分會發生什麼?我們可以很容易地結束了乙個宣告,看起來像這樣:

不過這看起來太糟糕了。

我們可以通過建立乙個建構函式打來整理一下我們給它取名為(mylogginghandler)

和signature func(http.handler) http.handler.這樣就會是我們的**更加整潔和可讀性:

這裡還有乙個比較完整結構的中介軟體使用的示例:

有很多人不太喜歡中介軟體的設計模式,不過我還是慢喜歡的。

【編輯推薦】

關於啟用 https 的一些經驗分享為了讓https全球化!let's encrypt拉上了facebook網路協議全民季——人人都該懂點兒tcp從 nginx 預設不壓縮 http/1.0 說起站點https化會對流量產生負面影響?百度是這麼說的【責任編輯:何妍 tel:(010)68476606】

Go語言的中介軟體

go的net http設計的 特點就是特別容易構建中介軟體。gin也提供了類似的中介軟體。需要注意的是中介軟體只對註冊過的路由函式起作 對於分組路由,巢狀使 中介軟體,可以限定中介軟體的作 範圍。下面2個中介軟體作用 統計處理的延時 列印處理的狀態 中介軟體1 直接是乙個處理函式 func midd...

go的中介軟體

輸出2019 07 15 17 19 50 middleware1 1 2019 07 15 17 19 50 middleware2 1 handel func 2019 07 15 17 19 50 middleware2 2 2019 07 15 17 19 50 middleware1 2 ...

go 中介軟體 設計模式實現

中介軟體實現粗略版本 var piplc piplcontext type contion func bool type itemfn func carry contion,item contion contion pipl 管道 type pipl struct piplecmapret 管道re...