十分钟学会用 Go 编写 Web 中间件

栏目: IT技术 · 发布时间: 4年前

内容简介:中间件(通常)是一小段代码,它们接收一个请求,对其进行处理,每个中间件只处理一件事情,完成后将其传递给另一个中间件或最终处理程序,这样就做到了程序的解耦。如果没有中间件那么我们必须在最终的处理程序中来完成这些处理操作,这无疑会造成处理程序的臃肿和代码复用率不高的问题。中间件的一些常见用例是请求日志记录,画外音:上面这段描述中间件的文字,跟我很早前在

中间件(通常)是一小段代码,它们接收一个请求,对其进行处理,每个中间件只处理一件事情,完成后将其传递给另一个中间件或最终处理程序,这样就做到了程序的解耦。如果没有中间件那么我们必须在最终的处理程序中来完成这些处理操作,这无疑会造成处理程序的臃肿和代码复用率不高的问题。中间件的一些常见用例是请求日志记录, Header 操纵、 HTTP 请求认证和 ResponseWriter 劫持等等。

十分钟学会用  <a href='https://www.codercto.com/topics/6127.html'>Go</a>  编写 Web 中间件

画外音:上面这段描述中间件的文字,跟我很早前在 Laravel源码解析之中间件 写的几乎一样(其实这图也是从那里拿过来的)。再次说明做开发时间长了以后掌握一些编程的思想有时候比掌握一门编程语言更重要,这不咱们就又用Go来写中间件了。

创建中间件

接下来我们用 Go 创建中间件,中间件只将 http.HandlerFunc 作为其参数,在中间件里将其包装并返回新的 http.HandlerFunc 供服务器服务复用器调用。这里我们创建一个新的类型 Middleware ,这会让最后一起链式调用多个中间件变的更简单。

下面的中间件通用代码模板让我们平时编写中间件变得更容易。

中间件代码模板

中间件是使用装饰器模式实现的,下面的中间件通用代码模板让我们平时编写中间件变得更容易,我们在自己写中间件的时候只需要往样板里填充需要的代码逻辑即可。

使用中间件

我们创建两个中间件,一个用于记录程序执行的时长,另外一个用于验证请求用的是否是指定的 HTTPMethod ,创建完后再用定义的 Chain 函数把 http.HandlerFunc 和应用在其上的中间件链起来,中间件会按添加顺序依次执行,最后执行到处理函数。完整的代码如下:

运行程序后会打开浏览器访问 http://localhost:8080 会有如下输出:

到这里怎么用 Go 编写和使用中间件就讲完,也就十分钟吧。不过这里更多的是探究实现原理,那么在生产环境怎么自己使用编写的这些中间件呢,我们接着往下看。

使用 gorilla/mux 应用中间件

上面我们探讨了如何创建中间件,但是使用上每次用 Chain 函数链接多个中间件和处理程序还是有些不方便,而且在上一篇文章中我们已经开始使用 gorilla/mux 提供的 Router 作为路由器了。好在 gorrila.mux 支持向路由器添加中间件,如果发现匹配项,则按照添加中间件的顺序执行中间件,包括其子路由器也支持添加中间件。

gorrila.mux 路由器使用 Use 方法为路由器添加中间件, Use 方法的定义如下:

它可以接受多个 mux.MiddlewareFunc 类型的参数, mux.MiddlewareFunc 的类型声明为:

跟我们上面定义的 Middleware 类型很像也是一个函数类型,不过函数的参数和返回值都是 http.Handler 接口,在《 深入学习用 Go 编写 HTTP 服务器 》中我们详细讲过 http.Handler 它 是 net/http 中定义的接口用来表示处理 HTTP 请求的对象,其对象必须实现 ServeHTTP 方法。我们把上面说的中间件模板稍微更改下就能创建符合 gorrila.mux 要求的中间件:

接下来,我们把上面自定义的两个中间件进行改造,然后应用到我们一直在使用的 http_demo 项目上,为了便于管理在项目中新建 middleware 目录,两个中间件分别放在 log.gohttp_method.go

然后在我们的路由器中进行引用:

再次编译启动运行程序后访问

从控制台里可以看到,记录了这个请求的处理时长:

到这里我们探究完了编写Web中间件的过程和原理,在实际开发中只需要根据自己的需求按照我们给的中间件代码模板编写中间件即可,在编写中间件的时候也要注意他们的职责范围,不要所有逻辑都往里放。

前文回顾:

深入学习用 Go 编写 HTTP 服务器

使用gorilla/mux增强Go HTTP服务器的路由能力

在公众号里关键字回复 gohttp03 可以拿到本篇文件中完整的源代码,喜欢我的文章帮忙转发点赞。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图说区块链

图说区块链

徐明星、田颖、李霁月 / 中信出版社 / 2017-7-1 / 59.00元

区块链,如瑞士仪表般精密,如互联网般惊世骇俗,它在以神一般的节奏颠覆社会。 当新兴技术来临时,你可以选择规避——如果明天也可以规避的话。区块链也一样。 作为一个现象级概念,金融科技创新在过去几年迎来了奇点式发展。其中最引人注目的当属区块链技术。区块链技术正在动摇全球金融基础设施,它是全球顶级银行和其他金融机构重点追逐的领域。毫无疑问,区块链是未来5年最有前景的行业之一。 《图说区......一起来看看 《图说区块链》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码