Go语言经典库使用分析,未完待续,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续系列。觉得有帮助的话,顺手分享到朋友圈吧,感谢支持。

上一篇介绍的Gorilla Handlers中间件,严格来说不能称之为一个库或者框架,他只是一系列包装http.Handler的中间件函数,并且他们之间没有任何关系,也没有定义一种规则如何让我们基于它来开发我们自己的中间件,总之它是孤立的,中间件之间没有关系的。

我们这篇文章介绍的Negroni中间件库,是一个非常经典的库,非常小,但是功能强大,因为他定义了中间件的框架和风格,让我们可以基于它开发出我们自己的中间件,并且可以集成到Negroni中。

Negroni还兼容原生的http.Handler,你完全可以把自己的http.Handler加入到Negroni的中间件链中,Negroni会自动调用他们处理我们的HTTP Request的。

入门介绍

Negroni托管在Github上,你完全可以通过以下方式获得它,然后在你的项目中使用。

1

go get -u github.com/urfave/negroni

然后我们看个例子,还是基于Gorilla Handler的例子吧,便于理解。

1234567891011121314151617

//Blog:www.flysnow.org//Wechat:flysnow_orgfunc main() {

n := negroni.Classic()

n.UseHandler(handler())

n.Run(":1234")

}

func handler() http.Handler{

return http.HandlerFunc(myHandler)

}

func myHandler(rw http.ResponseWriter, r *http.Request) {

rw.Header().Set("Content-Type", "text/plain")

io.WriteString(rw,"Hello World")

}

negroni.Classic()返回一个Negroni实例,然后通过这个实例,我们就可以添加一些中间件了。因为Negroni完全兼容http.Handler,所以我们自己对于HTTP Request的真实业务处理也可以作为Negroni的一个中间件。

通过Negroni的Run方法,就可以启动一个服务了,这个Run方法和http.ListenAndServe是等价的,只不过做了一些处理,比如会从环境变量PORT里获取服务监听的端口。

运行,然后访问http://localhost:1234,会看到如下输出:

12

[negroni] 2017-08-20T18:09:47+08:00 | 200 | 591.81µs | localhost:1234 | GET /

[negroni] 2017-08-20T18:09:47+08:00 | 200 | 29.677µs | localhost:1234 | GET /favicon.ico

这个为什么呢?哦,原来是我们的negroni.Classic()初始化Negroni实例的方式,这种方式会默认添加3个中间件。

123

func Classic() *Negroni {

return New(NewRecovery(), NewLogger(), NewStatic(http.Dir("public")))

}

一个是Panic Recovery,一个是Log,一个是静态文件服务器。如果你不想使用他们,或者你有自己定义好的可以替代他们的中间件,可以使用New方法。

123456

func New(handlers ...Handler) *Negroni {

return &Negroni{

handlers: handlers,

middleware: build(handlers),

}

}

参数是一个可变的中间件处理参数,是否传入一些处理中间件,由你来决定。

Negroni配合路由

Negroni是一个让你更容易的使用中间件的微型库,至于具体的业务处理Handler,需要我们自己来写,不过Negroni强大之处在于,我们可以把我们自己的业务处理Hanlder当做Negroni的中间件,当然路由也不例外,go http mux路由本身就是一种Handler。

12345678910111213141516171819202122232425

//Blog:www.flysnow.org//Wechat:flysnow_orgfunc main() {

n := negroni.Classic()

mux := http.NewServeMux()

mux.Handle("/",handler())

mux.HandleFunc("/flysnow", func(rw http.ResponseWriter, r *http.Request) {

io.WriteString(rw,"Blog:www.flysnow.org\n")

io.WriteString(rw,"Wechat:flysnow_org")

})

n.UseHandler(mux)

n.Run(":1234")

}

func handler() http.Handler{

return http.HandlerFunc(myHandler)

}

func myHandler(rw http.ResponseWriter, r *http.Request) {

rw.Header().Set("Content-Type", "text/plain")

io.WriteString(rw,"Hello World")

}

对比前面的示例,稍稍改动了下,通过一个路由处理不同的URL,然后把这个路由作为Negroni中间件的一部分。一般来说,路由器作为Negroni的最后一个路由被添加。

当然路由框架有很多个,如果你不是使用的默认的,你也可以选择其他的,比如Gorilla Mux,那么我们示例可以这么改写。

123456789101112131415

//Blog:www.flysnow.org//Wechat:flysnow_orgfunc main() {

n := negroni.Classic()

router:=mux.NewRouter()

router.Handle("/",handler())

router.HandleFunc("/flysnow", func(rw http.ResponseWriter, r *http.Request) {

io.WriteString(rw,"Blog:www.flysnow.org\n")

io.WriteString(rw,"Wechat:flysnow_org")

})

n.UseHandler(router)

n.Run(":1234")

}

从这里可以又可以看到Negroni的灵活性,完全兼容net/http,无缝融合,所以我们也鼓励使用原生的net/http处理库。

动态新增中间件

在创建了一个Negroni实例后,我们可以为它添加中间件,这些被添加的中间件组成一个中间件链,先添加的会被先执行。

中间件的添加,得益于几个Negroni的Use函数,这些函数的功能是一样的,抽象出来的几个Use函数便于我们添加不同类型的中间件。

