首页 >> 知识

Golang中完成复杂的Http Middleware

  • 知识
  • 2026-07-20 19:30:19
  • 点击次数:11

本文次要针对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言语

本文由作文网知识栏目发布,感谢您对作文网的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“Golang中完成复杂的Http Middleware