伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Go項目中引入中間件的目的和效果如何

阿銘linux ? 來源:思否開發者社區 ? 作者:guyan0319 ? 2021-08-14 14:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

中間件是什么?Go 項目中引入中間件的目的和效果如何?本文詳細介紹了Golang 中間件。

中間件是一種計算機 軟件,可為 操作系統 提供的 軟件應用程序 提供服務,以便于各個軟件之間的溝通,特別是系統軟件和應用軟件。廣泛用于 web 應用和面向服務的體系結構等。

縱觀 GO 語言,中間件應用比較普遍,主要應用:

記錄對服務器發送的請求(request)

處理服務器響應(response )

請求和處理之間做一個權限認證工作

遠程調用

安全

等等

中間件處理程序是簡單的http.Handler,它包裝另一個http.Handler做請求的一些預處理和/或后處理。它被稱為“中間件”,因為它位于 Go Web 服務器和實際處理程序之間的中間位置。

下面是一些中間件例子

記錄日志中間件

package main

import (

“fmt”

“log”

“net/http”

func logging(f http.HandlerFunc) http.HandlerFunc {

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

log.Println(r.URL.Path)

f(w, r)

}

}

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

fmt.Fprintln(w, “foo”)

}

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

fmt.Fprintln(w, “bar”)

}

func main() {

http.HandleFunc(“/foo”, logging(foo))

http.HandleFunc(“/bar”, logging(bar))

http.ListenAndServe(“:8080”, nil)

}

訪問 http://localhost:8080/foo

返回結果

foo

將上面示例修改下,也可以實現相同的功能。

package main

import (

“fmt”

“log”

“net/http”

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

fmt.Fprintln(w, “foo”)

}

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

fmt.Fprintln(w, “bar”)

}

func loggingMiddleware(next http.Handler) http.Handler {

return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

log.Println(r.URL.Path)

next.ServeHTTP(w, r)

})

}

func main() {

http.Handle(“/foo”, loggingMiddleware(http.HandlerFunc(foo)))

http.Handle(“/bar”, loggingMiddleware(http.HandlerFunc(bar)))

http.ListenAndServe(“:8080”, nil)

}

訪問 http://localhost:8080/foo

返回結果

foo

多中間件例子

package main

import (

“fmt”

“log”

“net/http”

time”

type Middleware func(http.HandlerFunc) http.HandlerFunc// Logging logs all requests with its path and the time it took to processfunc Logging() Middleware {

// Create a new Middleware

return func(f http.HandlerFunc) http.HandlerFunc {

// Define the http.HandlerFunc

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

// Do middleware things

start := time.Now()

defer func() { log.Println(r.URL.Path, time.Since(start)) }()

// Call the next middleware/handler in chain

f(w, r)

}

}

}

// Method ensures that url can only be requested with a specific method, else returns a 400 Bad Requestfunc Method(m string) Middleware {

// Create a new Middleware

return func(f http.HandlerFunc) http.HandlerFunc {

// Define the http.HandlerFunc

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

// Do middleware things

if r.Method != m {

http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)

return

}

// Call the next middleware/handler in chain

f(w, r)

}

}

}

// Chain applies middlewares to a http.HandlerFuncfunc Chain(f http.HandlerFunc, middlewares 。。.Middleware) http.HandlerFunc {

for _, m := range middlewares {

f = m(f)

}

return f

}

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

fmt.Fprintln(w, “hello world”)

}

func main() {

http.HandleFunc(“/”, Chain(Hello, Method(“GET”), Logging()))

http.ListenAndServe(“:8080”, nil)

}

中間件本身只是將其http.HandlerFunc作為其參數之一,包裝它并返回一個新http.HandlerFunc的服務器來調用。在這里,我們定義了一種新類型Middleware,最終可以更容易地將多個中間件鏈接在一起。

當然我們也可以改成如下形式

package main

import (

“fmt”

“log”

“net/http”

“time”

type Middleware func(http.Handler) http.Handlerfunc Hello(w http.ResponseWriter, r *http.Request) {

fmt.Fprintln(w, “hello world”)

}

func Chain(f http.Handler, mmap 。。.Middleware) http.Handler {

for _, m := range mmap {

f = m(f)

}

return f

}

func Method(m string) Middleware {

return func(f http.Handler) http.Handler {

return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

log.Println(r.URL.Path)

if r.Method != m {

http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)

return

}

f.ServeHTTP(w, r)

})

}

}

