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

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=//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 //: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"] = "[email protected]"
	c.TplName = "index.tpl"
}

MainController結構體及函數聲明在default.go文件中。而這裡就看到一個Get方法,方法中有三行代碼。

上文在瀏覽器中訪問的是://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
Tags: