轉載本文需註明出處:微信公衆號EAWorld,違者必究。
引言:
Beego 是一個快速開發 Go 應用的 HTTP 框架,他能夠用來快速開發 API、Web 及後端服務等各類應用,是一個 RESTful 的框架,主要設計靈感來源於 tornado、sinatra 和 flask 這三個框架,可是結合了 Go 自己的一些特性(interface、struct 嵌入等)而設計的一個框架。
目錄:
1. Beego框架架構介紹
2. Beego框架項目結構
3. Beego框架優點
1. Beego框架架構介紹
介紹beego框架以前先來了解下Go語言吧。
Go 是一個開源的編程語言,它能讓構造簡單、可靠且高效的軟件變得容易。
Go是從2007年底由Robert Griesemer, Rob Pike, Ken Thompson主持開發,後來還加入了Ian Lance Taylor, Russ Cox等人,並最終於2009年11月開源,在2012年早些時候發佈了Go 1穩定版本。如今Go的開發已是徹底開放的,而且擁有一個活躍的社區。
Go 語言被設計成一門應用於搭載 Web 服務器,存儲集羣或相似用途的巨型中央服務器的系統編程語言。
對於高性能分佈式系統領域而言,Go 語言無疑比大多數其它語言有着更高的開發效率。它提供了海量並行的支持,這對於遊戲服務端的開發而言是再好不過了。
Golang安裝和使用請參考https://golang.google.cn/doc/
什麼是Beego?
Beego 是一個快速開發 Go 應用的 HTTP 框架,他能夠用來快速開發 API、Web 及後端服務等各類應用,是一個 RESTful 的框架,主要設計靈感來源於 tornado、sinatra 和 flask 這三個框架,可是結合了 Go 自己的一些特性(interface、struct 嵌入等)而設計的一個框架。
Beego是基於八大獨立的模塊之上構建的,是一個高度解耦的框架。當初設計Beego的時候就是考慮功能模塊化,用戶即便不使用Beego的http邏輯,也是可使用其餘獨立模塊,例如你可使用cache模塊來作你的緩存邏輯,使用logs模塊來記錄你的操做信息,使用config模塊來解析你各類格式的文件,使用orm操做數據庫等。各個模塊就相似積木,堆積起來就是功能強大的Beego框架。
運行邏輯能夠拆分如下幾段:
1. main文件監聽啓動端口接收請求。
2. 請求通過路由和參數過濾功能轉發給綁定url的controller處理。
3. Controller可調用輔助工具包、model、session管理、日誌處理、緩存處理模塊進行相應的業務處理。其中model(orm)直接操做數據庫。
4. 業務處理完成,返回響應或視圖給請求方。
2. Beego框架項目結構
最小的Beego項目
package main
import (
"github.com/astaxie/beego" //導入beego依賴
)
type MainController struct {
beego.Controller //匿名包含beego.Controller
}
func (this *MainController) Get() {
this.Ctx.WriteString("hello world") //實現get響應
}
func main() {
beego.Router("/", &MainController{}) //設置路由
beego.Run() //啓動Beego
}
把上面的代碼保存爲main.go,而後經過命令行進行編譯並執行:
$ go build main.go
$ ./hello
啓動以後打開http://127.0.0.1:8080瀏覽器顯示「hello world」
代碼詳解:
一、首先引入了包github.com/astaxie/beego, beego包中會初始化一個BeeAPP的應用,初始化一些參數。
二、定義Controller,這裏定義了一個struct爲MainController,充分利用了Go語言的組合的概念,匿名包含了beego.Controller,這樣MainController就擁有了beego.Controller的全部方法。
三、定義RESTFul方法,經過匿名組合以後,MainController已經擁有了Get、Post、Delete、Put等方法,這些方法是分別用來對應用戶請求的Method函數,若是用戶發起的是POST請求,那麼就執行Post函數。因此這裏咱們定義了MainController的Get方法用來重寫繼承的Get函數,這樣當用戶GET請求的時候就會執行該函數。
四、定義main函數,全部的Go應用程序和C語言同樣都是Main函數做爲入口,因此這裏定義應用的入口。
五、Router註冊路由,路由就是告訴beego,當用戶來請求的時候,該如何去調用相應的Controller,這裏註冊了請求/的時候,請求到MainController。需注意,Router函數的兩個參數函數,第一個是路徑,第二個是Controller的指針。
六、Run應用,內部監聽了8080端口:Go默認狀況會監聽你本機全部的IP上面的8080端口。
安裝beego
go get github.com/astaxie/beego
bee 工具是一個爲了協助快速開發 beego 項目而建立的項目,經過 bee 您能夠很容易的進行 beego 項目的建立、熱編譯、開發、測試、和部署。
go get github.com/beego/bee
當咱們安裝好bee以後,bee命令默認是放在GOPATH/bin裏面,因此須要把GOPATH/bin裏面,因此須要把GOPATH/bin 添加到您的環境變量中。
bee經常使用的命令:
bee new <項目名> :建立一個項目,這樣的項目通常是web項目
須要注意的是這個命令須在 $GOPATH/src 下執行。
Beego目錄結構
├── conf //配置文件
│ └── app.conf
├── controllers //控制器
│ ├── admin
│ └── default.go
├── main.go //項目入口
├── models //模型
│ └── models.go
├── routers //路由
│ └──router.go
├── static //靜態文件
│ ├── css
│ ├── ico
│ ├── img
│ └── js
└── views //界面模板
├── admin
└── index.tpl
Beego框架是一個典型的mvc框架。M(models 目錄)、V(views 目錄)和 C(controllers 目錄)的結構。
路由設置
路由的主要功能是實現從請求地址到實現的方法,beego中封裝了Controller,因此路由是從路徑到ControllerInterface的過程,ControllerInterface的方法有以下:
type ControllerInterface interface {
Init(ct *Context, cn string)
Prepare()
Get()
Post()
Delete()
Put()
Head()
Patch()
Options()
Finish()
Render() error
}
這些方法beego.Controller都已經實現了,因此只要用戶定義struct的時候匿名包含就能夠了。固然更靈活的方法就是用戶能夠去自定義相似的方法,而後實現本身的邏輯。
用戶能夠經過以下的方式進行路由設置:
beego.Router("/user", &controllers.UserController{})
beego.Router("/bill", &controllers.BillController{})
beego.Router("/log", &controllers.LogController{})
爲了用戶更加方便的路由設置,beego參考了sinatra的路由實現,支持多種方式的路由:
beego.Router("/api/:id([0-9]+)", &controllers.RController{})
自定義正則匹配 //匹配 /api/123 :id= 123
beego.Router("/news/:all", &controllers.RController{})
全匹配方式 //匹配 /news/path/to/123.html :all= path/to/123.html
beego.Router("/user/:username([\w]+)", &controllers.RController{})
正則字符串匹配 //匹配 /user/astaxie :username = astaxie
beego.Router("/download/*.*", &controllers.RController{})
*匹配方式 //匹配 /download/file/api.xml :path= file/api :ext=xml
beego.Router("/download/ceshi/*", &controllers.RController{})
*全匹配方式 //匹配 /download/ceshi/file/api.json :splat=file/api.json
beego.Router("/int", &controllers.RController{})
int類型設置方式 //匹配 :id爲int類型,框架幫你實現了正則([0-9]+)
beego.Router("/:hi:string", &controllers.RController{})
string類型設置方式 //匹配 :hi爲string類型。框架幫你實現了正則([\w]+)
Controller設置
beego.Controller實現了接口beego.ControllerInterface,beego.ControllerInterface定義了以下函數:
type ControllerInterface interface {
Init(ct *Context, cn string)
Prepare()
Get()
Post()
Delete()
Put()
Head()
Patch()
Options()
Finish()
Render() error
}
Init(ct *Context, cn string)
這個函數主要初始化了Context、相應的Controller名稱,模板名,初始化模板參數的容器Data
Prepare()
這個函數主要是爲了用戶擴展用的,這個函數會在下面定義的這些Method方法以前執行,用戶能夠重寫這個函數實現相似用戶驗證之類。
Get()
若是用戶請求的HTTP Method是GET, 那麼就執行該函數,默認是403,用戶繼承的子struct中能夠實現了該方法以處理Get請求.
Post()
若是用戶請求的HTTP Method是POST, 那麼就執行該函數,默認是403,用戶繼承的子struct中能夠實現了該方法以處理Post請求.
Delete()
若是用戶請求的HTTP Method是DELETE, 那麼就執行該函數,默認是403,用戶繼承的子struct中能夠實現了該方法以處理Delete請求.
Put()
若是用戶請求的HTTP Method是PUT, 那麼就執行該函數,默認是403,用戶繼承的子struct中能夠實現了該方法以處理Put請求.
Head()
若是用戶請求的HTTP Method是HEAD, 那麼就執行該函數,默認是403,用戶繼承的子struct中能夠實現了該方法以處理Head請求.
Patch()
若是用戶請求的HTTP Method是PATCH, 那麼就執行該函數,默認是403,用戶繼承的子struct中能夠實現了該方法以處理Patch請求.
Options()
若是用戶請求的HTTP Method是OPTIONS, 那麼就執行該函數,默認是403,用戶繼承的子struct中能夠實現了該方法以處理Options請求.
Finish()
這個函數實在執行完相應的http Method方法以後執行的,默認是空,用戶能夠在子Strcut中重寫這個函數,執行例如數據庫關閉,清理數據之類的工做。
Render() error
這個函數主要用來實現渲染模板,若是beego.AutoRender爲true的狀況下才會執行。
Session模塊
Beego內置了session模塊,目前session模塊支持的後端引擎包括memory、file、mysql、redis四中,用戶也能夠根據相應的interface實現本身的引擎。
Beego中使用session至關方便,只要在main入口函數中設置以下:
beego.SessionOn = true
或者經過配置文件配置以下:
sessionon = true
session有幾個方便的方法:
SetSession(name string, value interface{})
GetSession(name string) interface{}
DelSession(name string)
例子:
func (this *MainController) Get() {
v := this.GetSession("asta")
if v == nil {
this.SetSession("asta", int(1))
this.Data["num"] = 0
} else {
this.SetSession("asta", v.(int)+1)
this.Data["num"] = v.(int)
}
this.TplNames = "index.tpl"
}
session操做主要有設置session、獲取session、刪除session。
固然你要能夠經過下面的方式本身控制相應的邏輯這些邏輯:
sess:=this.StartSession()
defer sess.SessionRelease()
sess對象具備以下方法:
sess.Set()
sess.Get()
sess.Delete()
sess.SessionID()
可是我仍是建議你們採用SetSession、GetSession、DelSession三個方法來操做,避免本身在操做的過程當中資源沒釋放的問題。
關於Session模塊使用中的一些參數設置:
SessionOn
設置是否開啓Session,默認是false,配置文件對應的參數名:sessionon
SessionProvider
設置session的引擎,默認是memory,目前支持還有file、mysql、redis等,配置文件對應的參數名:sessionprovider
SessionName
設置cookies的名字,Session默認是保存在用戶的瀏覽器cookies裏面的,默認名是beegosessionID,配置文件對應的參數名是:sessionname
SessionGCMaxLifetime
設置Session過時的時間,默認值是3600秒,配置文件對應的參數:sessiongcmaxlifetime
SessionSavePath
設置對應file、mysql、redis引擎的保存路徑或者連接地址,默認值是空,配置文件對應的參數:sessionsavepath
當SessionProvider爲file時,SessionSavePath是隻保存文件的目錄,以下所示:
beego.SessionProvider = "file"
beego.SessionSavePath = "./tmp"
當SessionProvider爲mysql時,SessionSavePath是連接地址,採用go-sql-driver,以下所示:
beego.SessionProvider = "mysql"
beego.SessionSavePath = "username:password@protocol(address)/dbname?param=value"
(左右滑動查看所有代碼)
當SessionProvider爲redis時,SessionSavePath是redis的連接地址,採用了redigo,以下所示:
beego.SessionProvider = "redis"
beego.SessionSavePath = "127.0.0.1:6379"
Cache模塊
Beego內置了一個cache模塊,實現了相似memcache的功能,緩存數據在內存中。
經過beego.NewBeeCache初始化一個對象,而後設置過時時間,開啓過時檢測,在業務邏輯中就能夠經過以下的接口進行增刪改的操做:
Get(name string) interface{}
Put(name string, value interface{}, expired int) error
Delete(name string) (ok bool, err error)
IsExist(name string) bool
例子:
var (
urllist *beego.BeeCache
)
func init() {
urllist = beego.NewBeeCache()
urllist.Every = 0 //不過時
urllist.Start()
}
func (this *ShortController) Post() {
var result ShortResult
longurl := this.Input().Get("longurl")
beego.Info(longurl)
result.UrlLong = longurl
urlmd5 := models.GetMD5(longurl)
beego.Info(urlmd5)
if urllist.IsExist(urlmd5) {
result.UrlShort = urllist.Get(urlmd5).(string)
} else {
result.UrlShort = models.Generate()
err := urllist.Put(urlmd5, result.UrlShort, 0)
if err != nil {
beego.Info(err)
}
err = urllist.Put(result.UrlShort, longurl, 0)
if err != nil {
beego.Info(err)
}
}
this.Data["json"] = result
this.ServeJson()
}
日誌模塊
Beego默認有一個初始化的BeeLogger對象輸出內容到stdout中,你能夠經過以下的方式設置本身的輸出:
beego.SetLogger(*log.Logger)
能夠經過下面的方式設置不一樣的日誌分級:
beego.SetLevel(beego.LevelError)
日誌等級的排序以下:LevelTrace、LevelDebug、LevelInfo、LevelWarning、 LevelError、LevelCritical
不一樣級別的log日誌函數:
Trace(v ...interface{})
Debug(v ...interface{})
Info(v ...interface{})
Warn(v ...interface{})
Error(v ...interface{})
Critical(v ...interface{})
例子:
fd,err := os.OpenFile("/var/log/beeapp/beeapp.log", os.O_RDWR|os.O_APPEND, 0644)
if err != nil {
beego.Critical("openfile beeapp.log:", err)
return
}
lg := log.New(fd, "", log.Ldate|log.Ltime)
beego.SetLogger(lg)
配置
beego支持解析ini文件, beego默認會解析當前應用下的conf/app.conf文件
經過這個文件你能夠初始化不少beego的默認參數:
appname = beepkg
httpaddr = "127.0.0.1"
httpport = 9090
runmode ="dev"
autorender = false
autorecover = false
viewspath = "myview"
你能夠在配置文件中配置應用須要用的一些配置信息,例以下面所示的數據庫信息:
mysqluser = "root"
mysqlpass = "rootpass"
mysqlurls = "127.0.0.1"
mysqldb = "beego"
那麼你就能夠經過以下的方式獲取設置的配置信息:
beego.AppConfig.String("mysqluser")
beego.AppConfig.String("mysqlpass")
beego.AppConfig.String("mysqlurls")
beego.AppConfig.String("mysqldb")
AppConfig支持以下方法:
Bool(key string) (bool, error)
Int(key string) (int, error)
Int64(key string) (int64, error)
Float(key string) (float64, error)
String(key string) string
ORM模塊
目前beego-orm支持的數據有:
-MySQL:https://github.com/go-sql-driver/mysql
-PostgreSQL:https://github.com/lib/pq
-Sqlite3:https://github.com/mattn/go-sqlite
beego-orm的相關特性:
- 支持 Go 的全部類型存儲
- 輕鬆上手,採用簡單的 CRUD 風格
- 自動 Join 關聯表
- 跨數據庫兼容查詢
- 容許直接使用 SQL 查詢/映射
- 嚴格完整的測試保證 ORM 的穩定與健壯
示例請參考beego官方:https://beego.me/docs/mvc/model/orm.md
3.Beego框架優點
優勢:
1)使用簡單:經過命令行建立beego項目;監控代碼修改進行熱編譯;自動化測試代碼以及自動化打包部署。
2)模塊化:配置解析,緩存操做,日誌記錄,性能監測,ORM模塊,請求模擬,上下文操做,session。
3)智能化:智能監控,智能router。可監控cpu、memory、goroutine,QPS
缺點:依賴庫多,不利於掌握
使用場景
1. 適合用做服務器端開發,快速開發web服務,支持restful api。
2. 開發的後端服務可做爲微服務的一部分,提供高併發的性能。
3. 可做爲雲平臺的開發框架,目前國內不少雲平臺採用beego開發。
4. 開發的服務也能夠用來進行分佈式部署。
5. 能夠開發高性能網關,提供高效路由功能。
6. 開發的服務支持生成docker鏡像,使用docker容器部署。
【小結】經過上述介紹,能夠看出Beego框架使用簡單,快速開發很是方便,提供多個模塊工具,智能監控,智能路由。依託於golang語言有着高效的性能,Beego可用於微服務、分佈式、網關接入等場景開發,徹底能夠替代springboot進行項目快速開發。
【備註】本文參考自beego官網,地址:https://beego.me/docs/intro/
關於做者:十月,現任普元西安研發中心資深開發工程師,擅長Java、golang、大數據、雲計算等領域技術;對公有云、混合雲、微服務架構有着濃厚的興趣。
關於EAWorld:微服務,DevOps,數據治理,移動架構原創技術分享。長按二維碼關注!css