路由中间件


中间件设计

在Gaea中,Gin其实是扮演者web引擎的角色,在其基础上,我们的增强功能都“遵循支持可插拔”的思想来开发,所有功能用户可以自由选择开启或关闭
,执行流程示意图如下:
中间件 - 图1

用户可在中间层和hook处增加自定义逻辑
比如,我们把一些基础组件作为一个个独立的中间件来灵活地选择性加载。

全局默认加载

main/main.go

  1. func main() {
  2. //show version
  3. ver := flagutil.GetVersion()
  4. if *ver {
  5. version.Version()
  6. return
  7. }
  8. //init conf
  9. confutil.InitConfig()
  10. defer recovery()
  11. s := ginhttp.NewServer()
  12. engine := s.GetGinEngine()
  13. //全局默认加载中间件
  14. //挂在中间件的位置
  15. //engine.Use()
  16. router.RegisterRouter(engine)
  17. //服务启动前hooks
  18. s.AddServerBeforeFunc(bs.InitLoggerWithConf(), bs.InitTraceLogger("XueYan", "0.1"), bs.InitPerfutil(), bs.InitPprof(), s.InitConfig())
  19. //服务停止hooks
  20. s.AddServerAfterFunc(bs.CloseLogger())
  21. er := s.Serve()
  22. if er != nil {
  23. log.Printf("Server stop err:%v", er)
  24. } else {
  25. log.Printf("Server exit")
  26. }
  27. }

自定义插件

插件是个类型 gin.HandlerFunc, 只要符合此类型的定义即为一个插件! 如下是一个简单的例子

  1. package middleware
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. )
  6. func myMiddleWare() gin.HandlerFunc {
  7. return func(c *gin.Context) {
  8. fmt.Println("xxx")
  9. }
  10. }