一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

中間件是一種計算機(jī) 軟件,可為 操作系統(tǒng) 提供的 軟件應(yīng)用程序 提供服務(wù),以便于各個軟件之間的溝通,特別是系統(tǒng)軟件和應(yīng)用軟件。廣泛用于 web 應(yīng)用和面向服務(wù)的體系結(jié)構(gòu)等。

縱觀 GO 語言,中間件應(yīng)用比較普遍,主要應(yīng)用:

記錄對服務(wù)器發(fā)送的請求(request)

處理服務(wù)器響應(yīng)(response )

請求和處理之間做一個權(quán)限認(rèn)證工作

遠(yuǎn)程調(diào)用

安全

等等

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

下面是一些中間件例子

記錄日志中間件

package main

import (

“fmt”

“l(fā)og”

“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

返回結(jié)果

foo

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

package main

import (

“fmt”

“l(fā)og”

“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

返回結(jié)果

foo

多中間件例子

package main

import (

“fmt”

“l(fā)og”

“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作為其參數(shù)之一,包裝它并返回一個新http.HandlerFunc的服務(wù)器來調(diào)用。在這里,我們定義了一種新類型Middleware,最終可以更容易地將多個中間件鏈接在一起。

當(dāng)然我們也可以改成如下形式

package main

import (

“fmt”

“l(fā)og”

“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 框架下實現(xiàn)中間件

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

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

示例

package main

import (

“github.com/gin-gonic/gin”

“l(fā)og”

“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) //狀態(tài) 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”

“l(fā)og”

“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) //狀態(tài) 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 方法的參數(shù)里(“/test”之后)。

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

轉(zhuǎn)自:guyan0319

segmentfault.com/a/1190000018819804

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1287

    瀏覽量

    71387
  • 計算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7660

    瀏覽量

    90752
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9791

    瀏覽量

    87930

原文標(biāo)題:GO 中間件 Middleware

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    中科創(chuàng)達(dá)與ETAS推出預(yù)集成多域中間件解決方案

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

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

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

    鋼廠首選,profinet轉(zhuǎn)profibus在煤電項目中的協(xié)議轉(zhuǎn)換解決方案

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

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

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

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

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

    2024年AI開發(fā)者中間件工具生態(tài)全面總結(jié)

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

    安科瑞電力監(jiān)控系統(tǒng)在浙江某用戶側(cè)儲能項目的應(yīng)用

    在保障電力系統(tǒng)正常穩(wěn)定運行的過程中,引入一套電力監(jiān)控系統(tǒng)很有必要,本文介紹了安科瑞在浙江某7MW/14MWh用戶側(cè)儲能項目中提供的整體方案,包括二次分散裝置、二次設(shè)備預(yù)制艙內(nèi)部分屏柜、調(diào)度自動化設(shè)備以及一套Acrel-2000電力監(jiān)控系統(tǒng)。
    的頭像 發(fā)表于 02-05 13:18 ?437次閱讀
    安科瑞電力監(jiān)控系統(tǒng)在浙江某用戶側(cè)儲能<b class='flag-5'>項目的</b>應(yīng)用

    恩智浦強(qiáng)化汽車和工業(yè)物聯(lián)網(wǎng)業(yè)務(wù):6.25 億美元收購中間件企業(yè) TTTech Auto

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

    零念科技PowerD-Sch中間件獲ISO 26262 ASIL D級認(rèn)證

    近日,國際知名的第三方檢測認(rèn)證機(jī)構(gòu)TüV南德意志集團(tuán),正式向零念科技頒發(fā)的PowerD-Sch確定性調(diào)度中間件ISO 26262:2018 ASIL D級功能安全產(chǎn)品認(rèn)證證書。 這一證書的獲得
    的頭像 發(fā)表于 12-25 15:58 ?549次閱讀

    東方通聯(lián)合openEuler社區(qū)即將開啟云原生開源中間件 Meetup北京站

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

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

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

    中間件全球數(shù)據(jù)實時同步利器,華為云 EventGrid 事件流重磅發(fā)布

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

    go語言如何解決并發(fā)問題

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

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

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

    使用STM32WL系列Sub-GHz無線驅(qū)動程序的應(yīng)用示例

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