在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    1284

    瀏覽量

    70896
  • 計算機
    +關注

    關注

    19

    文章

    7636

    瀏覽量

    90268
  • 服務器
    +關注

    關注

    13

    文章

    9717

    瀏覽量

    87371

原文標題:GO 中間件 Middleware

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

    智慧路燈的照明效果如何?

    引言 在智慧城市建設的進程中,叁仟智慧路燈已逐漸成為城市道路照明的主力軍。其照明效果不僅關系到市民夜間出行的安全與便捷,更對城市的整體形象和生活品質有著深遠影響。相較于傳統路燈,叁仟智慧路燈借助
    的頭像 發表于 03-16 16:10 ?267次閱讀

    STM32MP131C CbueMX中間件無RTOS選項是怎么回事?

    如題,STM32MP131C CbueMX中間件無RTOS選項,對比選擇STM32MP157芯片是有的,怎么查這部分資料呢
    發表于 03-14 06:59

    2024年AI開發者中間件工具生態全面總結

    進行多方位的總結和梳理。 在第二章《TOP 101-2024 大模型觀點》中,生成式 AI 開發者莫爾索總結了 2024 年 AI 開發者中間件工具生態。 ? 全文如下: AI 開發者中間件工具生態
    的頭像 發表于 02-14 09:45 ?552次閱讀

    恩智浦強化汽車和工業物聯網業務:6.25 億美元收購中間件企業 TTTech Auto

    恩智浦 NXP 荷蘭當地時間本月 7 日宣布已同 TTTech Auto 達成最終協議,計劃以 6.25 億美元(當前約 45.86 億元人民幣)的現金收購這家奧地利汽車中間件企業,強化自身
    的頭像 發表于 01-16 11:52 ?1250次閱讀
    恩智浦強化汽車和工業物聯網業務:6.25 億美元收購<b class='flag-5'>中間件</b>企業 TTTech Auto

    零念科技PowerD-Sch中間件獲ISO 26262 ASIL D級認證

    近日,國際知名的第三方檢測認證機構TüV南德意志集團,正式向零念科技頒發的PowerD-Sch確定性調度中間件ISO 26262:2018 ASIL D級功能安全產品認證證書。 這一證書的獲得
    的頭像 發表于 12-25 15:58 ?479次閱讀

    東方通聯合openEuler社區即將開啟云原生開源中間件 Meetup北京站

    ! openEuler社區云原生開源中間件Meetup北京站將于12月27日舉辦,由東方通與openEuler社區攜手主辦。此次交流活動特邀多位業內專家,分享實戰案例與前沿技術解析,為技術愛好者、行業從業者、高校學生等加油充電,深化技術交流與學習。同時沙
    的頭像 發表于 12-17 14:58 ?639次閱讀

    DDS通信中間件——DCPS規范(下)

    DDS通信中間件——DCPS規范(下)本期還是DCPS規范,填上期沒有聊完的QoS的坑。本系列文章將包括以下內容陸續更新:1.DDS規范概述2.DCPS規范解讀3.DDS-XTypes與IDL解讀
    的頭像 發表于 11-27 11:47 ?1156次閱讀
    DDS通信<b class='flag-5'>中間件</b>——DCPS規范(下)

    中間件全球數據實時同步利器,華為云 EventGrid 事件流重磅發布

    【摘要】 華為云 EventGrid 事件流(簡稱 EG)作為易用、穩定、高效的數據同步管道連接不同的系統與服務,支持中間件數據在線實時同步。事件流圍繞云中間件,降低了中間件之間數據流通的復雜性
    的頭像 發表于 10-31 18:39 ?515次閱讀
    <b class='flag-5'>中間件</b>全球數據實時同步利器,華為云 EventGrid 事件流重磅發布

    go語言如何解決并發問題

    GO快很多。現在工作中也還是有一些老項目在使用PHP,但21年之后的新項目基本上就都是用GO了。那為什么PHP那么香,還要轉戰使用GO呢,下
    的頭像 發表于 10-23 13:38 ?436次閱讀
    <b class='flag-5'>go</b>語言如何解決并發問題

    DDS通信中間件——DCPS規范(上)

    DDS通信中間件——DCPS規范(上)本篇文章繼續和大家分享一下對DDS這套規范的理解。預期本系列文章將包括以下內容陸續更新:1.DDS規范概述2.DCPS規范解讀3.DDS-XTypes與IDL
    的頭像 發表于 09-26 08:08 ?1465次閱讀
    DDS通信<b class='flag-5'>中間件</b>——DCPS規范(上)

    使用STM32WL系列Sub-GHz無線驅動程序的應用示例

    Package 中可得),但將該中間件添加到使用STM32CubeMX的項目中需要在其他幾個外設和庫之間進行高級配置。這會導致一個更大、更復雜的項目,消耗更多的設備內存,并導致抽象層低效率。對于要求功耗低的簡單應用,將RF接口
    的頭像 發表于 07-18 10:20 ?9418次閱讀
    使用STM32WL系列Sub-GHz無線驅動程序的應用示例

    云原生中間件,構筑軟件安全可信的連接橋梁

    近日,在華為云開發者大會 2024 期間,來自華為云 PaaS 服務,中間件領域產品團隊的資深專家、技術總監、高級產品經理等大咖們發表了以“云原生中間件,構筑軟件安全可信的連接橋梁”為主題的專題演講
    的頭像 發表于 07-10 20:55 ?679次閱讀
    云原生<b class='flag-5'>中間件</b>,構筑軟件安全可信的連接橋梁

    請問如何將cURL庫添加到ESP8266_RTOS_SDK項目中

    我想使用 curl api,但我不知道如何將庫添加到我的項目中,這樣當我將該庫的頭文件包含在我的項目中時它就不會抱怨。 有誰知道如何正確地將第三方庫添加到ESP8266_RTOS_SDK項目中
    發表于 07-09 07:52

    北京靈奧科技基于亞馬遜云科技打造大模型中間件

    助力企業加速應用生成式AI 北京2024年6月27日?/美通社/ --?北京靈奧科技基于亞馬遜云科技的生成式AI、數據庫和容器等云服務,打造大模型中間件,將基礎模型優勢和企業業務數據無縫結合,打通
    的頭像 發表于 06-27 21:21 ?807次閱讀
    主站蜘蛛池模板: 亚洲国产成人va在线观看 | 欧美福利片在线观看 | 韩国床戏合集三小时hd中字 | 欧美一级黄色片视频 | 天天摸夜夜爽 | 国产福利久久 | 色婷婷资源网 | 久久夜色精品国产噜噜 | 女人爽到喷水的视频大全在线观看 | 天堂网2018 | 美女把尿口扒开让男人桶出水 | 国产视频首页 | 色播五月激情五月 | 五月婷婷伊人网 | 91中文字幕在线视频 | 一级毛片一级毛片一级级毛片 | 色综合欧美综合天天综合 | xxxxxx性bbbbbb| 国产caoni111在线观看视频 | 日本免费人成黄页网观看视频 | 福利视频入口 | 免费视频播放 | 午夜精品国产 | 波多野结衣久久国产精品 | 亚洲免费国产 | 亚洲第一永久在线观看 | 爽爽爽爽爽爽a成人免费视频 | 天天干b| 亚洲最新在线观看 | 酒色影院 | 免费免费啪视频在线 | 国模小丫大尺度啪啪人体 | 色爽女视频 | 亚洲 欧美 自拍 卡通 综合 | 欧美1314www伊人久久香网 | 69老司机亚洲精品一区 | 国产成人精品一区二区三区 | 免费的毛片网站 | 日本免费大黄 | 国产三级三级三级 | 国产精品美女视频 |