Go框架解析-beego
前言
也许beego框架在国内应该是众多PHPer转go的首选,因为beego的MVC、ORM、完善的中文文档让PHPer们得心应手,毫无疑问我也是。这种感觉就像当年入门PHP时使用ThinkPHP一样。
也许随着你的认知的提升,你会讨厌现在东西,比如某一天你可能慢慢的开始讨厌beego,你会发现go语言里包的真正意义,你开始反思MVC真的适合go吗,或者你开始觉着ORM在静态语言里的鸡肋,等等。我只想说:“也许你成长了~”。但是这些都不重要,每一个受欢迎的事物自然有我们值的学习的地方。今天这篇文章很简单,像一篇笔记,记录了我这几天抽空读beego源码的记录。
如何读一个框架?
毫无疑问读go的框架和PHP框架也是一样的:
- 配置加载:如何加载配置文件的。
- 路由:分析框架如何通过URI执行对应业务的。
- ORM:ORM如何实现的。
这里(1.)和(3.)无非就是加载个文件和sql解析器的实现,我就忽略了,重点就看看路由的实现。
安装
简单带过:
// Step1: 安装beego |
代码分析
go有自己实现的http包,大多go框架也是基于这个http包,所以看beego之前我们先补充或者复习下这个知识点。如下:
go如何启动一个http server
package main |
ListenAndServe是对http.Server的进一步封装,除了上面的方式,还可以使用http.Server直接启服务,这个需要设置Handler,这个Handler要实现Server.Handler这个接口。当请求来了会执行这个Handler的ServeHTTP
方法,如下:
package main |
beego路由分析
接下里我们开始看beego的代码。拿访问"http://127.0.0.1:8080/"
来说,对于beego代码来说有三个关键点,分别如下:
启动:main.go ->
beego.Run()
注册路由:routers\router.go ->
beego.Router("/", &controllers.MainController{})
控制器:controllers\default.go ->
Get()
下面来看3个关键点的详细分析:
beego.Run()主要的工作
// github.com/astaxie/beego/beego.go |
// github.com/astaxie/beego/app.go |
接着去找这个Handler的ServeHTTP方法,通过上面的这段代码app.Server.Handler = app.Handlers
,我们找到了下面的定义,Handler即是ControllerRegister
的值,所以每次亲求来了就会去执行ControllerRegister.ServeHTTP(rw http.ResponseWriter, r *http.Request)
。
// src/github.com/astaxie/beego/app.go |
通过我们追beego.Run()
的代码,目前我们得到的结论就是:
- 使用的http包启动的服务
- 没有使用
http.HandleFun()
的定义路由策略,而是注册Handler的方式
所以beego就是通过beego.Router()
自己管理路由,如果http请求来了,回调ControllerRegister.ServeHTTP(rw http.ResponseWriter, r *http.Request)
方法,在ControllerRegister.ServeHTTP(rw http.ResponseWriter, r *http.Request)
方法中去匹配路由并执行对应的controller 也就是beegoControllerInterface
类型的控制器的方法,比如RESTFUL或者自定义啊等。
beego.Router() 如何注册路由
首先路由文件是如何加载的,我们发现在main.go
文件里导入了路由包:
package main |
上面我们启动了http服务,接着关键就是beego.Router()
如何注册路由了。追了下代码如下:
beego.Router() |
最后就是在*Tree.AddRouter()
完成了路由注册,这里的代码逻辑暂时就先不看了,至此这个beego框架的流程就其本理顺了,最后我们在回头总结下整个流程如下图:
备注:go导入包相当于入栈过程,先import后执行init
《Go框架解析》系列文章链接如下: