Golang中完成复杂的Http Middleware

综合 · 2026-08-02 01:08:17

本文次要针对Golang的中完杂内置库 net/http 做了复杂的扩大年夜大年夜大年夜大年夜 ,经由过程添加中心件的成复编制完成了管道(Pipeline)编制,多么的中完杂益处是各模块之间是低耦合的 ,契合单一职责绳尺 ,成复可以很矫捷的中完杂经由过程中心件的编制添加一些下场到管道中 ,一次哀告和照顾在管道中的成复奉行过程以下

起首, 我定义了三个测试的中心件 Middleware1,2,3 以下

func Middleware1(next http.Handler) http.Handler { 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 		fmt.Println("M1 in")		next.ServeHTTP(w, r)		fmt.Println("M1 out")	})}func Middleware2(next http.Handler) http.Handler { 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 		fmt.Println("M2 in")		next.ServeHTTP(w, r)		fmt.Println("M2 out")	})}func Middleware3(next http.Handler) http.Handler { 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 		fmt.Println("M3 in")		next.ServeHTTP(w, r)		fmt.Println("M3 out")	})}

这里中心件的进参和出参的圭表类型都是 http.Handler, 然后在 next.ServeHTTP() 的前后分袂输进了 In 和 Out.

接上往  ,定义一个 Pipeline 的中完杂编制,里面独霸嵌套的成复编制, 独霸了上面定义的三个测试的中心件.

func Pipeline(next http.Handler) http.Handler { 	return Middleware1(Middleware2(Middleware3(next)))}

然后还需求营业代码 ,这里我定义了 LoginHandler 和 RegisterHandler 两浅近例

func LoginHandler(w http.ResponseWriter,中完杂 r *http.Request) { 	fmt.Println("Login...")	w.Write([]byte("Login..."))}func RegisterHandler(w http.ResponseWriter, r *http.Request) { 	fmt.Println("Register...")	w.Write([]byte("Register..."))}

末尾改削法度圭表类型的 main 函数, 在 Login 接口上独霸上面添加过中心件的 Pipeline

func main() { 	http.Handle("/Login", Pipeline(http.HandlerFunc(LoginHandler)))	http.Handle("/Register", http.HandlerFunc(RegisterHandler))	http.ListenAndServe(":8080", nil)}

启动法度圭表类型后 ,访谒 http://localhost:8080/Login,成复 法度圭表类型的输进以下 ,这和本文最上面的中完杂管道的流程图是齐截的 ,然后访谒 Register 接口,成复 独霸台没有输进信息,当然也不会奉行任何中心件。中完杂

如今已完成了中心件的成复机制 ,可是中完杂,上面添加中心件是用嵌套的编制 ,这类编制不克不及说不太优雅,只能说特别很是的Low,接上往我们需求对管道举办优化

type Chain struct { 	middlewares []func(handler http.Handler) http.Handler}func Pipeline(next http.Handler) http.Handler { 	//return Middleware1(Middleware2(Middleware3(next)))	return AddMiddlewares(Middleware1,Middleware2,Middleware3).Then(next)} func AddMiddlewares(m ...func(handlerFunc http.Handler) http.Handler) Chain { 	c := Chain{ }	c.middlewares = append(c.middlewares,m...)	return c}func (c Chain) Then(next http.Handler) http.Handler { 	for i := range c.middlewares { 		prev := c.middlewares[len(c.middlewares)-1-i]		next = prev(next)	}	return next} 

起首定义了一个Chain 的struct ,用来领受添加到管道中的中心件 ,在 AddMiddlewares() 函数中,领受了多个Handle, 然后组装到 Chain 对象并前去, 接上往调用 Then() 函数, 把管道中的中心件和营业的Handler 联络相干起来。在中心件的独霸编制上, 这两种编制都是一样的 ,只需求调用 Pipeline() 编制就好了 。

本文在go web中复杂的完成了中心件的机制 ,多么带来的益处也是不问可知的,当然社区也有一些成熟的 middleware 组件 ,包含 Gin 一些Web框架中也包含了 middleware 相干的下场, 希看对您有效.

到此这篇关于Golang中完成复杂的Http Middleware的文

本文次要针对Golang的内置库 net/http 做了复杂的扩大年夜大年夜大年夜大年夜,经由过程添加中心件的编制完成了管道(Pipeline)编制 ,多么的益处是各模块之间是低耦合的  ,契合单一职责绳尺 ,可以很矫捷的经由过程中心件的编制添加一些下场到管道中,一次哀告和照顾在管道中的奉行过程以下

起首, 我定义了三个测试的中心件 Middleware1,2,3 以下

func Middleware1(next http.Handler) http.Handler { 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 		fmt.Println("M1 in")		next.ServeHTTP(w, r)		fmt.Println("M1 out")	})}func Middleware2(next http.Handler) http.Handler { 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 		fmt.Println("M2 in")		next.ServeHTTP(w, r)		fmt.Println("M2 out")	})}func Middleware3(next http.Handler) http.Handler { 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 		fmt.Println("M3 in")		next.ServeHTTP(w, r)		fmt.Println("M3 out")	})}

