将 Echo 文件中,统一管理。
本文完整代码:GitHub
问题
使用 echo 框架,会发现路由需手动写在 main()
中并指定 HandlerFunc
,混合了路由和业务逻辑,当业务变得繁杂时,有上百个路由时,管理起来很麻烦。反观 beego 会集中将路由配置到一个文件,分离了路由与业务,方便新增和修改。
解决方案
手动注册处理器和中间件
将路由和中间件封装到一个配置文件中,在文件中指定路由名称、请求方法及其对应 HandlerFunc
、MiddlewareFunc
的完整路径,在 server 启动时为路由注册处理器和中间件即可。
实现效果
将路由和中间件写入 conf.toml 中的 [routes]
[validators]
两个数组,在请求 /user
路由时:
main 包下 recevier 为
CommonValidator
的CheckSession()
中间件,做 Session 检测等验证main 包下 recevier 为
UserInfoHandler
的GetUserInfo()
处理器,做请求的业务处理
若真只有一个 /user
路由,直接在 server.go 中实现处理器和中间件即可。但在实际项目中往往有上百个路由和中间件,此时使用 conf.toml 来集中管理,将十分的方便。
写入路由
路由配置文件有两种格式可选:JSON 和 toml
使用 JSON
Routes()
返回 echo 框架加载的全部路由,导出为 JSON 时格式如下:
1 | [ |
优点:结构清晰明了;缺点:有很多路由时,同样会有很多 method、path 和 handler 等字段名,浪费大量的存储空间。
使用 toml
toml 格式的文件能完美解决 JSON 存在的存储浪费的问题,同样的 /users 的路由,可直接存为:
1 | [routes] |
实现
封装后的 echo.Echo
1 | // 封装后的 Echo Server |
读取配置文件并初始化 MyEchoServer
1 | // 读取配置 |
将 route handler 反射到 HandlerFunc 实例
1 | // 为 server 注册路由的处理器 |
将 validator handler 反射到 MiddwareFunc 实例
1 | // 为 server 注册中间件的处理器 |
启动 Server
1 | // 启动 Server |
至此就完成了封装的全部工作。
总结
其实封装仅三步:读取配置数组,使用反射生成为路由指定的 HandlerFunc
和 MiddlewareFunc
实例,手动发布。
倒是反射用得不太熟,下篇文章学习下就学习下它吧 :)