1234567

//Blog:www.flysnow.org//Wechat:flysnow_org

Use(handler Handler)

UseFunc(handlerFunc func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc))

UseHandler(handler http.Handler)

UseHandlerFunc(handlerFunc func(rw http.ResponseWriter, r *http.Request))

除了第1个Use函数,其他三个函数最终都会调用Use函数,把中间件添加到中间件的处理链中。

12345678

func (n *Negroni) Use(handler Handler) {

if handler == nil {

panic("handler cannot be nil")

}

n.handlers = append(n.handlers, handler)

n.middleware = build(n.handlers)

}

从上面的Use函数的实现可以看出,Negroni有两个字段,其中handler是一个切片,用于存储所有的Handler;一个是middleware,用于存储基于Handher构建而成的中间件链。

每次调用Use函数添加中间件,都会重新构建赋值给这两个字段,这样就完成了中间件的添加。

小结

这一篇主要介绍下Negroni的使用,以及路由的配置和中间件的添加,对Negroni有一些大概的了解,下一篇会继续介绍Negroni的处理器Handler,Handler和HandlerFunc之间的转换,如何构建中间件链等。

相关文章推荐

Go语言经典库使用分析,未完待续,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续系列。觉得有帮助的话,顺手分享到朋友圈吧,感谢支持。

java体系的中间件适用于go吗,Go语言经典库使用分析(五)| Negroni 中间件(一)...相关推荐

  1. Go语言经典库使用分析(六)| Negroni 中间件(二)

    Go语言经典库使用分析,未完待续,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续系列.觉得有帮助的话,顺手分享到朋友圈吧,感谢支持. 上 ...

  2. Go语言经典库使用分析(五)| Negroni 中间件(一)

    Go语言经典库使用分析,未完待续,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续系列.觉得有帮助的话,顺手分享到朋友圈吧,感谢支持. 上 ...

  3. 第 1 章 JVM 和 Java 体系架构

    第 1 章 JVM 和 Java 体系架构 1.JVM 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM ...

  4. JVM和Java体系架构

    前言 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却无从下手. 新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就JJ了. ...

  5. 01 Java体系

    JAVA知识体系 自从Java1.2版本发布以来,Sun每次发布新的Java版本,都将Java分为三个体系,分别是:J2ME(Java 2,Micro Edition).J2SE(Java 2,Sta ...

  6. java体系学习总结记录——超长篇

    Java体系学习 一.主流语言介绍 1.c语言:底层编程,比如嵌入式.病毒开发等应用,可以替代汇编语言来开发系统程序:高层应用可以开发从操作系统到各种应用软件.是一种面向过程的语言. 2.java:广 ...

  7. 第 1 章 一 JVM 和 Java 体系架构 (虚拟机介绍、字节码、Java跨平台性)

    第 1 章 JVM 和 Java 体系架构 1.JVM 前言 作为Java工程师, 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却 ...

  8. 【Java】2.Java体系架构(SE的组成概念图)

    Sun公司在1999年公布了新的Java体系架构,该架构根据不同级别的应用开发区分了不同的应用版本:J2SE(Java 2 Platform,Standard Edition),J2EE(Enterp ...

  9. Java体系学习书籍推荐,BAT 面试官 如何面试

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 以下 ...

最新文章

  1. 全文翻译(四) TVM An Automated End-to-End Optimizing Compiler
  2. python 字符串数组互转
  3. iphone怎么投屏到电脑_怎么把笔记本无线投屏到电视?好用的电脑投屏电视办法...
  4. 关于javascript中的回调函数
  5. mysql之存储引擎和文件配置
  6. python指针引用的区别_C++基础:指针和引用的区别
  7. 资源打包后项目中的文件
  8. Excel字符串截取(leftrightmid)
  9. win10安装tomcat9
  10. JDBC--调用函数与存储过程
  11. css属性之box-shadow
  12. android的opencv调试,Android opencv 2.3.1 调试及应用(第一篇)
  13. 免费的客户订单及商品管理系统
  14. react-custom-scrollbars滚动组件
  15. 江苏开启“金环”对话会:政府“牵线”助环保项目与金融“联姻”
  16. 音频线是什么 音频线如何连接
  17. 在QQ音乐巅峰榜年度榜单中,听懂国人2022年的音乐记忆!
  18. URP Bokeh DOF 分析
  19. WPS Word表格转成文字或文字制成表格的快捷方法
  20. com.sun.proxy.$Proxy0 cannot be cast to com.chan.dao.IUserDao报错问题

热门文章

  1. 膜拜!阿里内部学习的五大深入理解Java虚拟机PDF,真的强
  2. 查看电脑支持的最大内存数。
  3. python用turtle画一个旋转的风车
  4. 直击美团“远程面试”现场,面试官竟反问:你真懂数据库事务吗?
  5. 3轮全向轮正解---41
  6. 上传文件到服务器指令,上传文件到远程服务器的命令
  7. 1001: 植树问题
  8. 车站安防巡逻机器人未来发展趋势是什么?
  9. [刷题]2017百度之星资格赛 - 度度熊与邪恶大魔王
  10. 奇瑞鲍思语畅谈奇瑞未来发展,前途一片光明