这里中心件的进参和出参的圭表类型都是 http.Handler, 然后在 next.ServeHTTP() 的前后分袂输进了 In 和 Out.

接上往 ,定义一个 Pipeline 的编制 ,里面独霸嵌套的编制, 独霸了上面定义的三个测试的中心件.

func Pipeline(next http.Handler) http.Handler { 	return Middleware1(Middleware2(Middleware3(next)))}

然后还需求营业代码 ,这里我定义了 LoginHandler 和 RegisterHandler 两浅近例

func LoginHandler(w http.ResponseWriter, r *http.Request) { 	fmt.Println("Login...")	w.Write([]byte("Login..."))}func RegisterHandler(w http.ResponseWriter, r *http.Request) { 	fmt.Println("Register...")	w.Write([]byte("Register..."))}

末尾改削法度圭表类型的 main 函数, 在 Login 接口上独霸上面添加过中心件的 Pipeline

func main() { 	http.Handle("/Login", Pipeline(http.HandlerFunc(LoginHandler)))	http.Handle("/Register", http.HandlerFunc(RegisterHandler))	http.ListenAndServe(":8080", nil)}

启动法度圭表类型后 ,访谒 http://localhost:8080/Login, 法度圭表类型的输进以下,这和本文最上面的管道的流程图是齐截的  ,然后访谒 Register 接口, 独霸台没有输进信息,当然也不会奉行任何中心件。

如今已完成了中心件的机制,可是 ,上面添加中心件是用嵌套的编制 ,这类编制不克不及说不太优雅,只能说特别很是的Low ,接上往我们需求对管道举办优化

type Chain struct { 	middlewares []func(handler http.Handler) http.Handler}func Pipeline(next http.Handler) http.Handler { 	//return Middleware1(Middleware2(Middleware3(next)))	return AddMiddlewares(Middleware1,Middleware2,Middleware3).Then(next)} func AddMiddlewares(m ...func(handlerFunc http.Handler) http.Handler) Chain { 	c := Chain{ }	c.middlewares = append(c.middlewares,m...)	return c}func (c Chain) Then(next http.Handler) http.Handler { 	for i := range c.middlewares { 		prev := c.middlewares[len(c.middlewares)-1-i]		next = prev(next)	}	return next} 

起首定义了一个Chain 的struct,用来领受添加到管道中的中心件 ,在 AddMiddlewares() 函数中 ,领受了多个Handle, 然后组装到 Chain 对象并前去, 接上往调用 Then() 函数, 把管道中的中心件和营业的Handler 联络相干起来 。在中心件的独霸编制上, 这两种编制都是一样的  ,只需求调用 Pipeline() 编制就好了。

本文在go web中复杂的完成了中心件的机制 ,多么带来的益处也是不问可知的,当然社区也有一些成熟的 middleware 组件,包含 Gin 一些Web框架中也包含了 middleware 相干的下场, 希看对您有效.

到此这篇关于Golang中完成复杂的Http Middleware的文Go言语

文章推荐:

德约科维奇不肯为了比赛接种疫苗 强逼接种将推迟复出

设计趋势抢先知 !智能对话时代来临:GUI正在向CUI演变

原神万叶传说义务三宝箱职位攻略

奥比岛手游小耶落叶堆找不到措置编制

2020全英羽毛球赛谌龙出局 不敌李梓嘉无缘男单四强

洛克王国灵瑞朱雀技能表

分享三款打谱软件,契合初学者和专业人士

VLC播放器内置文件转换下场,轻松转换视频格式

皇马签约姆巴佩的希看愈来愈除夜 姆巴佩或不跟巴黎续约

百度SEO内链布局直接影响百度蜘蛛爬行的路径

Norton PartitionMagic独霸指南,无损扩除夜C盘空间

奥比岛手游欢欣乐乐喜悦爱好家谜底攻略

热门浏览