01 . Go框架之Beego簡介部署及程式流程分析
阿新 • • 發佈:2020-07-26
#### Beego簡介
> beego是一個使用Go語言來開發WEB引用的GoWeb框架,該框架起始於2012年,由一位中國的程式設計師編寫並進行公開,其目的就是為大家提供一個高效率的web應用開發框架。該框架採用模組封裝,使用簡單,容易學習。方便技術開發者快速學習並進行實際開發。對程式設計師來說,beego掌握起來非常簡單,只需要關注業務邏輯實現即可,框架自動為專案需求提供不同的模組功能。
>
> 在對beego框架有了一個簡單基本的瞭解之後,我們給大家介紹一下beego的一些特性。
##### Beego框架的主要特性
1)**簡單化:**RESTful支援,MVC模型;可以使用bee工具來提高開發效率,比如監控程式碼修改進行熱編譯,自動化測試程式碼,以及自動化打包部署等豐富的開發除錯功能。
2)**智慧化:**beego框架封裝了路由模組,支援智慧路由,智慧監控,並可以監控記憶體消耗,CPU使用以及goroutine的執行狀況,方便開發者對線上應用進行監控分析。
3)**模組化:**beego根據功能對程式碼進行節耦封裝,形成了Session,Cache,Log,配置解析,效能監控,上下文操作,ORM等獨立的模組,方便開發者進行使用。
4)**高效能:**beego採用Go原生的http請求,goroutine的併發效率應付大流量的Web應用和API應用。
`beego的幾個特性`
> 一方面在面試過程中,如果有面試官問起大家關於goweb開發的相關知識的時候,有可能問beego框架有優勢或者有什麼特點,這個時候需要大家能夠對beego框架這些特點做一個介紹;
>
>
>
> 另一方面,咱們在後面實際的學習和編碼過程中,大家感受一下這些特性在實際專案中為我們帶來的便利和高效。
#### beego安裝
我們使用go get命令來進行beego的安裝。
`注意`
> 在安裝的時候,有一點大家要注意,beego框架要求Go 語言版本1.1+以上,這個我們大家的版本應該至少也是1.9的吧,應該都沒有。或者大家現在在命令列中,執行go version檢視一下自己的go語言版本,如下所示:
##### 新增環境變數
```go
cat .bash_profile
export GOROOT=/usr/local/go
export GOARCH=amd64
export GOOS=darwin
export GOPATH=/Users/youmen/Go_wunai
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOPATH/bin
```
##### 安裝beego
```go
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
ulimit -n 5000
go get -u github.com/astaxie/beego
go get -u github.com/beego/bee
bee new beego
cd ${GOPATH}/src
// cd進入專案目錄
// 輸入go mod init
bee run
// 如果想編譯成linux可以直接執行的二進位制檔案
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build hello.go
```
![](https://img2020.cnblogs.com/blog/1871335/202007/1871335-20200726145927676-972824783.png)
#### 命令列工具Bee
> 現在,嘗試來進行對程式碼進行修改,就簡單的新增一行列印日誌:beego.Info("程式碼修改")。這個時候,如果我們要想讓程式碼生效,必須把原來正在執行的程式停止,然後重新執行編碼和執行命令,我們來實際嘗試一下。
>
> 經過我們的嘗試,我們可以發現,確實第二次的重新啟動的程式打印出了兩條後臺日誌,這說明我們修改的程式碼生效了。
##### bee簡介
> bee是一個開發工具,是協助Beego框架開發專案時進行建立專案,執行專案,熱部署等相關的專案管理的工具。beego是原始碼,負責開發,bee是工具,負責構建和管理專案。介紹beego的特性的時候說過其中一點beego支援程式碼熱部署吧。所謂熱部署就是,當修改程式碼的時候,可以不用停止服務重新啟動,內建的beego就能夠實時感知原始碼程式編碼,並進行實時生效,這就是熱部署,這樣就大大方便了開發人員和維護人員要頻繁的進行服務停止,服務重啟的過程。
##### Bee安裝
> 如同beego一樣,如果要使用bee,首先要進行安裝,同樣的道理,先使用go get命令安裝bee工具。bee安裝命令:
```go
go get github.com/beego/bee
```
##### Bee功能命令
> 安裝結束以後,進入到**GOPATH**對應的目錄中,然後進入到bin目錄下,可以看到有bee這個可執行檔案,這就是安裝的bee工具的可執行檔案,在該目錄中,我們在終端中執行以下bee命令,然後回車,會發現列出很多關於bee的用法,如下圖:
##### new命令
```go
// bee new ProjectName
```
> 該命令表示新建一個全新的web專案,有一點需要注意:該命令必須在src目錄下執行,才能生效,自動生成web專案的目錄結構。如果在其他目錄下面執行bee new命令,也同樣會是在src目錄下面生成對應新專案的目錄結構,這是bee工具在構建專案的時候預設尋找建立的目錄。
##### api命令
```go
// bee api ProjectNames
```
> 該命令表示用來建立開發API應用。很多使用者寫前端的後臺介面也是通過go來寫,因此bee專門提供了一個寫api介面應用的命令。通過目錄結構可以看到,和Web專案相比,API專案少了static和views目錄,多了一個test目錄,test是用來進行寫測試用例程式碼的。
##### run命令
```go
// bee run
```
> 命令用來執行專案,並且能夠通過監控檔案系統,實時進行程式碼的熱部署更新。也就是,我們程式碼邏輯進行了修改,不用停止應用,在前端頁面就能看到改變。
##### pack命令
```go
// bee pack
```
> pack命令用來發布應用的時候的打包操作,該命令會把專案大包成zip包,然後我們就可以在部署的時候直接把大包後的專案上傳到伺服器,然後解壓進行部署。
##### version命令
```go
// bee version
```
> Version命令來檢視當前bee,beego,go的版本。
#### 使用Bee工具
> 常見的幾個bee工具命令就是上面的幾個,立即來練習使用一下。開啟命令列終端,進入到GOPATH所對應的目錄,然後進入到src目錄中。
##### 建立專案
> 使用bee run命令來新建一個案例專案,比如我們新建一個BeegoDemo2的專案,我們執行命令:bee new BeegoDemo2,命令執行效果如下:
```go
bee new test
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.11.0
2020/07/25 16:35:17 WARN ▶ 0001 You current workdir is not inside $GOPATH/src.
2020/07/25 16:35:17 INFO ▶ 0002 Creating application...
create /Users/youmen/Go_wunai/src/test/
create /Users/youmen/Go_wunai/src/test/conf/
create /Users/youmen/Go_wunai/src/test/controllers/
create /Users/youmen/Go_wunai/src/test/models/
create /Users/youmen/Go_wunai/src/test/routers/
create /Users/youmen/Go_wunai/src/test/tests/
create /Users/youmen/Go_wunai/src/test/static/
create /Users/youmen/Go_wunai/src/test/static/js/
create /Users/youmen/Go_wunai/src/test/static/css/
create /Users/youmen/Go_wunai/src/test/static/img/
create /Users/youmen/Go_wunai/src/test/views/
create /Users/youmen/Go_wunai/src/test/conf/app.conf
create /Users/youmen/Go_wunai/src/test/controllers/default.go
create /Users/youmen/Go_wunai/src/test/views/index.tpl
create /Users/youmen/Go_wunai/src/test/routers/router.go
create /Users/youmen/Go_wunai/src/test/tests/default_test.go
create /Users/youmen/Go_wunai/src/test/main.go
2020/07/25 16:35:17 SUCCESS ▶ 0003 New application successfully created!
```
##### 專案結構
```go
cd ${GOPATH}/src
tree test
test
├── conf
│ └── app.conf
├── controllers
│ └── default.go
├── main.go
├── models
├── routers
│ └── router.go
├── static
│ ├── css
│ ├── img
│ └── js
│ └── reload.min.js
├── tests
│ └── default_test.go
└── views
└── index.tpl
```
##### 執行專案
```go
bee run
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.11.0
2020/07/25 16:37:40 INFO ▶ 0001 Using 'test' as 'appname'
2020/07/25 16:37:40 INFO ▶ 0002 Initializing watcher...
go: finding module for package github.com/astaxie/beego
go: found github.com/astaxie/beego in github.com/astaxie/beego v1.12.2
test/controllers
test/routers
2020/07/25 16:37:43 SUCCESS ▶ 0003 Built Successfully!
2020/07/25 16:37:43 INFO ▶ 0004 Restarting 'test'...
2020/07/25 16:37:43 SUCCESS ▶ 0005 './test' is running...
2020/07/25 16:37:44.611 [I] [asm_amd64.s:1373] http server Running on http://:8080
```
1111 ![](https://img2020.cnblogs.com/blog/1871335/202007/1871335-20200726150018918-517165386.png)
#### 執行流程分析
> Go語言執行的時候是執行main包下面的init函式,main函式依次執行。因此,先找到main.go檔案。
```go
package main
import (
_ "beego_demo1/routers"
"github.com/astaxie/beego"
)
func main() {
beego.Info("Beego_Demo1")
beego.Run("127.0.0.1:8080")
}
```
> 上就是main.go檔案內容,那麼程式碼如何執行呢?首先,import匯入了兩個包,一個是routers,一個是beego。而在routers包前面,可以看到有一個“_”,這表明是引入routers包,並執行init方法。這裡涉及一個知識點,就是Go語言的執行過程,這裡給大家一張程式執行流程圖
![](https://img2020.cnblogs.com/blog/1871335/202007/1871335-20200726150038221-1588386108.png)
`根據上圖,可以得知程式首先到routers包下執行init方法。到router.go裡面看一下具體的程式碼:`
> 可以看到在router.go檔案中有一個init方法,看到beego.Router()這句程式碼。router表示的是路由的意思,這個函式的功能是對映 URL 到 controller,第一個引數是 URL (使用者請求的地址),這裡註冊的是 /,也就是訪問的不帶任何引數的 URL,第二個引數是對應的 Controller,即將把請求分發到那個控制器來執行相應的邏輯,現在去這裡設定的MainController中去看一下有什麼方法:
```go
package controllers
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (c *MainController) Get() {
c.Data["Website"] = "youmen.me"
c.Data["Email"] = "[email protected]"
c.TplName = "index.tpl"
}
```
> MainController結構體及函式宣告在default.go檔案中。而這裡就看到一個Get方法,方法中有三行程式碼。
>
> 上文在瀏覽器中訪問的是:http://localhost:8080,這是一個get請求,請求到了後臺以後,什麼請求引數都沒有,因此,就會被“/”攔截,執行到MainController中的程式碼,因為是get請求,所以這裡自動找到Get函式並進行執行。
>
> 在get函式裡面,有三句程式碼,前兩句c.Data[]= ""表示設定返回的資料欄位及內容,最後一句c.TplName表示設定處理該請求指向某個模板檔案,這裡指向了index.tpl,那麼index.tpl檔案在哪裡呢?可以檢視專案目錄結構,在views下面,views下面存放一些模板檔案。
##### 模板檔案
> 簡單解釋一下,通常的頁面都是使用靜態的html+css+js等這些靜態程式碼來進行頁面的佈局,頁面效果控制等,而把頁面的資料使用變量表示,這樣,在進行頁面展示的時候,就能夠自動的填充頁面裡面的變數的值;這些靜態的程式碼檔案統稱為模板檔案。每個模板檔案就是像一個模板一樣,樣式效果都固定,只是根據資料不一樣進行渲染和展示。
##### Beego.Run()邏輯
> init方法分析完畢後,程式會繼續往下執行,就到了main函式,在main函式中執行:beego.Run()程式碼。分析一下Run程式碼的邏輯,在Run方法內部,主要做了幾件事:
```go
// 1)解析配置檔案,也就是我們的app.conf檔案,比如埠,應用名稱等資訊。
// 2)檢查是否開啟session,如果開啟session,就會初始化一個session物件。
// 3)是否編譯模板,beego框架會在專案啟動的時候根據配置把views目錄下的所有模板進行預編譯,
// 然後存放在map中,這樣可以有效的提高模板執行的效率,不需要進行多次編譯。
// 4)監聽服務埠。根據app.conf檔案中的埠配置,啟動監聽。
// post