iris mvc + xorm,Go Web站點開發。(含完整原始碼)

文章推薦指數: 80 %
投票人數:10人

前言. 簡要說說開發一個go web站點,我們需要掌握哪些技能?準備哪些技術點? 1、web框架. 一個好的框架能提升你的開發效率,也有益於團隊合作。

iris ... MdEditor irismvc+xorm,GoWeb站點開發。

(含完整原始碼) 語言:CN/TW/HK 時間 2020-04-1409:55:29 Go語言中文網 主題: 資料庫 MVC模式 GoWeb 前言 簡要說說開發一個goweb站點,我們需要掌握哪些技能?準備哪些技術點? 1、web框架 一個好的框架能提升你的開發效率,也有益於團隊合作。

iris自稱是最快的goweb框架,快不快我們要測試了才知道,但是看了支撐對比,iris目前是最豐富的。

2、資料庫操作 我們選用mysql,關係型資料庫的主流。

另外要選擇一個orm框架,對於大多數的業務開發,手寫sql語句的方式未免太懷舊了,這裡推薦xorm,他提供了自動對映的工具。

3、快取資料庫 非關係型快取資料庫,對於一個合格的站點,快取必不可少,能減少資料庫壓力,提高訪問速度。

我們選用redis。

4、負載均衡 雖然go天生支援高併發,但是隨著網站訪問量的不斷增高,單臺伺服器始終會成為瓶頸。

另外為了站點的高可用,免不了分散式部署。

負載均衡我們選用nginx做反向代理伺服器。

本文重點 1、本文重點介紹web框架內容,使用iris開發一個mvc站點。

2、資料庫操作:《golang使用xorm操作mysql》 3、快取資料庫:《golang操作redis5大資料型別》 4、關於nginx的部署會另起篇幅。

iris安裝 github地址 github.com/kataras/iris 如果直接使用goget命名安裝會有部分包因為翻牆問題下載不下來,我們可以使用GOPROXY,設定代理。

1.開啟CMD命令提示框,設定臨時環境變數 setGO111MODULE=on setGOPROXY=https://goproxy.io 2、再次執行 goget-v-ugithub.com/kataras/iris 安裝完成後,GOPATH的src目錄下會多出github.com\kataras\iris資料夾,就代表下載成功了。

iris下載的翻牆問題確實令人頭疼,關於GOPROXY的使用當初我也是折騰了好久才成功。

如果執行過程中有缺少什麼零散的bao,可以直接訪問github.com地址,手動下載後放到github.com資料夾下的對應目錄. 建立iris專案結構 目錄是參照github.com/kataras/iris/_examples 下的例子,根據實用性,做了些調整。

demo.book.com ——conf//配置相關的放在此目錄 ——sysconf.go//配置讀取程式碼 ——web.config//自定義文字配置 ——dao ——book_dao.go//book表的xorm操作程式碼 ——dbsource ——dbsource.go//資料引擎,單例模式 ——log ——2020 ——04 ——2020-04-12.log//站點日誌,按日期儲存 ——models ——goxorm//非站點使用,用於生成對映類的工具 ——book_tb.go//xorm根據資料庫自動生成的對映類 ——services ——book_service.go//業務操作類,呼叫的是book_dao.go,可以根據實際業務增加額外程式碼,例如從快取讀取資料等。

——web ——content//存放站點靜態資源,css、image、js等 ——mould ——book ——controllers ——BookController.go//書城業務控制器 ——DemoController.go//一些輔助demo控制器,測試用 ——views//檢視程式碼 ——book ——home.html ——shared ——bookLayout.html//書城模板頁 ——main.go//主函式入口 要點說明: 1、web.config,文字配置檔案 站點啟用埠,資料庫連結配置等,放在web.config中。

go的配置檔案的讀取還有一些專門的開源庫,例如toml、yaml等。

但我個人覺得還是這種key=value的設定簡單易用。

web.config其實就算是一個文字檔案,通過sysconf.go來讀取後存到全域性的SysConfMap 裡。

如果站點的自定義文字配置有修改,可以呼叫sysconf.ReLoad() 來重新讀取,這樣不需要重啟站點即可生效。

//服務配置 domain= port=8082 //資料庫配置 dbuser=root dbpwd=112233 dbhost=127.0.0.1 dbport=3305 dbname=mygo 2、main.go,主函式 main是程式的入口,主要做了一些iris服務監聽啟用前的設定,例如日誌記錄方式、全域性錯誤捕獲、檢視模板註冊、靜態檔案路徑註冊、路由器註冊等。

全域性錯誤捕獲是自定義了一個customRecover 中介軟體,recover 恐慌,把錯誤記錄下來後,再繼續下一步ctx.Next() 3、dao資料庫操作類 book_dao.go 資料操作,提供了一些常用的例子:獲取單條資料、獲取列表、獲取分頁列表、刪除資料、更新資料、新增資料,都是對xrom的使用。

業務層不會直接呼叫dao ,而是通過services 來呼叫dao ,例如在讀取mysql之前,先在redis查詢是否存在資料,如果存在直接返回,不存在則讀取mysql後再存到redis裡。

這樣明確的業務分層便於今後業務的擴充套件。

關於redis的使用,可以參考前面提到的文章,本文不再贅述。

4、BookController,業務控制器 BookController包含了2個方法 一個是首頁檢視的訪問。

