最近陆续看了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比较类似。
有疑问加站长微信联系(非本文作者)