地址:https://github.com/Codexiaoyi/linweb
这是一个系列文章:
初衷
大概在半年前,在学习了Golang一段时间后,想着提升一下自己。恰巧看到了极客兔兔的 七天用Go从零实现系列 的Web框架篇。于是产生了自己学习写一个web框架的想法,一方面提升自己的代码设计能力,另一方面能够更加全面的了解一个web框架所需要的功能。
当然,linweb框架不追求极致性能(毕竟现在成熟的web框架性能已经非常好了),仅追求自己喜欢的编程范式,更多参考.net core的开发方式。
基本功能
在Golang的世界中,有许许多多优秀的Web框架。常见的有:
- gin https://github.com/gin-gonic/gin
- beego https://github.com/beego/beego
- iris https://github.com/kataras/iris
- chi https://github.com/go-chi/chi
- ......
在这其中,当前使用最广泛的应该就是gin了。gin在性能和编程规范方面都有着不错的表现,加上许多衍生的教学项目及使用简单等原因,是多数人入门Go语言Web编程的首选。
根据gin和极客兔兔的博客,我认为最最基础的Web框架需要实现的几个功能:
- http服务解析
- 路由解析(Router)
- 上下文(Context)
- 中间件(Middleware)
在个人平时写Web项目时,有些自己感兴趣的功能也会加上:
- 依赖注入(Injector)
- 模型验证与模型映射(model --- validate、map)
- 应用内缓存(cache)
面向接口
受到 go-micro(https://github.com/asim/go-micro)启发,我们将完全面向接口开发。
也就是我们所有的功能全部做接口抽象,主流程完全依赖于抽象接口。这样可以实现功能之间互相解耦,并且可以在不修改主流程代码的情况下自定义实现。也许!你不喜欢写的代码,觉得我的实现写的很烂,那么就可以自己写相关抽象的实现,并且无缝接入主流程中。
接口即文档
相关接口定义在 **/interfaces **文件夹中,这样还能顺便做到,接口即文档!开发者只需要看接口就可以理解并应用功能。
项目结构
项目的大致文件目录结构也非常简单,适合新手:
|-- docs 文档相关文件
|-- examples 示例项目
|-- interfaces 接口抽象的定义
|-- pkg 相关功能模块的接口实现
|-- cache
|-- context
|-- injector
|-- middleware
|-- model
|-- router
|-- test 主流程测试、mock测试文件等