天天看點

GoFrame v1.0.898 正式版釋出,Go 應用開發架構

從上一次GF架構版本釋出到現在過去了兩個多月的時間,在這期間GF架構做了大量的改進工作。并接連進一步應用到了很多高并發生産環境項目上,如REST服務端(每天千萬級的請求量處理),日志搜集工具(每天單程序處理10+億條的日志資料)。同時也收到了很多朋友的開發建議和issue回報,目前都已經全部解決完善。

GF架構也從beta版本迎來了第一個stable正式版,這是一個偉大的版本。

v1.0.898 stable 

新特性

  1. gf-orm增加sqlite資料庫類型支援( http://gf.johng.cn/database/orm/database );
  2. 增加gkafka子產品,對kafka的用戶端程式封裝,支援分組消費及指定起始位置等特性,并提供簡便易用的API接口( http://gf.johng.cn/database/gkafka/index
  3. 增加go語言最新版本的go modules特性支援;
  4. 增加gcron定時任務子產品( http://gf.johng.cn/os/gcron/index
  5. Web Server增加路由注冊項擷取/列印特性,所有的路由注冊/回調注冊一覽無餘;
  6. 模闆引擎增加全局變量管理,并增加多個常用的内置函數及内置變量( http://gf.johng.cn/os/gview/funcs );
  7. gredis改進為單例操作方式(基于基層連接配接池特性),每次操作redis伺服器時開發者無需顯示調用Close方法執行關閉( http://gf.johng.cn/database/gredis/index
  8. gf-orm增加資料庫操作自動Close特性(基于底層連結池特性),開發者無需再defer db.Close(),并增加g.DB資料庫對象單例别名( http://gf.johng.cn/database/orm/linkop
  9. 增加gvar通用動态變量子產品( http://gf.johng.cn/container/gvar/index
  10. 資料結構容器增加并發安全特性開啟/關閉功能,當關閉後和普通的資料結構無異,且在非并發安全模式下性能會得到提高;
  11. 新增gmlock記憶體鎖子產品( http://gf.johng.cn/os/gmlock/index
  12. 增加gaes算法子產品( http://gf.johng.cn/crypto/gaes/index
  13. gproc子產品增加執行shell指令方法( http://gf.johng.cn/os/gproc/index
  14. 新增gfcache子產品,用于帶自動緩存更新的檔案内容操作(文檔待完善);

新功能

  1. glog增加鍊式操作方法,增加日志級别管理控制、分類管理、調試管理功能;
  2. g.View增加分組名稱設定,支援通過g.*對象管理器擷取多個命名的單例模闆引擎對象;
  3. glog增加對檔案名稱格式的自定義設定,支援gtime日期格式;
  4. gconv增加Ints/Uints/Floats/Interfaces轉換方法;
  5. gjson增加Append方法;
  6. gparser增加NewUnsafe/Append方法;
  7. gcache增加GetOrSet/GetOrSetFunc/GetOrSetFuncLock方法;
  8. gset增加LockFunc/RLockFunc方法;
  9. ghttp.Response方法完善,增加ParseTpl/ParseTplContent/TplContent方法,Template修改為Tpl方法;
  10. ghttp.Request增加擷取使用者真實IP判斷;
  11. Session增加Contains方法;
  12. 完善ghtml子產品,增加多個方法;
  13. gcache新增Contains/SetIfNotExist方法;
  14. gvalid增加Error對象,用以管理校驗錯誤資訊;
  15. gvalid子產品增加struct tag的校驗規則、自定義錯誤提示資訊綁定的支援特性( http://gf.johng.cn/util/gvalid/index
  16. ghttp增加輸入參數與struct的綁定機制,并增加對應params标簽支援( http://gf.johng.cn/net/ghttp/service/handler
  17. ghttp.Request增加服務端BasicAuth功能(文檔待完善);
  18. gvalid增加字段校驗别名,用于自定義傳回結果字段,并更新WebServer中相關使用的子產品;
  19. gf-orm鍊式操作增加ForPage方法,調整Chunks方法;
  20. ghttp對象路由注冊增加Init&Shut自動回調方法,增加重複路由注冊檢測功能;
  21. gfsnotify增加預設遞歸Add/Remove特性;
  22. ghttp.Response增加ServiceFile方法;
  23. 其他一些新功能;

功能改進

  1. 改進ghttp.Server配置管理;
  2. 改進gcache底層對象繼承關系,改進部分設計細節,提高性能;
  3. 改進gfpool檔案指針池,修複部分錯誤,提升性能,并增加基準測試代碼;
  4. 改進gmap系列并發安全map資料結構,增加多個易用性的方法;
  5. 改進gconv.Struct對象轉換功能( http://gf.johng.cn/util/gconv/index
  6. 改進grand随機數生成規則,提供了極高的随機數生成性能,并保證每一次調用随機方法時生成的都是不同的随機數值( http://gf.johng.cn/util/grand/index
  7. 改進gfile檔案内容操作方法,增加若幹常用的檔案内容讀取方法;
  8. 改進gtime子產品,并增加時區轉換方法;
  9. 改進COOKIE,去掉鎖機制;
  10. 改進SESSION擷取方法,新增多個類型擷取方法;
  11. 改進g.DB/g.Config單例緩存鍵名;
  12. 改進gtcp/gudp逾時錯誤判斷機制;
  13. 改進gtype底層統一修改為原子操作;
  14. 改進gvalid對struct的string屬性的預設值非必需校驗;
  15. 改進gvalid在關聯規則下的非必需校驗;
  16. 改進gf-orm在調試模式下日志自動輸出功能;
  17. ghttp.Server/gspath子產品靜态檔案檢索改進;
  18. 優化ghttp.ServerConfig配置,增加struct/method``名稱到uri的轉換規則,通過SetNameToUri方法進行靈活配置( http://gf.johng.cn/net/ghttp/service/object
  19. 改進*any/:name路由比對規則,支援不帶名字的*/:路由規則;
  20. 修改預設配置檔案名稱 config.yml -> config.toml( http://gf.johng.cn/os/gcfg/index
  21. 調整服務注冊的BindControllerMethod及BindObjectMethod邏輯為綁定路由到指定的方法執行;
  22. 改進garray二分查找方法,增加安全操作處理;
  23. 改進gdb.Result/Recorde ToXml方法,增加可選的rootTag參數;
  24. 其他一些改進;

問題修複

  1. 修複ghttp.Server在windows下的重新開機失效問題;
  2. 修複ghttp.Server服務注冊與回調注冊路由重複判斷問題;
  3. 修複garray排序數組Add變參時的死鎖問題;
  4. 修複gfsnotify預設遞歸監控整個gspath.Add添加的目錄的問題;
  5. 修複ghttp.BindParams對@file檔案上傳辨別符的轉義問題;
  6. 修複ghttp.Server日志路徑丢失問題;
  7. 修複多WebServer下的狀态檢測問題;
  8. 修複gvalid子產品min/max校驗問題;
  9. 修複控制器和執行對象服務注冊時綁定'/'路由的問題;
  10. 修複gvalid.CheckStruct自定義錯誤提示失效問題;
  11. ghttp.Server修複hook與serve方法的路由影響,并新增跳轉方法;
  12. 其他一些修複;

其他改動

  1. 去掉gfile.IsExecutable方法;
  2. 目錄調整,将加密/解密相關的包從encoding目錄遷移到crypto目錄下;
  3. 增加gfsnotify/gfcache調試資訊;
  4. gf-orm允許寫入的鍵值為nil時往資料庫中寫入null;
  5. 統一使用gview.Params類型作為模闆變量類型;
  6. gconv.MapToStruct方法名稱修改為gconv.Struct;
  7. ghttp.Server完善重新開機及停止的終端提示資訊;
  8. 完善gring子產品,增加約瑟夫問題代碼作為gring示例程式;
  9. 其他一些改動;

GF(Go Frame)是一款子產品化、松耦合、輕量級、高性能的Go語言Web開發架構。支援熱重新開機、熱更新、多域名、多端口、多服務、HTTP/HTTPS、動态路由等特性 ,并提供了Web服務開發的系列核心元件,如:Router、Cookie、Session、服務注冊、配置管理、模闆引擎、資料校驗、分頁管理、資料庫ORM等等等等, 并且提供了數十個實用開發子產品集,如:緩存、日志、時間、指令行、二進制、檔案鎖、對象池、連接配接池、資料編碼、程序管理、程序通信、TCP/UDP元件、 并發安全容器、Goroutine池等等等等等等。

開源項目位址(倉庫保持實時同步): 

Gitee

Github

。 如有優秀的架構使用案例,歡迎聯系作者将位址展示到項目庫中,您的牛逼将被世人所瞻仰。

安裝

go get -u gitee.com/johng/gf           

限制

golang版本 >= 1.9.2           

特點

  1. 輕量級、高性能,子產品化、松耦合設計,豐富的開發子產品;
  2. 熱重新開機、熱更新特性,并支援Web界面及指令行管理接口;
  3. 專業的技術交流群,完善的開發文檔及示例代碼,良好的中文化支援;
  4. 支援多種形式的服務注冊特性,強大靈活高效的路由控制管理;
  5. 支援服務事件回調注冊功能,可供選擇的pprof性能分析子產品;
  6. 支援配置檔案及模闆檔案的自動檢測更新機制,即修改即生效;
  7. 支援自定義日期時間格式的時間子產品,類似PHP日期時間格式化;
  8. 強大的資料/表單校驗子產品,支援常用的40種及自定義校驗規則;
  9. 強大的網絡通信TCP/UDP元件,并提供TCP連接配接池特性,簡便高效;
  10. 提供了對基本資料類型的并發安全封裝,提供了常用的資料結構容器;
  11. 支援Go變量/Json/Xml/Yml/Toml任意資料格式之間的互相轉換及建立;
  12. 強大的資料庫ORM,支援應用層級的叢集管理、讀寫分離、負載均衡,查詢緩存、方法及鍊式ORM操作;
  13. 更多特點請查閱架構 手冊 源碼

文檔

GoFrame開發文檔:

http://gf.johng.cn

使用

Hello World

package main

import (
    "gitee.com/johng/gf/g"
    "gitee.com/johng/gf/g/net/ghttp"
)

func main() {
    s := g.Server()
    s.BindHandler("/", func(r *ghttp.Request) {
        r.Response.Write("Hello World")
    })
    s.Run()
}           

多域名支援

package main

import (
    "gitee.com/johng/gf/g"
    "gitee.com/johng/gf/g/net/ghttp"
)

func main() {
    s := g.Server()
    s.Domain("localhost1,localhost2").BindHandler("/", func(r *ghttp.Request) {
        r.Response.Write("localhostx")
    })
    s.Run()
}           

多端口支援

package main

import (
    "gitee.com/johng/gf/g"
    "gitee.com/johng/gf/g/net/ghttp"
)

func main() {
    s := g.Server()
    s.BindHandler("/", func(r *ghttp.Request){
        r.Response.Writeln("go frame!")
    })
    s.SetPort(8080, 8081, 8082)
    s.Run()
}           

路由控制

package main

import (
    "gitee.com/johng/gf/g"
    "gitee.com/johng/gf/g/net/ghttp"
)

func main() {
    s := g.Server()
    s.BindHandler("/order/:action/{page}.html", func(r *ghttp.Request){
        r.Response.Writef("action:%s, page:%s", r.Get("action"), r.Get("page"))
    })
    s.SetPort(8199)
    s.Run()
}           

資料庫ORM

ORM建立/關閉

// 擷取預設配置的單例資料庫對象(配置名稱為"default")
db, err := gdb.DB()
// 擷取配置分組名稱為"user-center"的單例資料庫對象
db, err := gdb.DB("user-center")
// 無須顯示Close,資料庫引擎底層采用了連結池設計,當連結不再使用時會自動關閉           

單表/聯表查詢

// 查詢多條記錄并使用Limit分頁
r, err := db.Table("user").Where("u.uid > ?", 1).Limit(0, 10).Select()
// 查詢符合條件的單條記錄(第一條)
r, err := db.Table("user u").LeftJoin("user_detail ud", "u.uid=ud.uid").Fields("u.*,ud.site").Where("u.uid=?", 1).One()
// 查詢指定字段值
r, err := db.Table("user u").RightJoin("user_detail ud", "u.uid=ud.uid").Fields("ud.site").Where("u.uid=?", 1).Value()
// 分組及排序
r, err := db.Table("user u").InnerJoin("user_detail ud", "u.uid=ud.uid").Fields("u.*,ud.city").GroupBy("city").OrderBy("register_time asc").Select()
// 不使用john的聯表查詢
r, err := db.Table("user u,user_detail ud").Where("u.uid=ud.uid").Fields("u.*,ud.city").All()
// 不使用Fields方法指定查詢字段時,預設查詢為"*"
r, err := db.Table("user").Where("u.uid=1",).One()           

更新/删除

// 更新
r, err := db.Table("user").Data(gdb.Map{"name" : "john2"}).Where("name=?", "john").Update()
r, err := db.Table("user").Data("name='john3'").Where("name=?", "john2").Update()
// 删除
r, err := db.Table("user").Where("uid=?", 10).Delete()
// Data數值方法的參數形式比較靈活
r, err := db.Table("user").Data(`name="john"`).Update()
r, err := db.Table("user").Data("name", "john").Update()
r, err := db.Table("user").Data(g.Map{"name" : "john"}).Update()           

寫入/儲存

r, err := db.Table("user").Data(gdb.Map{"name": "john"}).Insert()
r, err := db.Table("user").Data(gdb.Map{"uid": 10000, "name": "john"}).Replace()
r, err := db.Table("user").Data(gdb.Map{"uid": 10001, "name": "john"}).Save()           

事務操作

if tx, err := db.Begin(); err == nil {
    if r, err := tx.Table("user").Data(gdb.Map{"uid":1, "name": "john"}).Save(); err == nil {
        tx.Commit()
    } else {
        tx.Rollback()
    }

    fmt.Println(r, err)
}           

...

本文來自雲栖社群合作夥伴“開源中國”

本文作者:johng-cn 

原文連結 http://gf.johng.cn/