Go语言经典库使用分析,未完待续,欢迎扫码关注公众号
flysnow_org
或者网站http://www.flysnow.org/,第一时间看后续系列。觉得有帮助的话,顺手分享到朋友圈吧,感谢支持。
上一篇介绍的Gorilla Handlers中间件,严格来说不能称之为一个库或者框架,他只是一系列包装http.Handler的中间件函数,并且他们之间没有任何关系,也没有定义一种规则如何让我们基于它来开发我们自己的中间件,总之它是孤立的,中间件之间没有关系的。
我们这篇文章介绍的Negroni中间件库,是一个非常经典的库,非常小,但是功能强大,因为他定义了中间件的框架和风格,让我们可以基于它开发出我们自己的中间件,并且可以集成到Negroni中。
Negroni还兼容原生的http.Handler,你完全可以把自己的http.Handler加入到Negroni的中间件链中,Negroni会自动调用他们处理我们的HTTP Request的。
入门介绍
Negroni托管在Github上,你完全可以通过以下方式获得它,然后在你的项目中使用。
|
|
然后我们看个例子,还是基于Gorilla Handler的例子吧,便于理解。
|
|
negroni.Classic()
返回一个Negroni
实例,然后通过这个实例,我们就可以添加一些中间件了。因为Negroni完全兼容http.Handler,所以我们自己对于HTTP Request的真实业务处理也可以作为Negroni的一个中间件。
通过Negroni的Run方法,就可以启动一个服务了,这个Run方法和http.ListenAndServe
是等价的,只不过做了一些处理,比如会从环境变量PORT
里获取服务监听的端口。
运行,然后访问http://localhost:1234
,会看到如下输出:
|
|
这个为什么呢?哦,原来是我们的negroni.Classic()
初始化Negroni
实例的方式,这种方式会默认添加3个中间件。
|
|
一个是Panic Recovery,一个是Log,一个是静态文件服务器。如果你不想使用他们,或者你有自己定义好的可以替代他们的中间件,可以使用New
方法。
|
|
参数是一个可变的中间件处理参数,是否传入一些处理中间件,由你来决定。
Negroni配合路由
Negroni是一个让你更容易的使用中间件的微型库,至于具体的业务处理Handler,需要我们自己来写,不过Negroni强大之处在于,我们可以把我们自己的业务处理Hanlder当做Negroni的中间件,当然路由也不例外,go http mux路由本身就是一种Handler。
|
|
对比前面的示例,稍稍改动了下,通过一个路由处理不同的URL,然后把这个路由作为Negroni中间件的一部分。一般来说,路由器作为Negroni的最后一个路由被添加。
当然路由框架有很多个,如果你不是使用的默认的,你也可以选择其他的,比如Gorilla Mux,那么我们示例可以这么改写。
|
|
从这里可以又可以看到Negroni的灵活性,完全兼容net/http,无缝融合,所以我们也鼓励使用原生的net/http处理库。
动态新增中间件
在创建了一个Negroni实例后,我们可以为它添加中间件,这些被添加的中间件组成一个中间件链,先添加的会被先执行。
中间件的添加,得益于几个Negroni的Use函数,这些函数的功能是一样的,抽象出来的几个Use函数便于我们添加不同类型的中间件。
|
|
除了第1个Use函数,其他三个函数最终都会调用Use函数,把中间件添加到中间件的处理链中。
|
|
从上面的Use函数的实现可以看出,Negroni有两个字段,其中handler是一个切片,用于存储所有的Handler;一个是middleware,用于存储基于Handher构建而成的中间件链。
每次调用Use函数添加中间件,都会重新构建赋值给这两个字段,这样就完成了中间件的添加。
小结
这一篇主要介绍下Negroni的使用,以及路由的配置和中间件的添加,对Negroni有一些大概的了解,下一篇会继续介绍Negroni的处理器Handler,Handler和HandlerFunc之间的转换,如何构建中间件链等。
相关文章推荐
Go语言经典库使用分析(四)| Gorilla Handlers 源代码实现分析
Go语言经典库使用分析(三)| Gorilla Handlers 详细介绍
Go语言经典库使用分析(二)| Gorilla Context
Go语言经典库使用分析,未完待续,欢迎扫码关注公众号
flysnow_org
或者网站http://www.flysnow.org/,第一时间看后续系列。觉得有帮助的话,顺手分享到朋友圈吧,感谢支持。
有疑问加站长微信联系(非本文作者)