内容简介:因为 Golang 内置的假如你不了解 Golang 的 HTTP 中间件机制的话,那么可以把它看成是一个洋葱:每一个中间件都是一层洋葱皮,其中每一个中间件都可以改变请求和响应,我们可以很自然的把不同的业务逻辑放到不同的洋葱皮里,下面看看例子:
因为 Golang 内置的 net/http 天生就支持 HTTP 中间件机制,所以即便不用 gin 之类的 Web 框架,我们也可以写出扩展性很好的 Web 应用。
假如你不了解 Golang 的 HTTP 中间件机制的话,那么可以把它看成是一个洋葱:
通过洋葱看中间件
每一个中间件都是一层洋葱皮,其中每一个中间件都可以改变请求和响应,我们可以很自然的把不同的业务逻辑放到不同的洋葱皮里,下面看看例子:
package main import ( "net/http" ) func foo(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("foo(")) next(w, r) w.Write([]byte(")")) } } func bar(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("bar(")) next(w, r) w.Write([]byte(")")) } } func test(w http.ResponseWriter, r *http.Request) { w.Write([]byte("test")) } func main() { http.Handle("/test", foo(bar(test))) http.ListenAndServe(":8080", nil) }
运行结果显示如下,它形象的说明了中间件的执行过程:
foo(bar(test))
联想一下洋葱的结构,基本就能明白 Golang 的 HTTP 中间件机制了,不过不爽的是构建方式不易扩展,假如中间件很多的话,视觉上会呈现出复杂的嵌套,比如:
middleware(middleware(middleware(middleware(handler))))
我可不想维护这样的代码,下面看看如何简化编码方式:
func main() { http.Handle("/test", new(foo).pipe(bar).process(test)) http.ListenAndServe(":8080", nil) } type middleware func(http.HandlerFunc) http.HandlerFunc type pipeline struct { middlewares []middleware } func new(ms ...middleware) pipeline { return pipeline{append([]middleware(nil), ms...)} } func (p pipeline) pipe(ms ...middleware) pipeline { return pipeline{append(p.middlewares, ms...)} } func (p pipeline) process(h http.HandlerFunc) http.HandlerFunc { for i := range p.middlewares { h = p.middlewares[len(p.middlewares)-1-i](h) } return h }
对比一下在修改代码前后调用方式发生了什么改变,:
- 修改前:foo(bar(test))
- 修改后:new(foo).pipe(bar).process(test)
虽然表面上看好像代码更长了,但是对代码的可维护性而言,这并不是问题的关键,重要的是通过使用 Pipeline 模式,我们把原本嵌套结构改成了链式结构。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 逐行分析Koa中间件机制
- Koa 系列 —— Koa 中间件机制解析
- 学习Golang的HTTP中间件机制
- ThinkPHP 6.0 RC5 发布,多应用模式独立及中间件机制调整
- 消息中间件面试题:消息中间件的高可用
- Django中间件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML5与CSS3基础教程(第8版)
[美] Elizabeth Castro、[美] Bruce Hyslop / 望以文 / 人民邮电出版社 / 2014-5 / 69.00元
本书是风靡全球的HTML和CSS入门教程的最新版,至第6版累积销量已超过100万册,被翻译为十多种语言,长期雄踞亚马逊书店计算机图书排行榜榜首。 第8版秉承作者直观透彻、循序渐进、基础知识与案例实践紧密结合的讲授特色,采用独特的双栏图文并排方式,手把手指导读者从零开始轻松入门。相较第7版,全书2/3以上的内容进行了更新,全面反映了HTML5和CSS3的最新特色,细致阐述了响应式Web设计与移......一起来看看 《HTML5与CSS3基础教程(第8版)》 这本书的介绍吧!