01 . Go框架之Beego簡介部署及程式流程分析

men發表於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語言版本,如下所示:

新增環境變數
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
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 

命令列工具Bee

現在,嘗試來進行對程式碼進行修改,就簡單的新增一行列印日誌:beego.Info("程式碼修改")。這個時候,如果我們要想讓程式碼生效,必須把原來正在執行的程式停止,然後重新執行編碼和執行命令,我們來實際嘗試一下。

經過我們的嘗試,我們可以發現,確實第二次的重新啟動的程式列印出了兩條後臺日誌,這說明我們修改的程式碼生效了。

bee簡介

bee是一個開發工具,是協助Beego框架開發專案時進行建立專案,執行專案,熱部署等相關的專案管理的工具。beego是原始碼,負責開發,bee是工具,負責構建和管理專案。介紹beego的特性的時候說過其中一點beego支援程式碼熱部署吧。所謂熱部署就是,當修改程式碼的時候,可以不用停止服務重新啟動,內建的beego就能夠實時感知原始碼程式編碼,並進行實時生效,這就是熱部署,這樣就大大方便了開發人員和維護人員要頻繁的進行服務停止,服務重啟的過程。

Bee安裝

如同beego一樣,如果要使用bee,首先要進行安裝,同樣的道理,先使用go get命令安裝bee工具。bee安裝命令:

go get github.com/beego/bee
Bee功能命令

安裝結束以後,進入到GOPATH對應的目錄中,然後進入到bin目錄下,可以看到有bee這個可執行檔案,這就是安裝的bee工具的可執行檔案,在該目錄中,我們在終端中執行以下bee命令,然後回車,會發現列出很多關於bee的用法,如下圖:

new命令
// bee new ProjectName

該命令表示新建一個全新的web專案,有一點需要注意:該命令必須在src目錄下執行,才能生效,自動生成web專案的目錄結構。如果在其他目錄下面執行bee new命令,也同樣會是在src目錄下面生成對應新專案的目錄結構,這是bee工具在構建專案的時候預設尋找建立的目錄。

api命令
// bee api ProjectNames

該命令表示用來建立開發API應用。很多使用者寫前端的後臺介面也是通過go來寫,因此bee專門提供了一個寫api介面應用的命令。通過目錄結構可以看到,和Web專案相比,API專案少了static和views目錄,多了一個test目錄,test是用來進行寫測試用例程式碼的。

run命令
// bee run	

命令用來執行專案,並且能夠通過監控檔案系統,實時進行程式碼的熱部署更新。也就是,我們程式碼邏輯進行了修改,不用停止應用,在前端頁面就能看到改變。

pack命令
// bee pack

pack命令用來發布應用的時候的打包操作,該命令會把專案大包成zip包,然後我們就可以在部署的時候直接把大包後的專案上傳到伺服器,然後解壓進行部署。

version命令
// bee version

Version命令來檢視當前bee,beego,go的版本。

使用Bee工具

常見的幾個bee工具命令就是上面的幾個,立即來練習使用一下。開啟命令列終端,進入到GOPATH所對應的目錄,然後進入到src目錄中。

建立專案

使用bee run命令來新建一個案例專案,比如我們新建一個BeegoDemo2的專案,我們執行命令:bee new BeegoDemo2,命令執行效果如下:

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!
專案結構
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
執行專案
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

執行流程分析

Go語言執行的時候是執行main包下面的init函式,main函式依次執行。因此,先找到main.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語言的執行過程,這裡給大家一張程式執行流程圖

根據上圖,可以得知程式首先到routers包下執行init方法。到router.go裡面看一下具體的程式碼:

可以看到在router.go檔案中有一個init方法,看到beego.Router()這句程式碼。router表示的是路由的意思,這個函式的功能是對映 URL 到 controller,第一個引數是 URL (使用者請求的地址),這裡註冊的是 /,也就是訪問的不帶任何引數的 URL,第二個引數是對應的 Controller,即將把請求分發到那個控制器來執行相應的邏輯,現在去這裡設定的MainController中去看一下有什麼方法:

package controllers

import (
	"github.com/astaxie/beego"
)

type MainController struct {
	beego.Controller
}

func (c *MainController) Get() {
	c.Data["Website"] = "youmen.me"
	c.Data["Email"] = "163@.com"
	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方法內部,主要做了幾件事:

// 1)解析配置檔案,也就是我們的app.conf檔案,比如埠,應用名稱等資訊。
// 2)檢查是否開啟session,如果開啟session,就會初始化一個session物件。
// 3)是否編譯模板,beego框架會在專案啟動的時候根據配置把views目錄下的所有模板進行預編譯,
// 然後存放在map中,這樣可以有效的提高模板執行的效率,不需要進行多次編譯。
// 4)監聽服務埠。根據app.conf檔案中的埠配置,啟動監聽。

// postman

相關文章