Beego:簡約 & 強大並存的 Go 應用框架
引言:
目錄:
1. Beego框架架構介紹
2. Beego框架專案結構
3. Beego框架優勢
1. Beego框架架構介紹
執行邏輯可以拆分以下幾段:
1. main檔案監聽啟動埠接收請求。
2. 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
├── 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中封裝了Controller,所以路由是從路徑到ControllerInterface的過程,ControllerInterface的方法有如下:
type ControllerInterface interface { Init(ct *Context, cn string) Prepare() Get() Post() Delete() Put() Head() Patch() Options() Finish() Render() error }
使用者可以透過如下的方式進行路由設定:
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]+)
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 }
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" }
sess:=this.StartSession() defer sess.SessionRelease()
sess物件具有如下方法:
sess.Set() sess.Get() sess.Delete() sess.SessionID()
當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"
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.SetLogger(*log.Logger)
beego.SetLevel(beego.LevelError)
不同級別的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:
-PostgreSQL:
-Sqlite3:
beego-orm的相關特性:
- 支援 Go 的所有型別儲存
- 輕鬆上手,採用簡單的 CRUD 風格
- 自動 Join 關聯表
- 跨資料庫相容查詢
- 允許直接使用 SQL 查詢/對映
- 嚴格完整的測試保證 ORM 的穩定與健壯
示例請參考beego官方:
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官網,地址:
精選提問:
問1:能列出下常用的框架和庫嗎?
問2:請問beego後續有計劃增加哪些新的特性麼?
答:目前來看,beego沒有新的特性推出,旨在bug維護和框架穩定性。
問3:這種框架和gin區別是什麼?優勢是什麼?beego本身整合了很多,有種大而全,卻不精,每個功能點cover住的場景有限,還不如藉助第三方來的高效,簡單。
答:(1)Beego支援完整的mvc,Gin不支援完整的mvc。
(2) 路由:Beego支援完整正則路由,Gin不支援。
(3) Beego在業務方面較Gin支援更多(Beego有多模組封裝,且支援單獨模組獨立使用,構建專案更加方便)
(4) Gin在效能方面較Beego更好(遇到效能瓶頸適合使用Gin)
誠然Beego在效能方面確實不能和Gin比,但是在複雜業務轉化為專案時更加方便,而Gin實現業務邏輯需要更多的程式碼和庫引用。根據具體業務和效能選擇適合自己的框架或庫。
問4:能比較一下beego 和 go-restful 嗎?
答:go-resful功能單一旨在提供高效的路由分發和restful訪問,而此功能只是beego一個模組的功能,如果只是想單純的路由轉發和高的訪問效能,建議使用go-restful,如果專案有複雜的業務且符合mvc模型,建議使用beego。
關於作者:十月,現任普元西安研發中心資深開發工程師,擅長Java、golang、大資料、雲端計算等領域技術;對公有云、混合雲、微服務架構有著濃厚的興趣。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562043/viewspace-2665016/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 01 . Go框架之Beego簡介部署及程式流程分析Go框架
- 輕鬆搭建基於 Serverless 的 Go 應用(Gin、Beego 舉例)ServerGo
- Go 介面:Go中最強大的魔法,介面應用模式或慣例介紹Go模式
- 並查集的簡單應用並查集
- 配置supervisor管理beego應用Go
- ent - 一個強大的Go語言實體框架Go框架
- pythontonado框架簡單應用Python框架
- Sublime Text for Mac:簡約而不簡單,功能強大Mac
- bo 框架之 beego 框架 model curd框架Go
- EasyRelation釋出,簡單強大的資料關聯框架框架
- Beego 框架巔峰之路Go框架
- beego框架程式碼分析Go框架
- 簡化 Go 開發:使用強大的工具提高生產力Go
- 強大的Stream並行流並行
- cobra-強大的CLI應用程式庫
- [beego新手入門]基於web框架-beego的RESTful API的構建之旅GoWeb框架RESTAPI
- scrapy框架簡介和基礎應用框架
- Python Web 應用程式 Tornado 框架簡介PythonWeb框架
- beego 開發的部落格 go-blogGo
- Golang 入門系列(十三)用Beego開發web應用GolangWeb
- AppX--強大的macOS應用開發工具APPMac
- Viper:強大的Go配置解析庫Go
- 從庫存管理系統,體驗活字格強大的移動端應用開發能力
- 集合框架(List儲存字串並遍歷)框架字串
- Go實戰專案-Beego的orm的基本使用GoORM
- Go 實現簡易 RPC 框架GoRPC框架
- ollama搭建本地ai大模型並應用呼叫AI大模型
- C# 輕量級 ORM 框架 NPoco 的簡單應用C#ORM框架
- 簡單又強大的SHELL
- 一個超級簡單的 go Web 框架GoWeb框架
- go: 修改應用的名字Go
- Go實現簡單的K-V儲存Go
- Android之五大應用開發框架Android框架
- RxRouter -- 一個輕量級、簡單、智慧並且強大的安卓路由庫安卓路由
- 直播平臺製作,支援其他應用開啟,接收其他應用檔案並儲存
- Pocket cleaner Pro for Mac 功能強大的系統清理應用Mac
- Beego(簡介、配置、路由、日誌)Go路由
- Snow——簡單易用的 Go 語言業務框架Go框架