訪問地址127.0.0.1:8082/book func(c*BookController)Get()mvc.Result{ service:=services.NewBookService() list:=service.GetList("","IDasc",0) returnmvc.View{ Name:"book/home.html", Data:iris.Map{ "Title":"首頁-"+conf.SysConfMap["port"], "List":list, "Server":conf.SysConfMap["port"], }, Layout:"shared/bookLayout.html", } } 程式碼做了很簡單的事情,獲取book_tb資料列表展示。

返回檢視地址book/home.html ,conf.SysConfMap["port"] 是獲取站點監聽的埠,展示到首頁是為了搭建負載均衡的時候直觀的可以看到訪問到哪一臺伺服器。

另一個是搜尋資料介面。

首頁輸入搜尋關鍵字通過ajax非同步調用搜索介面,返回json資料,用js展示搜尋結果。

訪問地址127.0.0.1:8082/book/ajaxbooks?key=go func(c*BookController)GetAjaxbooks(){ //獲取url引數 key:=c.Ctx.URLParam("key") service:=services.NewBookService() list:=service.GetList("bookNamelike'%"+key+"%'","IDasc",0) c.Ctx.JSON(list) } 關於訪問地址呢,mvc為我們設定了規則,Get是表示接收請求的方式,我們可以把方法名寫成PostAjaxbooks ,那就需要通過post方式請求。

後面的Ajaxbooks就是實際的路由地址,用小寫訪問就是/book/ajaxbooks 。

5、views,資料檢視 資料檢視必須先經過main 函式的註冊才可使用,不然會報找不到檢視的異常。

bookLauout.html 是書城的模板,裡面包含前端共用的部分,例如整體的html程式碼,底部公用導航等。

主內容用{{yield}} 作為佔位符。

6、專案原始碼 專案已經發布在github上 https://github.com/imleaf/demo.book.com book_tb資料表的建立語句 CREATETABLE`book_tb`( `ID`int(11)NOTNULLAUTO_INCREMENT, `BookName`varchar(100)DEFAULT''COMMENT'書名', `State`int(11)DEFAULT'0'COMMENT'狀態', `Author`varchar(50)DEFAULT''COMMENT'作者', `Press`varchar(100)DEFAULT''COMMENT'出版社', `PublishTime`datetimeDEFAULTNULLCOMMENT'出版時間', `BookImage`varchar(300)DEFAULT''COMMENT'圖書封面', `Price`decimal(10,2)DEFAULT'0.00'COMMENT'售價', `Introduction`varchar(300)DEFAULT''COMMENT'簡介', `UpdateTime`datetimeDEFAULTNULL, `AddTime`datetimeDEFAULTNULL, PRIMARYKEY(`ID`) )ENGINE=MyISAMAUTO_INCREMENT=27DEFAULTCHARSET=utf8COMMENT='圖書表'; 總結 demo.book.com專案為大家舉例了goweb開發的開發模式和框架結構,如果你做過web開發,相信依葫蘆畫瓢,很容易開發一個屬於自己的站點。

只要你會go,建立好資料庫,成功執行站點即可順利在本地瀏覽站點。

關於goweb專案如何部署到伺服器上,如何做負載均衡,關於這塊內容會抽空再寫。

如果本文對你有所幫助,請點個贊。

「其他文章」 go執行指令碼命令原始碼分析 Go需要列舉沒?如何實現? MySQL連線數過多的處理方法合集-Toomanyconnections-卡拉雲 聊聊TokenBucket限流器的基本原理及實現 為什麼可重入鎖是沒有必要的 MySQL「Everyderivedtablemusthaveitsownalias」錯誤修復方法 lancet:一個全面、高效、可複用的go語言工具函式庫 我給”Go語言“開發了6個線上工具 Golang日誌美化輸出-ketty 如何使用Workbench遠端連線到MySQL資料庫-MySQLWorkbench使用教程 go二分查詢 Protobuf為啥比JSON、XML牛? Go時區Parse的坑 go-python3使用指南與踩坑記錄 【OpenIM原創】uni-app使用之初始化會話訊息好友監聽器 Gohttphandler統一響應&異常處理 Go實戰:構建漂亮的CLI應用程式 Go常見錯誤集錦|字串底層原理及常見錯誤 Can'tConnecttoMySQLServeronIPAddress(10061)錯誤的解決方案 如何使用MySQL慢查詢日誌進行效能優化-Profiling、mysqldumpslow例項詳解 「資料庫」 叮咚買菜自建MongoDB上騰訊雲實踐 快取,原來我們一直都用錯了! 2021年12月國產資料庫排行榜:openGauss節節攀升拿下榜眼,GaussDB與TDSQL你爭我奪各進一位 MyBatisGenerator程式碼自動生成器,從此解放你的雙手 OceanBaseCTO楊傳輝:資料庫集中式與分散式一體化設計才是核心系統替代的未來 頻頻闖禍的JNDI,到底是個什麼垃圾玩意兒? 專案開發中,真的有必要定義VO,BO,PO,DO,DTO這些嗎? 為餘勢負天工背,雲原生記憶體資料庫Tair助力使用者體驗優化 "我的"職業規劃 Datadog——Monitorasaservice 「MVC模式」 記一次.NET某化妝品webapi卡死分析 mvc中常見的屬性驗證 一篇學會攔截器的騷操作 iOS架構模式(MVC/MVCS/MVP/MVVM/VIPER) Flux架構思想在度咔App中的實踐 從MVC到使用ASP.NETCore6.0的最小API 實現一個基於IConfiguration的低配版FeatureFlag iOS設計模式淺析MVC、MVP、MVVM VUE自學日誌01-MVC和MVVM 利用MVC設計模式構建GUI(PyQt5版)



請為這篇文章評分?