日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

Go項(xiàng)目中引入中間件的目的和效果如何

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

掃碼添加小助手

加入工程師交流群

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

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

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

記錄對(duì)服務(wù)器發(fā)送的請(qǐng)求(request)

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

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

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

安全

等等

中間件處理程序是簡(jiǎn)單的http.Handler,它包裝另一個(gè)http.Handler做請(qǐng)求的一些預(yù)處理和/或后處理。它被稱(chēng)為“中間件”,因?yàn)樗挥?Go Web 服務(wù)器和實(shí)際處理程序之間的中間位置。

下面是一些中間件例子

記錄日志中間件

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)

}

訪問(wèn) http://localhost:8080/foo

返回結(jié)果

foo

將上面示例修改下,也可以實(shí)現(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)

}

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

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

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

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

示例

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) //時(shí)間 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) //時(shí)間 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() 寫(xiě)到 r.GET 方法的參數(shù)里(“/test”之后)。

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

轉(zhuǎn)自:guyan0319

segmentfault.com/a/1190000018819804

編輯:jq

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

    關(guān)注

    2

    文章

    1309

    瀏覽量

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

    關(guān)注

    19

    文章

    7841

    瀏覽量

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

    關(guān)注

    14

    文章

    10371

    瀏覽量

    91774

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    MIMX9302xxxxD不支持多核中間件嗎?

    ) 對(duì)于多核中間件,它說(shuō): 此可選組件不支持 MIMX9302xxxxD。但是,它確實(shí)支持以下評(píng)估設(shè)備:MCIMX93-EVK,因此可供選擇。選中后,相應(yīng)的支持將添加到配置的包中。 If I select
    發(fā)表于 04-09 06:07

    京東緩存中間件架構(gòu)與緩存內(nèi)核優(yōu)化

    一、京東緩存中間件架構(gòu) 1、背景 在當(dāng)今高并發(fā)、分布式的系統(tǒng)架構(gòu)中,緩存已成為提升應(yīng)用性能、降低數(shù)據(jù)庫(kù)負(fù)載的核心組件。隨著業(yè)務(wù)規(guī)模的擴(kuò)大與系統(tǒng)復(fù)雜度的增加,緩存的使用和管理面臨諸多挑戰(zhàn):部署模式多樣
    的頭像 發(fā)表于 04-03 16:18 ?1829次閱讀
    京東緩存<b class='flag-5'>中間件</b>架構(gòu)與緩存內(nèi)核優(yōu)化

    谷景DLCHX工字電感在智能插座項(xiàng)目中的應(yīng)用

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

    以“網(wǎng)關(guān)中間件”實(shí)現(xiàn)充電樁OCPP 1.6安全配置文件無(wú)縫升級(jí)

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

    博泰車(chē)聯(lián)網(wǎng)攜手產(chǎn)業(yè)伙伴共建天元OS開(kāi)源生態(tài)

    近日,2025中國(guó)汽車(chē)軟件大會(huì)于上海嘉定召開(kāi)。會(huì)上,行業(yè)首個(gè)覆蓋自動(dòng)駕駛?cè)珬5拈_(kāi)源中間件——“天元OS跨域中間件”正式以全棧開(kāi)源的形式發(fā)布。博泰車(chē)聯(lián)作為項(xiàng)目核心共建單位受邀參與,與產(chǎn)業(yè)伙伴共同見(jiàn)證并推動(dòng)中國(guó)智能汽車(chē)基礎(chǔ)軟件邁向開(kāi)
    的頭像 發(fā)表于 12-31 14:41 ?629次閱讀

    黑芝麻智能攜手產(chǎn)業(yè)伙伴共建天元OS開(kāi)源生態(tài)

    2025中國(guó)汽車(chē)軟件大會(huì)期間,行業(yè)首個(gè)覆蓋自動(dòng)駕駛?cè)珬5拈_(kāi)源中間件——天元OS跨域中間件正式全棧開(kāi)源發(fā)布,黑芝麻智能作為共建單位出席啟動(dòng)儀式。
    的頭像 發(fā)表于 12-23 11:34 ?686次閱讀

    Neway電機(jī)方案在實(shí)際應(yīng)用中效果如何?

    Neway電機(jī)方案在實(shí)際應(yīng)用中效果如何?Neway電機(jī)方案是深圳市立維創(chuàng)展科技有限公司推出的電機(jī)驅(qū)動(dòng)與控制系統(tǒng)解決方案,具有高穩(wěn)定性、高性?xún)r(jià)比、小型化等特點(diǎn),Neway電機(jī)方案在實(shí)際應(yīng)用中效果
    發(fā)表于 12-03 09:23

    房產(chǎn)數(shù)據(jù)平臺(tái)安家go獲取地區(qū)列表數(shù)據(jù)的API接口

    如何使用安家go提供的API接口來(lái)獲取地區(qū)列表數(shù)據(jù),包括API端點(diǎn)、請(qǐng)求參數(shù)、響應(yīng)格式以及代碼實(shí)現(xiàn)。我們將逐步引導(dǎo)您完成整個(gè)過(guò)程,確保您能輕松集成到自己的項(xiàng)目中。 1. API概述 安家go的“獲取地區(qū)列表”API是一個(gè)基于RE
    的頭像 發(fā)表于 11-21 14:38 ?511次閱讀
    房產(chǎn)數(shù)據(jù)平臺(tái)安家<b class='flag-5'>go</b>獲取地區(qū)列表數(shù)據(jù)的API接口

    如何選擇適合自己項(xiàng)目的通信協(xié)議評(píng)估工具?

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

    STM32U575VGT6在cubeMX中沒(méi)有FATFS中間件,是不支持嗎?

    STM32U575VGT6在cubeMX中沒(méi)有FATFS中間件,是不支持?還是待開(kāi)發(fā)?現(xiàn)在這塊板子使用FATFS只能自己手動(dòng)移植嗎?
    發(fā)表于 07-30 06:46

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

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

    樹(shù)莓派項(xiàng)目中10款最佳的DIN導(dǎo)軌外殼!

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

    汽車(chē)零部開(kāi)發(fā)項(xiàng)目管理

    汽車(chē)零部開(kāi)發(fā)項(xiàng)目管理是一個(gè)涉及多環(huán)節(jié)、多部門(mén)協(xié)作的復(fù)雜過(guò)程,需從項(xiàng)目啟動(dòng)到交付全流程進(jìn)行科學(xué)規(guī)劃與管控。以下從 核心流程 、 關(guān)鍵要素 、 管理工具 及 挑戰(zhàn)與應(yīng)對(duì)策略 四方面展開(kāi)說(shuō)明: 一、核心
    的頭像 發(fā)表于 06-09 13:26 ?2019次閱讀

    軟件定義汽車(chē)時(shí)代為什么中間件受青睞

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

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

    鋼廠首選,profinet轉(zhuǎn)profibus在煤電項(xiàng)目中的協(xié)議轉(zhuǎn)換解決方案
    的頭像 發(fā)表于 05-06 16:37 ?722次閱讀
    鋼廠首選,profinet轉(zhuǎn)profibus在煤電<b class='flag-5'>項(xiàng)目中</b>的協(xié)議轉(zhuǎn)換解決方案
    宜君县| 大庆市| 正蓝旗| 皮山县| 南城县| 卫辉市| 惠安县| 留坝县| 灵川县| 麻栗坡县| 沙洋县| 广德县| 铅山县| 通海县| 福海县| 庄河市| 米易县| 卢湾区| 铜鼓县| 长阳| 驻马店市| 唐河县| 龙江县| 天峻县| 江安县| 九龙坡区| 云霄县| 潜江市| 方正县| 大方县| 崇信县| 玛沁县| 新乡市| 巴青县| 准格尔旗| 麟游县| 油尖旺区| 杭锦后旗| 茌平县| 修水县| 富蕴县|