天天看點

go post 參數_Beego:簡約 & 強大并存的 Go 應用架構

go post 參數_Beego:簡約 & 強大并存的 Go 應用架構
go post 參數_Beego:簡約 & 強大并存的 Go 應用架構

轉載本文需注明出處:微信公衆号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 嵌入等)而設計的一個架構。

go post 參數_Beego:簡約 & 強大并存的 Go 應用架構

Beego是基于八大獨立的子產品之上建構的,是一個高度解耦的架構。當初設計Beego的時候就是考慮功能子產品化,使用者即使不使用Beego的http邏輯,也是可以使用其他獨立子產品,例如你可以使用cache子產品來做你的緩存邏輯,使用logs子產品來記錄你的操作資訊,使用config子產品來解析你各種格式的檔案,使用orm操作資料庫等。各個子產品就類似積木,堆積起來就是功能強大的Beego架構。

go post 參數_Beego:簡約 & 強大并存的 Go 應用架構

運作邏輯可以拆分以下幾段: 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,然後通過指令行進行編譯并執行: 啟動之後打開http://127.0.0.1:8080浏覽器顯示“hello world” 代碼詳解: 1、首先引入了包github.com/astaxie/beego, beego包中會初始化一個BeeAPP的應用,初始化一些參數。 2、定義Controller,這裡定義了一個struct為MainController,充分利用了Go語言的組合的概念,匿名包含了beego.Controller,這樣MainController就擁有了beego.Controller的所有方法。 3、定義RESTFul方法,通過匿名組合之後,MainController已經擁有了Get、Post、Delete、Put等方法,這些方法是分别用來對應使用者請求的Method函數,如果使用者發起的是POST請求,那麼就執行Post函數。是以這裡我們定義了MainController的Get方法用來重寫繼承的Get函數,這樣當使用者GET請求的時候就會執行該函數。 4、定義main函數,所有的Go應用程式和C語言一樣都是Main函數作為入口,是以這裡定義應用的入口。 5、Router注冊路由,路由就是告訴beego,當使用者來請求的時候,該如何去調用相應的Controller,這裡注冊了請求/的時候,請求到MainController。需注意,Router函數的兩個參數函數,第一個是路徑,第二個是Controller的指針。 6、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目錄結構 Beego架構是一個典型的mvc架構。M(models 目錄)、V(views 目錄)和 C(controllers 目錄)的結構。 路由設定

go post 參數_Beego:簡約 & 強大并存的 Go 應用架構

路由的主要功能是實作從請求位址到實作的方法,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= 123beego.Router("/news/:all", &controllers.RController{})全比對方式 //比對 /news/path/to/123.html :all= path/to/123.htmlbeego.Router("/user/:username([\w]+)", &controllers.RController{})正則字元串比對 //比對 /user/astaxie :username = astaxiebeego.Router("/download/*.*", &controllers.RController{})*比對方式 //比對 /download/file/api.xml :path= file/api :ext=xmlbeego.Router("/download/ceshi/*", &controllers.RController{})*全比對方式 //比對 /download/ceshi/file/api.json :splat=file/api.jsonbeego.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入口函數中設定如下: 或者通過配置檔案配置如下: 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對象具有如下方法: 但是我還是建議大家采用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是隻儲存檔案的目錄,如下所示: 當SessionProvider為mysql時,SessionSavePath是連結位址,采用go-sql-driver,如下所示: (左右滑動檢視全部代碼) 當SessionProvider為redis時,SessionSavePath是redis的連結位址,采用了redigo,如下所示: Cache子產品 Beego内置了一個cache子產品,實作了類似memcache的功能,緩存資料在記憶體中。 通過beego.NewBeeCache初始化一個對象,然後設定過期時間,開啟過期檢測,在業務邏輯中就可以通過如下的接口進行增删改的操作: (左右滑動檢視全部代碼) 例子:

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中,你可以通過如下的方式設定自己的輸出: 可以通過下面的方式設定不同的日志分級: 日志等級的排序如下: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 = beepkghttpaddr = "127.0.0.1"httpport = 9090runmode ="dev"autorender = falseautorecover = falseviewspath = "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架構優勢

go post 參數_Beego:簡約 & 強大并存的 Go 應用架構

優點:

1)使用簡單:通過指令行建立beego項目;監控代碼修改進行熱編譯;自動化測試代碼以及自動化打包部署。

2)子產品化:配置解析,緩存操作,日志記錄,性能監測,ORM子產品,請求模拟,上下文操作,session。

3)智能化:智能監控,智能router。可監控cpu、memory、goroutine,QPS

缺點:依賴庫多,不利于掌握

使用場景

go post 參數_Beego:簡約 & 強大并存的 Go 應用架構

1. 适合用作伺服器端開發,快速開發web服務,支援restful api。

2. 開發的後端服務可作為微服務的一部分,提供高并發的性能。

3. 可作為雲平台的開發架構,目前國内很多雲平台采用beego開發。

4. 開發的服務也可以用來進行分布式部署。

5. 可以開發高性能網關,提供高效路由功能。

6. 開發的服務支援生成docker鏡像,使用docker容器部署。

【小結】通過上述介紹,可以看出Beego架構使用簡單,快速開發非常友善,提供多個子產品工具,智能監控,智能路由。依托于golang語言有着高效的性能,Beego可用于微服務、分布式、網關接入等場景開發,完全可以替代springboot進行項目快速開發。

【備注】本文參考自beego官網,位址:https://beego.me/docs/intro/

精選提問:

問1:能列出下常用的架構和庫嗎?

答:go web架構:Beego Buffalo  Echo Gin Iris Revel;golang:常用庫請參考golang中文網:https://studygolang.com/articles/14828?fr=sidebar

問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。

推薦閱讀

如何統一服務調用架構?

應用基礎架構之權限控制

應用基礎架構全面解析

go post 參數_Beego:簡約 & 強大并存的 Go 應用架構

關于作者:十月,現任普元西安研發中心資深開發工程師,擅長Java、golang、大資料、雲計算等領域技術;對公有雲、混合雲、微服務架構有着濃厚的興趣。

go post 參數_Beego:簡約 & 強大并存的 Go 應用架構

關于EAWorld:微服務,DevOps,資料治理,移動架構原創技術分享。長按二維碼關注!

go post 參數_Beego:簡約 & 強大并存的 Go 應用架構

在看點這裡

go post 參數_Beego:簡約 & 強大并存的 Go 應用架構