func Logging() Middleware {

return func(f http.Handler) http.Handler {

return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

//log.Println(r.URL.Path)

// Do middleware things

start := time.Now()

defer func() { log.Println(r.URL.Path, time.Since(start)) }()

f.ServeHTTP(w, r)

})

}

}

func main() {

http.Handle(“/”, Chain(http.HandlerFunc(Hello), Method(“GET”), Logging()))

http.ListenAndServe(“:8080”, nil)

}

在 gin 框架下實現中間件

r := gin.Default() 創建帶有默認中間件的路由,默認是包含 logger 和 recovery 中間件的

r :=gin.new() 創建帶有沒有中間件的路由

示例

package main

import (

“github.com/gin-gonic/gin”

“log”

“time”

func Logger() gin.HandlerFunc {

return func(c *gin.Context) {

t := time.Now()

// Set example variable

c.Set(“example”, “12345”)

// before request

c.Next()

// after request

latency := time.Since(t)

log.Print(latency) //時間 0s

// access the status we are sending

status := c.Writer.Status()

log.Println(status) //狀態 200

}

}

func main() {

r := gin.New()

r.Use(Logger())

r.GET(“/test”, func(c *gin.Context) {

example := c.MustGet(“example”)。(string)

// it would print: “12345”

log.Println(example)

})

// Listen and serve on 0.0.0.0:8080

r.Run(“:8080”)

}

以上示例也可改為

package main

import (

“github.com/gin-gonic/gin”

“log”

“time”

func Logger() gin.HandlerFunc {

return func(c *gin.Context) {

t := time.Now()

// Set example variable

c.Set(“example”, “12345”)

// before request

c.Next()

// after request

latency := time.Since(t)

log.Print(latency) //時間 0s

// access the status we are sending

status := c.Writer.Status()

log.Println(status) //狀態 200

}

}

func main() {

r := gin.New()

r.GET(“/test”, Logger(), func(c *gin.Context) {

example := c.MustGet(“example”)。(string)

// it would print: “12345”

log.Println(example)

})

// Listen and serve on 0.0.0.0:8080

r.Run(“:8080”)

}

即不用 r.use 添加中間件,直接將 Logger() 寫到 r.GET 方法的參數里(“/test”之后)。

更多 gin 中間件示例可參考 https://github.com/gin-gonic/gin

轉自:guyan0319

segmentfault.com/a/1190000018819804

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Web
    Web
    +關注

    關注

    2

    文章

    1309

    瀏覽量

    74863
  • 計算機
    +關注

    關注

    19

    文章

    7827

    瀏覽量

    93392
  • 服務器
    +關注

    關注

    14

    文章

    10325

    瀏覽量

    91669

原文標題:GO 中間件 Middleware

文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    京東緩存中間件架構與緩存內核優化

    一、京東緩存中間件架構 1、背景 在當今高并發、分布式的系統架構中,緩存已成為提升應用性能、降低數據庫負載的核心組件。隨著業務規模的擴大與系統復雜度的增加,緩存的使用和管理面臨諸多挑戰:部署模式多樣
    的頭像 發表于 04-03 16:18 ?1745次閱讀
    京東緩存<b class='flag-5'>中間件</b>架構與緩存內核優化

    谷景DLCHX工字電感在智能插座項目中的應用

    在全球供應鏈格局深度調整的背景下,電感的國產化替代已成為眾多企業提升供應鏈韌性、控制成本、確保交期的戰略選擇。近期,谷景成功協助上海某智能設備客戶,完成其智能插座項目中關鍵電感元件的國產化替代,從技術匹配到風險預防,全程護航項目順利量產。
    的頭像 發表于 02-28 09:19 ?797次閱讀

    以“網關中間件”實現充電樁OCPP 1.6安全配置文件無縫升級

    深圳惠志科技有限公司推出的OCPP安全代理網關采用"網關中間件"架構,在充電樁與云端CSMS之間透明地部署,實現充電樁OCPP 1.6協議安全配置文件從Profile 0/1到Profile 2/3的無縫升級,而無需觸及樁端硬件與固件。
    的頭像 發表于 02-04 11:56 ?1025次閱讀
    以“網關<b class='flag-5'>中間件</b>”實現充電樁OCPP 1.6安全配置文件無縫升級

    博泰車聯網攜手產業伙伴共建天元OS開源生態

    近日,2025中國汽車軟件大會于上海嘉定召開。會上,行業首個覆蓋自動駕駛全棧的開源中間件——“天元OS跨域中間件”正式以全棧開源的形式發布。博泰車聯作為項目核心共建單位受邀參與,與產業伙伴共同見證并推動中國智能汽車基礎軟件邁向開
    的頭像 發表于 12-31 14:41 ?557次閱讀

    黑芝麻智能攜手產業伙伴共建天元OS開源生態

    2025中國汽車軟件大會期間,行業首個覆蓋自動駕駛全棧的開源中間件——天元OS跨域中間件正式全棧開源發布,黑芝麻智能作為共建單位出席啟動儀式。
    的頭像 發表于 12-23 11:34 ?614次閱讀

    Neway電機方案在實際應用中效果如何?

    Neway電機方案在實際應用中效果如何?Neway電機方案是深圳市立維創展科技有限公司推出的電機驅動與控制系統解決方案,具有高穩定性、高性價比、小型化等特點,Neway電機方案在實際應用中效果
    發表于 12-03 09:23

    房產數據平臺安家go獲取地區列表數據的API接口

    如何使用安家go提供的API接口來獲取地區列表數據,包括API端點、請求參數、響應格式以及代碼實現。我們將逐步引導您完成整個過程,確保您能輕松集成到自己的項目中。 1. API概述 安家go的“獲取地區列表”API是一個基于RE
    的頭像 發表于 11-21 14:38 ?451次閱讀
    房產數據平臺安家<b class='flag-5'>go</b>獲取地區列表數據的API接口

    LCD屏幕無法正確顯示效果如何解決?

    ,最后發現屏幕顯示效果異常。請問這種問題應該如何解決? 實際想要的效果: 移植完成后出現的效果: 下面是移植的步驟: 1.使用RT-Thread Studio創建一個STM32F429IGT6
    發表于 09-25 08:16

    如何選擇適合自己項目的通信協議評估工具?

    LZ-DZ200電能質量在線監測裝置 選擇適合項目的通信協議評估工具,核心是 對齊項目需求與工具能力 ,避免 “過度選型”(用高端工具測簡單場景)或 “功能不足”(用輕量工具測復雜協議)。以下是分步
    的頭像 發表于 08-27 09:19 ?875次閱讀
    如何選擇適合自己<b class='flag-5'>項目的</b>通信協議評估工具?

    STM32U575VGT6在cubeMX中沒有FATFS中間件,是不支持嗎?

    STM32U575VGT6在cubeMX中沒有FATFS中間件,是不支持?還是待開發?現在這塊板子使用FATFS只能自己手動移植嗎?
    發表于 07-30 06:46

    中科創達與ETAS推出預集成多域中間件解決方案

    近日,ETAS 與 ThunderSoft(中科創達)宣布雙方建立了緊密合作關系,并將在今年6月24日至25日于路德維希堡舉行的汽車電子大會上,聯合展示其新開發的、面向高性能計算(HPC)SoC 車載系統的多域預集成中間件解決方案。
    的頭像 發表于 06-25 10:16 ?1387次閱讀

    樹莓派項目中10款最佳的DIN導軌外殼!

    ?模塊化承包商、電源和燈光控制器都集成在一個緊湊的DIN外殼中。一張圖片勝過千言萬語。在本文中,我將討論如何將樹莓派安裝在DIN導軌上。所有提到的產品都已在各種項目中
    的頭像 發表于 06-14 08:34 ?957次閱讀
    樹莓派<b class='flag-5'>項目中</b>10款最佳的DIN導軌外殼!

    汽車零部開發項目管理

    汽車零部開發項目管理是一個涉及多環節、多部門協作的復雜過程,需從項目啟動到交付全流程進行科學規劃與管控。以下從 核心流程 、 關鍵要素 、 管理工具 及 挑戰與應對策略 四方面展開說明: 一、核心
    的頭像 發表于 06-09 13:26 ?1776次閱讀

    軟件定義汽車時代為什么中間件受青睞

    在“軟件定義汽車”時代,隨著汽車軟件功能漸趨多樣化,硬件和軟件組件之間的通信和交互開始變得復雜。如今,一輛汽車可能負載百余個電子控制單元(ECU),它們分別控制著包括動力轉向、溫度控制和安全氣囊等在內的多種軟件功能。
    的頭像 發表于 06-09 11:14 ?1100次閱讀

    鋼廠首選,profinet轉profibus在煤電項目中的協議轉換解決方案

    鋼廠首選,profinet轉profibus在煤電項目中的協議轉換解決方案
    的頭像 發表于 05-06 16:37 ?664次閱讀
    鋼廠首選,profinet轉profibus在煤電<b class='flag-5'>項目中</b>的協議轉換解決方案