beego源码解析之路由

目录

 

简单的例子

路由涉及的重要组件

App

ControllerRegister

ControllerInfo

Tree

ControllerInterface

Controller

路由表注册流程:

路由匹配流程


 

简单的例子

func main() {
    beego.Router("/get", &MainController{})
    beego.Run()
}
​
type MainController struct {
    beego.Controller
}
​
func (c *MainController) Get() {
    c.Data["Website"] = "beego.me"
    c.Data["Email"] = "astaxie@gmail.com"
    c.TplName = "index.tpl"
}

 

1、继承beego.Controller

2、注册路由

3、beego框架启动

 

路由涉及的重要组件

App

beego框架框的开始 beego.Run()

结构如下:

type App struct {
   Handlers *ControllerRegister
   Server   *http.Server
}

1、该实体包含了一个go原生Handler的实现

2、go的原生Server对象

 

ControllerRegister

Handler的具体实现,该实现包含了路由的解析与转发,可以看做是一个go web的 gateway

结构如下:

type ControllerRegister struct {
   routers      map[string]*Tree     //路由表
   enableFilter bool        //标志位,是否有过滤器
   filters      map[int][]*FilterRouter   //文件过滤,int为本文件37行定义的几个变量
   pool         sync.Pool       //对象池
}

 

ControllerInfo

封装的具体路由信息

结构如下:

type controllerInfo struct {
   pattern        string    //调用模式
   controllerType reflect.Type //类型
   methods        map[string]string //支持的方法集合
   handler        http.Handler //原生的handler接口
   runFunction    FilterFunc //过滤方法
   routerType     int //路由类型
}

 

Tree

路由树

type Tree struct {
   //前缀
   prefix string
   //search fix route first
   //不带正则的路由
   fixrouters []*Tree
   //if set, failure to match fixrouters search then search wildcard
   //通配符 如果设置的并且查找 fixrouters失败时会来查找 wildcard
   wildcard *Tree
   //if set, failure to match wildcard search
   //叶子 如果设置并且查找 wildcard失败后会查找 leaves,里面保存了一些正则需要的信息
   leaves []*leafInfo
}

 

ControllerInterface

所有 Controller的通用接口

type ControllerInterface interface {
   Init(ct *context.Context, controllerName, actionName string, app interface{})
   Prepare()
   Get()
   Post()
   Delete()
   Put()
   Head()
   Patch()
   Options()
   Finish()
   Render() error
   XSRFToken() string
   CheckXSRFCookie() bool
   HandlerFunc(fn string) bool
   URLMapping()
}

 

Controller

ControllerInterface的实现,业务层的controller,只需要继承此controller就可以加入路由树中

type Controller struct {
   // context data
   Ctx  *context.Context
   Data map[interface{}]interface{}
​
   // route controller info
   controllerName string
   actionName     string
   methodMapping  map[string]func() //method:routertree
   gotofunc       string
   AppController  interface{}
​
   // template data
   TplName        string
   Layout         string
   LayoutSections map[string]string // the key is the section name and the value is the template name
   TplExt         string
   EnableRender   bool
​
   // xsrf data
   _xsrfToken string
   XSRFExpire int
   EnableXSRF bool
​
   // session
   CruSession session.Store
}

 

路由表注册流程:

beego源码解析之路由

 

 

路由匹配流程

1、请求统一打到ControllerRegister.ServeHTTP(rw http.ResponseWriter , r http.Request)

2、该方法内负责查找路由,分发调用、渲染页面

 

 

上一篇:beego框架与mux库使用体验


下一篇:c#简单操作MongoDB_2.4