簡要說說開發一個go web站點,咱們須要掌握哪些技能?準備哪些技術點?css
一個好的框架能提高你的開發效率,也有益於團隊合做。iris自稱是最快的goweb框架,快不快咱們要測試了才知道,可是看了支撐對比,iris目前是最豐富的。html
咱們選用mysql,關係型數據庫的主流。另外要選擇一個orm框架,對於大多數的業務開發,手寫sql語句的方式未免太懷舊了,這裏推薦xorm,他提供了自動映射的工具。前端
非關係型緩存數據庫,對於一個合格的站點,緩存必不可少,能減小數據庫壓力,提升訪問速度。咱們選用redis。mysql
雖然go天生支持高併發,可是隨着網站訪問量的不斷增高,單臺服務器始終會成爲瓶頸。另外爲了站點的高可用,免不了分佈式部署。負載均衡咱們選用nginx作反向代理服務器。nginx
一、本文重點介紹web框架內容,使用iris開發一個mvc站點。
二、數據庫操做:《golang 使用xorm操做mysql》
三、緩存數據庫:《golang 操做redis5大數據類型》
四、關於nginx的部署會另起篇幅。git
github地址github
github.com/kataras/iris
若是直接使用go get 命名安裝會有部分包下載不下來,咱們建議使用代理。golang
1.打開CMD命令提示框,設置臨時環境變量web
set GO111MODULE=on set GOPROXY=https://goproxy.io
二、再次執行ajax
go get -v -u github.com/kataras/iris
安裝完成後,GOPATH的src目錄下會多出github.comkatarasiris文件夾,就表明下載成功了。iris下載的問題確實使人頭疼。若是運行過程當中有缺乏什麼零散的bao,能夠直接訪問github.com地址,手動下載後放到github.com文件夾下的對應目錄.
目錄是參照 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 //主函數入口
站點啓用端口,數據庫連接配置等,放在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
main是程序的入口,主要作了一些iris服務監聽啓用前的設置,例如日誌記錄方式、全局錯誤捕獲、視圖模板註冊、靜態文件路徑註冊、路由器註冊等。
全局錯誤捕獲是自定義了一個customRecover
中間件,recover
恐慌,把錯誤記錄下來後,再繼續下一步ctx.Next()
book_dao.go
數據操做,提供了一些經常使用的例子:獲取單條數據、獲取列表、獲取分頁列表、刪除數據、更新數據、新增數據,都是對xrom的使用。業務層不會直接調用dao
,而是經過services
來調用dao
,例如在讀取mysql以前,先在redis查詢是否存在數據,若是存在直接返回,不存在則讀取mysql後再存到redis裏。這樣明確的業務分層便於從此業務的擴展。關於redis的使用,能夠參考前面提到的文章,本文再也不贅述。
BookController包含了2個方法
訪問地址 127.0.0.1:8082/book
func (c *BookController) Get() mvc.Result { service := services.NewBookService() list := service.GetList("", "ID asc", 0) return mvc.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(" bookName like '%"+key+"%'", "ID asc", 0) c.Ctx.JSON(list) }
關於訪問地址呢,mvc爲咱們設定了規則,Get是表示接收請求的方式,咱們能夠把方法名寫成PostAjaxbooks
,那就須要經過post方式請求。後面的Ajaxbooks就是實際的路由地址,用小寫訪問就是/book/ajaxbooks
。
數據視圖必須先通過main
函數的註冊纔可以使用,否則會報找不到視圖的異常。bookLauout.html
是書城的模板,裏面包含前端共用的部分,例如總體的html代碼,底部公用導航等。主內容用{{ yield }}
做爲佔位符。
項目已經發布在github上
https://github.com/imleaf/demo.book.com
book_tb數據表的建立語句
CREATE TABLE `book_tb` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `BookName` varchar(100) DEFAULT '' COMMENT '書名', `State` int(11) DEFAULT '0' COMMENT '狀態', `Author` varchar(50) DEFAULT '' COMMENT '做者', `Press` varchar(100) DEFAULT '' COMMENT '出版社', `PublishTime` datetime DEFAULT NULL COMMENT '出版時間', `BookImage` varchar(300) DEFAULT '' COMMENT '圖書封面', `Price` decimal(10,2) DEFAULT '0.00' COMMENT '售價', `Introduction` varchar(300) DEFAULT '' COMMENT '簡介', `UpdateTime` datetime DEFAULT NULL, `AddTime` datetime DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COMMENT='圖書表';
首頁
搜索結果
demo.book.com項目爲你們舉例了goweb開發的開發模式和框架結構,若是你作過web開發,相信依葫蘆畫瓢,很容易開發一個屬於本身的站點。只要你會go,建立好數據庫,成功運行站點便可順利在本地瀏覽站點。關於goweb項目如何部署到服務器上,如何作負載均衡,關於這塊內容會抽空再寫。
若是本文對你有所幫助,請點個贊。