1、beego简介
1.1 Beego简介
Beego
是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个
RESTful 的框架,主要设计灵感来源于tornado、sinatra和 flask 这三个框架,但是结合了 Go 本身的一些特性
(interface、struct 嵌入等)而设计的一个框架。支持如下特性:
- MVC
- REST
- 智能路由
- 日志调试
- 配置管理
- 模板自动渲染
- layout 设计
- 中间件插入逻辑
- 方便的 JSON/XML 服务
Beego
目前我们是朝着一种支持中小企业为主,以提高工作效率为主要目标的框架。
1.2 Beego的架构
Beego的整体设计架构如下所示:
架构图1:
架构图2:
Beego 是基于八大独立的模块构建的,是一个高度解耦的框架。当初设计 Beego 的时候就是考虑功能模块化,用
户即使不使用 Beego 的 HTTP 逻辑,也依旧可以使用这些独立模块,例如:你可以使用 cache 模块来做你的缓存
逻辑;使用日志模块来记录你的操作信息;使用 config 模块来解析你各种格式的文件。所以 Beego 不仅可以用于
HTTP 类的应用开发,在你的 socket 游戏开发中也是很有用的模块,这也是 Beego 为什么受欢迎的一个原因。
1.3 Beego的执行逻辑
既然 Beego 是基于这些模块构建的,那么它的执行逻辑是怎么样的呢?beego 是一个典型的 MVC 架构,它的执
行逻辑如下图所示:
1.4 Beego项目结构
一般的Beego项目的目录如下所示:
├── conf
│ └── app.conf
├── controllers
│ ├── admin
│ └── default.go
├── main.go
├── models
│ └── models.go
├── static
│ ├── css
│ ├── ico
│ ├── img
│ └── js
└── views
├── admin
└── index.tpl
从上面的目录结构我们可以看出来 M(models 目录)、V(views 目录)和 C(controllers 目录)的结构,
main.go
是入口文件。
你可以通过 bee
工具来新建项目。
1.5 Beego相关文档和参考
Beego地址:https://github.com/beego/beego
Beego中文文档:https://beego.gocn.vip/beego/zh/
Beego官方文档:https://github.com/beego/beedoc
Beego开发手册:https://www.bookstack.cn/read/beego/
Beego v2.0 开发手册:https://www.bookstack.cn/read/beego-2.0-zh/
Beego Example:https://github.com/beego/beego-example
Beego Web:https://github.com/beego/beeweb
beego框架教程:http://www.codebaoku.com/beego/beego-index.html
2、Beego安装
2.1 安装前提
Beego
依赖于 go 开发环境,并且在当前版本,Beego
依赖于go mod
特性。
安装 go 环境可以参考前面的文章,这里必须保证go环境的正常使用和相关环境变量都已经正常配置。
这里保证 GO 版本在 1.16
之上,本文使用的是1.18.4
。
在 Beego 应用的开发过程中,我们会需要用到一些命令:
- go mod 命令
- go get 命令
- go install 命令
同时强烈建议使用相关的配套工具bee
。
请注意,在Beego V2
之后,我们要求使用go mod
特性,请务必确保开启了go mod
特性,即设置了
GO111MODULE=on
。同时,如果你是在中国大陆境内,我们建议你同时设置GORPOXY
。
Go语言GOPROXY设置
1、首先开启go module
go env -w GO111MODULE=on // Windows
export GO111MODULE=on // Linux
2、配置goproxy
:
阿里配置:
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct // Windows
export GOPROXY=https://mirrors.aliyun.com/goproxy/,direct // Linux
七牛云配置:
go env -w GOPROXY=https://goproxy.cn,direct // Windows
export GOPROXY=https://goproxy.cn,direct // Linux
注意:
Go 1.13
设置了默认的GOSUMDB= sum.golang.org
,是用来验证包的有效性。这个网址由于墙的原因可能无法
访问,所以可以使用下面命令来关闭:
go env -w GOSUMDB=off // Windows
export GOSUMDB=off // Linux
2.2 Linux or Windows下安装
Beego
从2013年发布beego 1.0.0
,到目前最新的版本为beego 2.0.x
。
Beego的安装只需要执行下面的命令安装Bee
:
$ go install github.com/beego/bee/v2@latest
执行完go install
之后会在$GOBIN
目录下生成bee/bee.exe
可执行程序。
# Linux下
[root@zsx ~]# ls $GOBIN
bee go gofmt grpcurl protoc-gen-govalidators protoc-gen-swagger
dlv go-bindata grpcui protoc-gen-go protoc-gen-grpc-gateway
# Windows下
C:\Users\zhangshixing>dir %GOBIN%
查看版本:
[root@zsx ~]# bee version
2023/02/18 17:18:06.650 [D] init global config instance failed. If you do not use this, just ignore it. open conf/app.conf: no such file or directory
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v2.0.4
├── GoVersion : go1.18.4
├── GOOS : linux
├── GOARCH : amd64
├── NumCPU : 1
├── GOPATH : /home/zhangshixing/go_work_space
├── GOROOT : /home/zhangshixing/go
├── Compiler : gc
└── Date : Saturday, 18 Feb 2023
接下来,我们来尝试启动一个hello world
的例子。在这个例子里面,我们将使用Bee
工具来创建hello world
项目。
2.3 创建项目
执行创建项目的命令:
[root@zsx src]# bee new hello
2023/02/18 17:26:05.053 [D] init global config instance failed. If you do not use this, just ignore it. open conf/app.conf: no such file or directory
2023/02/18 17:26:05 INFO ▶ 0001 Generate new project support go modules.
2023/02/18 17:26:05 INFO ▶ 0002 Creating application...
create /home/zhangshixing/go_work_space/src/hello/go.mod
create /home/zhangshixing/go_work_space/src/hello/
create /home/zhangshixing/go_work_space/src/hello/conf/
create /home/zhangshixing/go_work_space/src/hello/controllers/
create /home/zhangshixing/go_work_space/src/hello/models/
create /home/zhangshixing/go_work_space/src/hello/routers/
create /home/zhangshixing/go_work_space/src/hello/tests/
create /home/zhangshixing/go_work_space/src/hello/static/
create /home/zhangshixing/go_work_space/src/hello/static/js/
create /home/zhangshixing/go_work_space/src/hello/static/css/
create /home/zhangshixing/go_work_space/src/hello/static/img/
create /home/zhangshixing/go_work_space/src/hello/views/
create /home/zhangshixing/go_work_space/src/hello/conf/app.conf
create /home/zhangshixing/go_work_space/src/hello/controllers/default.go
create /home/zhangshixing/go_work_space/src/hello/views/index.tpl
create /home/zhangshixing/go_work_space/src/hello/routers/router.go
create /home/zhangshixing/go_work_space/src/hello/tests/default_test.go
create /home/zhangshixing/go_work_space/src/hello/main.go
2023/02/18 17:26:05 SUCCESS ▶ 0003 New application successfully created!
这会在当前目录下创建一个名叫hello
的文件夹,该文件夹的目录结构如下。
[root@zsx src]# tree hello/
hello/
├── conf
│ └── app.conf
├── controllers
│ └── default.go
├── go.mod
├── main.go
├── models
├── routers
│ └── router.go
├── static
│ ├── css
│ ├── img
│ └── js
│ └── reload.min.js
├── tests
│ └── default_test.go
└── views
└── index.tpl
10 directories, 8 files
而后进入文件夹:
[root@zsx src]# cd hello/
而后我们执行go mod tidy
命令,来生成go.sum
文件。
[root@zsx hello]# go mod tidy
go: downloading github.com/beego/beego/v2 v2.0.1
go: downloading github.com/prometheus/client_golang v1.7.0
go: downloading golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58
go: downloading github.com/elazarl/go-bindata-assetfs v1.0.0
go: downloading github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d
go: downloading github.com/mitchellh/mapstructure v1.3.3
go: downloading gopkg.in/yaml.v2 v2.2.8
go: downloading github.com/prometheus/common v0.10.0
go: downloading github.com/prometheus/procfs v0.1.3
go: downloading golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f
go: downloading golang.org/x/mod v0.3.0
go: downloading google.golang.org/protobuf v1.23.0
该命令会生成GOPATH/pkg
目录,并且下载相应的依赖包。
而后,我们尝试启动,如果没有错误的话,你会看到类似的输出:
[root@zsx hello]# bee run
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v2.0.4
2023/02/18 17:33:02 INFO ▶ 0001 Using 'hello' as 'appname'
2023/02/18 17:33:02 INFO ▶ 0002 Initializing watcher...
github.com/beego/beego/v2
github.com/beego/beego/v2/core/utils
github.com/beego/beego/v2/core/admin
......
golang.org/x/tools/go/packages
github.com/beego/beego/v2/server/web
hello/controllers
hello/routers
hello
2023/02/18 17:33:18 SUCCESS ▶ 0003 Built Successfully!
2023/02/18 17:33:18 INFO ▶ 0004 Restarting 'hello'...
2023/02/18 17:33:18 SUCCESS ▶ 0005 './hello' is running...
2023/02/18 17:33:20.659 [I] [parser.go:413] generate router from comments
2023/02/18 17:33:20.659 [I] [server.go:241] http server Running on http://:8080
如果你启动不成功,请先确认自己的 8080
端口是否被占用了。
访问http://localhost:8080
:
后台信息打印:
......
2023/02/18 17:36:15.322 [D] [router.go:955] | 127.0.0.1| 200 | 2.349161ms| match| GET / r:/
2023/02/18 17:36:15.543 [D] [router.go:955] | 127.0.0.1| 200 | 31.328µs| match| GET /static/js/reload.min.js
......
这个项目的整体工作流程:
1、首先我们导入了包 github.com/beego/beego/v2/server/web
。我们知道 Go 语言里面被导入的包会按照深
度优先的顺序去执行导入包的初始化(变量和 init 函数),beego 包中会初始化一个 BeeAPP 的应用和一些参
数。
2、定义 Controller,这里我们定义了一个 struct 为 MainController
,充分利用了 Go 语言的组合的概念,匿名
包含了 web.Controller
,这样我们的 MainController
就拥有了 web.Controller
的所有方法。
3、定义 RESTful 方法,通过匿名组合之后,其实目前的 MainController
已经拥有了 Get
、Post
、Delete
、
Put
等方法,这些方法是分别用来对应用户请求的 Method 函数,如果用户发起的是 POST 请求,那么就执行
Post
函数。所以这里我们定义了 MainController
的 Get
方法用来重写继承的 Get
函数,这样当用户发起
GET 请求的时候就会执行该函数。
4、定义 main 函数,所有的 Go 应用程序和 C 语言一样都是 main 函数作为入口,所以我们这里定义了我们应用
的入口。
5、Router 注册路由,路由就是告诉 beego,当用户来请求的时候,该如何去调用相应的 Controller,这里我们
注册了请求 /
的时候,请求到 MainController
。这里我们需要知道,Router 函数的两个参数函数,第一个是
路径,第二个是 Controller 的指针。
6、Run 应用,最后一步就是把在步骤 1 中初始化的 BeeApp 开启起来,其实就是内部监听了 8080 端口:Go 默
认情况会监听你本机所有的 IP 上面的 8080 端口。