golang实现web中间件的一些思考

yzq1979 · · 6698 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

    最近陆续看了golang的Martini框架,也试用了,这个山寨自node.js的Express框架和最新的koa框架的golang框架,

同样具有低耦合的特点,不过还是担忧其性能,因为核心采用了reflect反射技术。

    golang的http包用Hander、handerfuc这些来解决中间件的问题,比如说验证,日志等,采取的是一层层封装的方式,

好比洋葱。这样写出来的代码的缺点是耦合度高。如果中间件的顺序或者名字变换,则有很多代码需要改动。

     为了降低依赖,则需让代码不要直接引用前一层的名称,加入第三方的一个间接层。reflect可行,但是reflect反射是基于对对象毫不了解,采取笨办法逐步找出对象类型(结构体)的各个函数的名称然后调用。

     如果采取以下方法似乎可以更好解决这个问题:

     每个待添加的组件都遵守一个简单的接口约定,比如将需要导出为外界调用的函数都保持在一个类似函数指针数组的数据结构中,这样,框架对于要启用的组件会知道如何去利用,有利于两者的协同。然后,若启用该组件,则可将这个数组和别的组件的数组放在一起,web应用依次调用。这种比较底层的方式,效率或者可以更高。

    为进一步考虑提高效率,若组件运行时间比较长,可采用gorutine + channel 的方式,来达到各个中间件filter 模式并行执行的效果? golang的net/http底层已经采用了gorutine处理并发连接,不知会不会冲突?

    koa框架核心的co是基于ES6新规范中的yield关键字来实现协程的效果,这点和gorutine + channel比较类似。


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:yzq1979

查看原文:golang实现web中间件的一些思考

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6698 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传